二十三、I/O流2

											***文件输入流和文件输出流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
}

猜你喜欢

转载自blog.csdn.net/weixin_44614066/article/details/88089652