一、字符流
1.1 字符流概述
- 字节流能读写任意类型的文件
- 一个字符可能是一个或者多个字节组成
- 使用字节流每次读取一个字节可能会造成读取半个文字
- 需要一种能按照个数读取数据的流–字符流
1.2 字符输入流
抽象类reader
实现类InputStreamReader
FileReader
创建对象
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
读取数据
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;public class Demo03 {public static void main(String[] args) throws IOException {/**int read() 读取单个字符。 int read(char[] cbuf) 将字符读入数组。 int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。 */FileReader reader = new FileReader("world.txt");char[] c = new char[4];int len;len = reader.read(c);System.out.println(len);System.out.println(Arrays.toString(c));len = reader.read(c);System.out.println(len);System.out.println(Arrays.toString(c));len = reader.read(c);System.out.println(len);System.out.println(Arrays.toString(c));len = reader.read(c);System.out.println(len);System.out.println(Arrays.toString(c));len = reader.read(c);System.out.println(len);System.out.println(Arrays.toString(c));reader.close();}
}
1.3 字符输出流
抽象类Writer
实现类OutputStreamWriter
FileWriter
创建对象和写入数据
import java.io.FileWriter;
import java.io.IOException;public class Demo01 {public static void main(String[] args) throws IOException {/**FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。 FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 */FileWriter writer = new FileWriter("hehe.txt",true);/**void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 void write(int c) 写入单个字符。 void write(String str, int off, int len) 写入字符串的某一部分。 */writer.write("斯是陋室惟吾德馨。");writer.close();}
}
1.4 使用字符流复制小说
1、创建字符流镀锡
2、循环读写数据
3、关闭流
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo02 {public static void main(String[] args) throws IOException {/*** 复制小说* 1、创建流对象* 2、读写数据* 3、关闭流*/// 创建流对象FileReader reader = new FileReader("D:\threeCountry.txt");FileWriter writer = new FileWriter("C:\Users\dushine\Desktop\threeCountry.txt");// 循环读写char[] c = new char[1024];int len = -1;while ((len = reader.read(c)) != -1) {writer.write(c, 0, len);}writer.flush();// 关闭流writer.close();reader.close();System.out.println("OVER");}
}
二、转换流
2.1 概述
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;public class Demo01 {public static void main(String[] args) throws IOException {/*** 解决乱码* --UTF-8的格式读取内容* --GBK的格式写入内容*/// 创建转换流对象InputStreamReader isr = new InputStreamReader(new FileInputStream("Day19笔记--IO.md"), "UTF-8");OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("Day19笔记--IO-副本.md"), "GBK");// 循环读写char[] c = new char[1024];int len = -1;while ((len = isr.read(c)) != -1) {osw.write(c, 0, len);}// 关闭流osw.close();isr.close();System.out.println("OVER");}
}
三、对象流
3.1 概述
3.2 案例
收发JDK内置类型
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class Demo01 {public static void main(String[] args) throws IOException {/*** 写入数据*/ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file"));oos.writeObject(1000);oos.writeObject(3.14);oos.writeObject("Hello");oos.writeObject(true);oos.writeObject(new int[] {11,22,33,44,55});oos.close();System.out.println("OVER");}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class Demo02 {public static void main(String[] args) throws ClassNotFoundException, IOException {/*** 读取数据*/// 创建对象流ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file"));// 读取数据System.out.println(ois.readObject());System.out.println(ois.readObject());System.out.println(ois.readObject());System.out.println(ois.readObject());System.out.println(ois.readObject());// 关闭流ois.close();}
}
收发自定义类型
import java.io.Serializable;public class Student implements Serializable{/*** */private static final long serialVersionUID = 3456789091230876L;String name;int age;String address;String info;public Student(String name, int age, String address, String info) {super();this.name = name;this.age = age;this.address = address;this.info = info;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", address=" + address + ", info=" + info + "]";}}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class Demo03 {public static void main(String[] args) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu"));// 发送数据:对象需要实现序列化接口 && 对象中的每一个属性都必须实现序列化接口oos.writeObject(new Student("罗永浩", 42, "东北", "真还传"));oos.close();System.out.println("OVER");}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class Demo04 {public static void main(String[] args) throws ClassNotFoundException, IOException {// 创建输入流ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu"));// 读取对象Object obj = ois.readObject();System.out.println(obj);ois.close();}
}