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的优点,方便于传输,较少冗余的字符,易于转换、阅读。