继承结构
- Closeable接口
- 字节流: 处理没有中文的流
- InputStream
FileInputStream: 从文件系统中的文件读取字节ObjectInputStream: 用于反序列化对象。
- OutputStream
FileOutputStream: 将字节写入文件系统中的文件ObjectOutputStream: 用于序列化对象。(可以直接将对象写入到文件)
- InputStream
- 字符流: 处理全中文的流, 由于中文不同的编码格式, 导致每个汉字占用的字节数不一致, 若使用字节流读取中文,则不好定义读取字节数, 容易造成乱码.
- Reader
FileReader: 从文件系统中的文件读取字符。BufferedReader: 为其他Reader添加缓冲功能。InputStreamReader: 可以将字节流转换为字符流进行操作 , 可以指定读写的编码格式
- Writer
FileWriter: 将字符写入文件系统中的文件。BufferedWriter: 为其他Writer添加缓冲功能。OutputStreamWriter: 同上
- Reader
- 字节流: 处理没有中文的流
字节流
字节输出流 & 字节输入流
-
FileInputStream
-
构造方法 说明 FileOutputStream(String name) 输出流关联文件, 文件路径以字符串形式给出 FileOutputStream(String name, boolean append) 第二个参数是追加写入的开关 FileOutputStream(File file) 输出流关联文件, 文件路径以File对象形式给出 FileOutputStream(File file, boolean append) 第二个参数是追加写入的开关 -
FileInputStream fileInputStream = new FileInputStream("D:\\A.txt"); int len = 0; //一次性全部读取, 当fileInputStream.read() == -1 代表读取结束 while ((len = fileInputStream.read() != -1){ System.out.print(s); }
-
-
ObjectInputStream
- 基本同上
序列化流
-
可以在流中,以字节的形式直接读写对象
-
/** * 使用序列化流存入多个对然后取出 */ @Test public void test02() throws IOException, ClassNotFoundException { Student stu1 = new Student("张三", "男", 12, 34); Student stu2 = new Student("李四", "男", 23, 31); Student stu3 = new Student("王五", "男", 41, 46); ArrayList<Student> list = new ArrayList<>(); Collections.addAll(list,stu1,stu2,stu3); ObjectOutputStream weiteObject = new ObjectOutputStream(new FileOutputStream("D:\\A.txt")); weiteObject.writeObject(list); weiteObject.close(); ObjectInputStream readerObject = new ObjectInputStream(new FileInputStream("D:\\A.txt")); ArrayList<Student> students = (ArrayList<Student>) readerObject.readObject(); students.forEach(item -> System.out.println(item)); readerObject.close(); }
字符流
字符输入流 & 字符输出流
-
Reader
-
构造方法 说明 FileWriter(String fileName) 字符输出流关联文件,路径以字符串形式给出 FileWriter(String fileName, boolean append) 参数2: 追加写入的开关 FileWriter(File file) 字符输出流关联文件,路径以File对象形式给出 FileWriter(File file, boolean append) 参数2: 追加写入的开关 -
@Test public void test01() throws IOException { FileReader fileReader = new FileReader("D:\\A.txt"); char[] chars = new char[1024]; //做了一个缓冲, 每次读取的字符数为1024个 int len; while ((len = fileReader.read(chars)) != -1){ String s = new String(chars, 0, len); System.out.println(s); } }
-
-
Writer
-
同上
-
成员方法 说明 public void write(int c) 写出单个字符 public void write(char[] cbuf) 写出一个字符数组 public write(char[] cbuf, int off, int len) 写出字符数组的一部分 public void write(String str) 写出字符串 public void write(String str, int off, int len) 写出字符串的一部分 -
注意: 字符输出流写出数据,需要调用flush或close方法,数据才会写出
-
字符缓冲流
-
字符缓冲流在源代码中内置了字符数组,可以提高读写效率
-
字符缓冲流中的特有方法
-
BufferedReader
-
public String readLine() 读取一行字符串, 读取到末尾返回 null
-
-
BufferedWriter
-
public void newLine() 写出换行符 (具有跨平台性)
-
-
转换流
-
作用
- 按照指定的字符编码读写操作
- 将字节流转换为字符流进行操作
-
public static void main(String[] args) throws IOException { Properties pro = new Properties(); pro.setProperty("品名","Iphone11 Pro Max"); pro.setProperty("颜色","暗夜绿"); pro.setProperty("存储容量","256G"); pro.setProperty("价格","10899"); OutputStreamWriter writer = new OutputStreamWriter(newFileOutputStream("D:\\A.txt"),"UTF-8"); pro.store(writer,null); writer.close(); }