***文件输入流和文件输出流2***
一、字符流:可以用notepad++打开不乱吗的文件
1.字符的输入流:Reader–>InputStreamReader–>FileReader
构造:
FileReadr(File file);
FileReadr(String path);
InputStreamReader(inputStream is);
InputStreamReader(inputStream is ,String charestName);可以指定字符集(字符编码)名称
2.关于字符串编码、字符集的补充
举例:当你用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);可以将字节流转换为字符流
*常用方法*
writer(String str );
writer(String str, int offset, int length);
writer(char[] cha, int offest, int length);
字节流;
字节输入流:InputStream-->FileInputStream
字节输出流;OutputStream--->FileOutputStream
二、会使用二进制流读写二进制文件(了解)
三、会使用高效字符流
高效缓冲字符流
输入流:BufferReader
构造:
BufferedReader(Reader reader);
常用方法:
String reaLine();读取一行
输出流:BufferWriter
构造:
BufferedWriter(Writer writer);
常用方法:
同字符输出流方法
因为有缓冲区,所以如果需要立即将内容输出到文本,需要调用flush()方式刷新缓冲区
同时也要注意关流也会刷新缓冲区
使用对象流实现序列化和反序列化
serializable
一个合格的JavaBean类应该有一下组成:
1.属性私有化
2.提供公共的setter/getter方法
3.提供无参构造’
4.实现序列化接口
当java进行对象的序列化时(此时的对象一定实现了序列化接口),它会自动生成一个序列化版本,ID(serialVersionUID),同理,在读取对象的时候,(反序列化),java还会去生成一个序列化版本的ID
java.io.InvalidClassException: cn.kgc.demo4.User; local class incompatible: stream classdesc serialVersionUID = -5990646266163102806, local class serialVersionUID = -3392451066535050577
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.readOrdinaryObject(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 xiaobubu
* 2019年3月3日 上午11:08:20
*/
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);
// 序列化
oos.writeObject(user);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 读取对象:反序列化:将特定流中的数据重构为Java对象
* @author xiaobubu
* 2019年3月3日 上午11:11:41
*/
public class Demo2 {
public static void main(String[] args) {
try (FileInputStream 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 xiaobubu
* 2019年3月3日 上午11:07:29
*/
public class User implements Serializable {
/**
* 序列化ID
*/
private static final long serialVersionUID = 1L;
private String name;
private int age;
public User(){}
// 省略getter/setter
}