Java 对不同类型的数据文件的读写操作整合器[JSON,XML,CSV]-[经过设计模式改造](2020年寒假小目标03)

日期:2020.01.16

博客期:125

星期四

  

    我想说想要构造这样一个通用文件读写器确实不容易,嗯~以后会添加更多的文件类型,先来熟悉一下文件内容样式:  

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beangroup>
3     <javabean>
4         <data name=‘code‘>A001</data>
5         <data name=‘name‘>张三</data>
6     </javabean>
7 </beangroup>

XML文件类型

{
  list:[
        {
          code:"A001",
          name:"张三"
        }
    ]
}

JSON文件类型

code,name
A001,张三

CSV文件类型

【此处预留给未来添加的文件类型】

    我所需要的基本功能是对表型数据的读写,这一点对于CSV这一种标准表形式的文件来说,构造它轻而易举,也没什么难度!而对于JSON和XML来说很难,其实JSON和XML是可以相互转换的,或者说这二者可以等价,毕竟JSON对应属性和XML对应标签属性如出一辙!而XML的标签内部内容刚好对应JSON里的具体内容!

    好了话不多说,赶紧加代码:

  com.filedeal包:

 1 package com.filedeal;
 2
 3 import java.io.File;
 4
 5 import com.dblink.bean.BeanGroup;
 6
 7 public interface FileControler {
 8     //---[set、get方法]
 9     //设置文件信息
10     void setFile(File file);
11     //获取处理的文件信息
12     File getFile();
13     //---[类与对象方法]
14     //释放
15     void free();
16     //重新设置
17     void reset();
18     //表型数据植入
19     public void setUnderprinted(BeanGroup bg);
20     //表型数据获取
21     public BeanGroup getUnderprinted();
22 }

FileControler.java

 1 package com.filedeal;
 2
 3 import com.dblink.bean.BeanGroup;
 4 import com.dblink.bean.JavaBean;
 5 import com.filedeal.csv.CSVFileDealer;
 6
 7 public class FileControlerTest {
 8     public static void main(String[] args) {
 9         BeanGroup bg = new BeanGroup();
10         JavaBean jb1 = new JavaBean();
11         jb1.add("序号");
12         jb1.add("名称");
13         jb1.add("性别");
14         JavaBean jb2 = new JavaBean();
15         jb2.add(1);
16         jb2.add("张三");
17         jb2.add("男");
18         JavaBean jb3 = new JavaBean();
19         jb3.add(2);
20         jb3.add("李四");
21         jb3.add("女");
22         bg.add(jb1);
23         bg.add(jb2);
24         bg.add(jb3);
25         CSVFileDealer csv = new CSVFileDealer("src/testFiles/art.csv");
26         csv.setUnderprinted(bg);
27         csv.free();
28     }
29 }

FileControlerTest.java

  com.filedeal.csv包:

  1 package com.filedeal.csv;
  2
  3 import java.io.BufferedWriter;
  4 import java.io.File;
  5 import java.io.FileNotFoundException;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8 import java.io.OutputStreamWriter;
  9 import java.io.PrintWriter;
 10 import java.io.UnsupportedEncodingException;
 11 import java.util.Scanner;
 12
 13 import com.dblink.bean.BeanGroup;
 14 import com.dblink.bean.JavaBean;
 15 import com.filedeal.FileControler;
 16
 17 public class CSVFileDealer implements FileControler {
 18     protected File file;
 19     @Override
 20     public void setFile(File file) {
 21         this.file = file;
 22     }
 23     @Override
 24     public File getFile() {
 25         return file;
 26     }
 27     @Override
 28     public void free() {
 29         // Do Nothing ...
 30     }
 31     @Override
 32     public void reset() {
 33         String name = this.file.getName();
 34         this.free();
 35         this.file = new File(name);
 36     }
 37     //---[数据处理]
 38     //设置数据集合
 39     @Override
 40     public void setUnderprinted(BeanGroup bg) {
 41         try {
 42             if(!file.exists())
 43                 return;
 44             PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"GB2312")));
 45             int leng = bg.size();
 46
 47             for(int i=0;i<leng;++i)
 48             {
 49                 JavaBean jb = bg.get(i);
 50                 String str = "";
 51
 52                 int leng_s = jb.size();
 53
 54                 for(int j=0;j<leng_s;++j)
 55                 {
 56                     String tmp = jb.get(j).toString();
 57                     if(j==0)
 58                         str += tmp;
 59                     else
 60                         str += ","+tmp;
 61                 }
 62
 63                 pw.println(str);
 64             }
 65
 66             pw.close();
 67         } catch (FileNotFoundException e) {
 68             e.printStackTrace();
 69         } catch (UnsupportedEncodingException e) {
 70             e.printStackTrace();
 71         }
 72     }
 73     //获取数据集合
 74     @Override
 75     public BeanGroup getUnderprinted(){
 76         BeanGroup bg = new BeanGroup();
 77         try {
 78             if(!this.file.exists())
 79                 return bg;
 80             Scanner sc = new Scanner(this.file);
 81             while(sc.hasNextLine())
 82             {
 83                 String str = sc.nextLine();
 84                 String [] sg = str.split(",");
 85
 86                 JavaBean jb = new JavaBean();
 87
 88                 int leng = sg.length;
 89
 90                 for(int i=0;i<leng;++i)
 91                 {
 92                     String tmp = sg[i];
 93                     jb.add(tmp);
 94                 }
 95
 96                 bg.add(jb);
 97             }
 98             sc.close();
 99         } catch (FileNotFoundException e) {
100             e.printStackTrace();
101         }
102         return bg;
103     }
104     //---[构造方法]
105     public CSVFileDealer(String filePath){
106         super();
107         this.file = new File(filePath);
108         if(!this.file.exists())
109         {
110             try {
111                 this.file.createNewFile();
112             } catch (IOException e) {
113                 e.printStackTrace();
114             }
115         }
116     }
117     public CSVFileDealer(File file){
118         super();
119         this.file = file;
120         if(!this.file.exists())
121         {
122             try {
123                 this.file.createNewFile();
124             } catch (IOException e) {
125                 e.printStackTrace();
126             }
127         }
128     }
129 }

CSVFileDealer.java

【此处预留给未来添加的文件类型】

    实现类图:

      类图博主正在快马加鞭的绘制... ...

    所用设计模式:

  1、策略模式:我发现这个模式真好用,而且简单,而且好用,嗯!针对文件处理不同的文件类型采取不一样的策略

  2、模板方法模式:文件的读写操作算是基本的模板方法!

  3、代理模式:嗯~要想json和xml的数据源完成读写事先需要调用ReadableTable类的方法进行数据整理,这一部分方法被封装在代理类里面,也可以不做数据处理,这正是代理模式的初衷!

    

原文地址:https://www.cnblogs.com/onepersonwholive/p/12203688.html

时间: 2024-11-09 10:04:17

Java 对不同类型的数据文件的读写操作整合器[JSON,XML,CSV]-[经过设计模式改造](2020年寒假小目标03)的相关文章

Java 使用 JDBC 连接数据库的代码整合[MySql、SqlServer、Oracle]-[经过设计模式改造](2020年寒假小目标01)

2020.01.08 博客期:121 星期三 今天对过去整个大二和大三用到的数据库的方法进行汇总,可以有效的使用.套用,每一个部分都有<软件设计模式>知识,上述代码满足了开闭原则,如果要使用此代码,只需添加数据类继承已经写好的类就可以了,无需修改. 开发项目中,项目整体结构:    [小编网不好,图传不上去,到时候,补上] 类图: [小编网不好,图传不上去,到时候,补上] 源码: com.dblink.basic.sqlkind 包: 1 package com.dblink.basic.sq

Java中double类型的数据精确到小数点后两位

Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 二: new java.text.DecimalFormat("#.00").format(3.1415926) 三: double d = 3.1415926

IO流文件的读写操作

字符流有两个抽象类:Writer   Reader.其对应子类FileWriter,FileReader可实现文件的读写操作 同样,字节流也有两个抽象类:InputStream OutputStream.其对应子类有FileInputStream,FileOutputStream可实现文件读写 IO流中的重要方法:read()方法返回-1,readLine方法返回null.用法列如:while((line=br.readLine())!=null).Scanne类中的hasNext()方法如果此

File --文件的读写操作

File --文件的读写操作------------------- 1. 通过数组实现对一组数据的写入 1 package day01; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5 import java.io.RandomAccessFile; 6 7 /** 8 * 批量写入一组字节 9 * @author Administrator 10 * 11 */ 12 public class

Java学习笔记——File类之文件管理和读写操作、下载图片

Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图片 文件和文件夹 相关函数 (boolean) mkdir() 创建此抽象路径名指定的目录  (boolean) mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录. (boolean) delete() 删除此抽象路径名表示的文件或目录 (boolean) createNe

C# 运用StreamReader类和StreamWriter类实现文件的读写操作

对文件的读写操作应该是最重要的文件操作,System.IO命名空间为我们提供了诸多文件读写操作类,在这里我要向大家介绍最常用也是最基本的StreamReader类和StreamWriter类.从这两个类的名称我们不难发现它们都是基于流的读写操作类. 我们可以通过File类的OpenText()方法来获取一个StreamReader对象,通过该对象我们可以实现对文本文件的读操作,方法如下:  Console.WriteLine("Reading the contents from the file

(六)kernel中文件的读写操作可以使用vfs_read()和vfs_write

需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() filp_close(), vfs_read() vfs_write(),set_fs(),get_fs()等,这些函数在linux/fs.h和asm/uaccess.h头文件中声明.下面介绍主要步骤 1. 打开文件 filp_open()在kernel中可以打开文件,其原形如下: strcut file

linux下文件的读写操作(openreadwrite)

linux下文件的读写操作(openreadwrite) 转 http://www.2cto.com/os/201403/285837.html open(打开文件) 相关函数 read,write,fcntl,close,link,stat,umask,unlink,fopen 表头文件 #include<sys/types.h>#include<sys/stat.h>#include<fcntl.h> 定义函数 int open( const char * path

使用shell脚本简单模拟对特定文件同时读写操作

使用shell脚本简单模拟对特定文件同时读写操作文件内容的格式:field1    ,       field2    , field3    ,       field4以,为分隔符,但是存在空格. 脚本用法如下: ./check_write_read.sh 10 输出结果: Thu Apr 27 19:59:44 CST 2017:Read operation finished 670 Thu Apr 27 19:59:44 CST 2017:Write operation finished