暑期自学 Day 05 | File 类 和 IO 流(五)
用缓冲流复制文件(读写文件)
- 示例代码如下:
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d://test//in.txt"); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d://test//out.txt"))) { int len = 0; byte[] bytes = new bytes[1024]; // 用于连续读取的字节数组 while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0, len); } } catch (IoException e) { e.printStackTrace(); }
字符缓冲流 (BufferedRead, BufferedWriter)
- 构造方法和字节缓冲流一样,使用方法和字符流一样。
- 特有方法
- BufferedWriter:
public void newLine()
换行分隔符方法 - BUfferedReader:
public String readLine()
读取一整行,到行末尾返回空
- BufferedWriter:
转换流 (InputStreamReader, OutputStreamWriter)
为了解决编码乱码问题
除了查询默认码表 UTF-8:
- InputStreamReader 也可以查询指定码表,将字节流转换为字符流。子类:FileReader
- OutputStreamWriter 查询指定码表,将字符流转换为字节流。子类:FileWriter
使用示例:
// 使用时均要声明 IOException 异常 // OutputStreamWriter // 将字节输出流传递进osw,指定编码格式 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d://test.txt"), "utf-8"); // 将字符串写入 osw.write("你好"); // 刷新释放资源 osw.flush(); osw.close(); // InputStreamReader // 将字节输入流传递进isr,指定解码格式 InputStreamReader isr = new InputStreamReader(new FileInputStream("d://test.txt"),"utf-8"); int len = 0; byte[] bytes = new byte[1024]; while ((len = isr.read(bytes)) != -1) { System.out.println((char)len); } isr.close();
序列化和反序列化
- 序列化:把对象以流的形式写入到文件保存;ObjectOutputStream
- 反序列化:把文件中保存的对象用流的形式读取出来;ObjectInputStream
- 进行序列化反序列化时,必须实现 Serializable 接口。
序列化流 ObjectOutputStream
- 继承了字节输出流
- 特有成员方法
- void writeObject(Object obj)
反序列化流 ObjectInputStream
- 继承了字节输入流
- 特有成员方法
- void readObject(Object obj)
- 使用时要抛出 ClassNotFoundException
瞬态关键字 (transient)
- 静态关键字不属于对象,无法被序列化。
- 使用 transient 修饰变量,可以使成员变量不被序列化。
InvalidClassException
- 序列化时会产生一个序列号,如果 class 中做了修改,反序列化时会造成序列号不一致,导致异常
- 解决:在类中指定序列号,如:
private static final long serialVersionUID = 1L;
打印流 (PrintStream)
- System.out.println() 就是一个打印流
- 不会抛出 IOException
- 特有方法:print(), println(); 括号里可以打印任意数据类型
- 构造方法:
- PrintStream(File file)
- PrintStream(String filename)
- PrintStream(OutputStream out)
- 可以看出,打印流既可以输出到文件,也可以输出到流对象
- 继承了父类 write(), read(), flush(), close() 等方法。
- 代码示例:
PrintStream ps = new PrintStream("d://test.txt"); // 要处理 FileNotFoundException
ps.write(97); // a
ps.println(97); // 97
System.setOut(ps); // 使打印流在目的地文件中输出
System.out.print(97); // test.txt 中打印 97
ps.close();
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: