Java字节与字符流永久存储json数据
使用第三方json转换工具,阿里巴巴json转换工具Fastjson1.2.7。
https://www.nhooo.com/softs/530842.html
注意:jar包的导入不再赘述,详见百度。
User类,定义两种属性,并创建构造方法与get和set方法
publicclassUser{ publicStringuserName;//名字 publicdoublebalance;//金额 publicUser(){ super(); } publicUser(StringuserName,doublebalance){ super(); this.userName=userName; this.balance=balance; } publicStringgetUserName(){ returnuserName; } publicvoidsetUserName(StringuserName){ this.userName=userName; } publicdoublegetBalance(){ returnbalance; } publicvoidsetBalance(doublebalance){ this.balance=balance; } }
字节流的方式存储json数据到txt文件
importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.util.ArrayList; importjava.util.List; importcom.alibaba.fastjson.JSON; publicclassListFile{ publicstaticvoidmain(String[]args){ Listlist=newArrayList<>(); list.add(newUser("张三",100)); list.add(newUser("张四",200)); list.add(newUser("张五",300)); Filefile=newFile("D:/uselist.txt");//存储的目标文件 FileOutputStreamfos=null; BufferedOutputStreambos=null; try{ fos=newFileOutputStream(file); bos=newBufferedOutputStream(fos); Stringjson=JSON.toJSONString(list);//对象转换为json bos.write(json.getBytes("utf-8"));//json字符串写入文件 bos.flush(); System.out.println("json数据写入完成"); } catch(Exceptione){ e.printStackTrace(); } finally{ try{ fos.close(); bos.close(); } catch(Exceptione){ e.printStackTrace(); } } //读取文件内容,并在控制台输出 Stringstr=""; intnum=0; FileInputStreamfis=null; BufferedInputStreambis=null; bytebuff[]=newbyte[1024]; try{ fis=newFileInputStream(file); bis=newBufferedInputStream(fis); while((num=bis.read(buff))!=-1){ str+=newString(buff,"utf-8"); } System.out.println(str);//打印读取文件的json字符串 } catch(Exceptione){ e.printStackTrace(); } finally{ try{ fis.close(); bis.close(); } catch(Exceptione){ e.printStackTrace(); } } //把读取到的json数据再转为对象,并在控制台输出 list=JSON.parseArray(str.trim(),User.class);//读取到的json数据存在空格,trim方法去除 for(Userobj:list){ System.out.println(obj.getUserName()+"\t"+obj.getBalance()); } } }
字符流的方式存储json数据到txt文件
importjava.io.BufferedReader; importjava.io.BufferedWriter; importjava.io.File; importjava.io.FileReader; importjava.io.FileWriter; importjava.util.ArrayList; importjava.util.List; importcom.alibaba.fastjson.JSON; publicclassListFile{ publicstaticvoidmain(String[]args){ Listlist=newArrayList<>(); list.add(newUser("张三",100)); list.add(newUser("张四",200)); list.add(newUser("张五",300)); Filefile=newFile("D:/uselist.txt");//存储的目标文件 FileWriterfw=null; BufferedWriterbw=null; try{ fw=newFileWriter(file); bw=newBufferedWriter(fw); Stringjson=JSON.toJSONString(list);//对象转换为json bw.write(json);//json字符串写入文件 bw.flush(); System.out.println("json数据写入完成"); } catch(Exceptione){ e.printStackTrace(); } finally{ try{ bw.close(); fw.close(); } catch(Exceptione){ e.printStackTrace(); } } //读取文件内容,并在控制台输出 Stringstr=""; Strings=""; FileReaderfr=null; BufferedReaderbr=null; try{ fr=newFileReader(file); br=newBufferedReader(fr); while((s=br.readLine())!=null){ str+=s; } System.out.println(str);//打印读取文件的json字符串 } catch(Exceptione){ e.printStackTrace(); } finally{ try{ br.close(); fr.close(); } catch(Exceptione){ e.printStackTrace(); } } //把读取到的json数据再转为对象,并在控制台输出 list=JSON.parseArray(str.trim(),User.class); for(Userobj:list){ System.out.println(obj.getUserName()+"\t"+obj.getBalance()); } } }
运行结果:
json数据写入完成 [{"balance":100,"userName":"张三"},{"balance":200,"userName":"张四"},{"balance":300,"userName":"张五"}] 张三 100.0 张四 200.0 张五 300.0
问题:为什么需要把对象转为json再存储?为什么不直接把对象存储到文件中?使用json有什么好处?
一二问回答:如果直接把对象写入文件中,会产生乱码,需要转换json字符串再存储。
三问回答:json的优点,方便于传输,较少冗余的字符,易于转换、阅读。