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类的方法进行数据整理,这一部分方法被封装在代理类里面,也可以不做数据处理,这正是代理模式的初衷!

    

猜你喜欢

转载自www.cnblogs.com/onepersonwholive/p/12203688.html