第二十三课:文件输入和输出(二)
一、使用字符流来读写文本文件
1.字符流:可以处理能用Notepad++打开不乱码的文件
⑴字符输入流:Reader -> InputStreamReader -> FileReader
①构造:
•FileReader(File file);
•FileReader(String path);
•InputStreamReader(InputStream is);
•InputStreamReader(InputStream is,String charsetName); 可以指定字符集(字符
编码)名称
②关于字符编码/字符集的补充:
•举例:当你用Notepad++存储一段内容时,到底在干什么?
•当你输入了内容之后,它默认会以UTF-8进行解码,然后再通过UTF-8进行编码
用于显示给你
•解码和编码字符集必须保持一致,否则会出现乱码
③常用方法:
int read(char[] cha); 读取字符数均 将 数据读取到字符数组中 返回字符数
⑵字符输出流:Writer -> OutputStreamWriter -> FileWriter
①构造:
•FileWriter(File file);
•FileWriter(String path);
•OutputStreamWriter(OutputStream os);
•OutputStreamWriter(OutputStream os,String chasetName); 可以将字节流转换为
字符流
②常用方法:
•write(String str);
•writer(String str,int offset,int length);
•write(char[] cha,int offset,int length);
2.字节流:
⑴字节输入流:InputStream -> FileInputStream
⑵字节输出流:OutputStream -> FileoutputStream
二、会使用二进制流读写二进制文件(了解)
三、会使用高校缓冲流读写文本文件
1.高效缓冲字符流
⑴输入流:
①构造:
BufferedReader(Reader reader);
②常用方法:
String readLine(); 读取一行
⑵输出流:BufferedWriter
①构造:
BufferedWriter(Writer writer);
②常用方法:
•同字符输出流方法
•因为有缓冲区,所以如果需要立即将将内容输出到文本,需要调用 flush() 方法刷
新缓冲区
•关流也会刷新缓冲区
四、使用对象流实现序列化和反序列化
•serializable
•一个合格的JavaBean类应该有以下组成:
⑴属性私有化
⑵提供公共的getter/setter方法
⑶提供无参构造
⑷实现序列化接口
•当Java在进行对象的序列化(对象一定实现过序列化接口)时,它会自动生成一个序
列化版本ID(serialVersionUID),同理,在读取对象时(反序列化)时,Java还会再生
成一个序列化版本ID
java.io.InvalidClassException: cn.kgc.demo4.user; local class incompatible: stream
classdesc serialVersionUID = -5990646266163102806,local class serialVersionUID =
13392451066535050577
at java.io.ObjectStreamClass.initNonProxy(objectStreamClass.java:687)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1883)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1749)
at java.io.ObjectInputStream.reasOrdinaryObject(ObjectInputStream.java:2040)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at cn.kgc.demo4.Demo2.main(Demo2.java:19)
./**
- 输出对象 序列化:将内存中的Java对象以指定的二进制序列写入特定的流(二进制序列)
- @author Raymond
- 2019年3月3日 下午7:16
*/
public class Demo1{
public static void main(String[] args){
try(OutputStream os = new FileOutputStream(“d:/object.txt”);
ObjectOutputStream oos = new ObjectOutputStream(os)?{
User user = new User();
user.setName(“王明轩”);
user.setAge(12);
// 序列化
oss.writeObject(user);
} catch(Exception e){
e.printStackTrace();
}
}
}
/**
-
读取对象:反序列化:将特定流中的数据重构为Java对象
-
@author Raymond
-
2019年3月3日 下午7:28
*/
public class Demo2{
public static void main(String[] args){
try(File InputStream fis = new FileInputStream(“d:/object.txt”);
objectInputStream ois = new ObjectInputStream(fis)){// 反序列化 User user = (User) ois.readObject(); System.out.println(user); }catch(Exception e){ e.printStackTrace(); }
}
}
/**
-
用户实体
-
@author Raymond
-
2019年3月3日 下午8:45
*/
public class User implements Serializable{/**
- 序列化ID
*/
private static final long serialVersionUID = 1L;
private String name;
private int age;publicn User(){}
// 省略getter/setter
} - 序列化ID