IO流概述
- I表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读。
- O表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写。
IO流的分类
- 按流的方向分
- 按流中的数据最小单位分为
总结流的四大类:
- 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
- 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
- 宇符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
- 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。
文件输入流:FileInputStream
作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
每次读取一个字节
代码演示如下:
public class FileInputStreamDemo01 { public static void main(String[] args) throws Exception { //1.创建一个文件字节输入流管道与源文件接通 InputStream is = new FileInputStream("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data.txt"); //2.读取一个字节返回(每次读取一滴水) int b1 = is.read(); System.out.println((char) b1); // a int b2 = is.read(); System.out.println((char) b2); // b int b3 = is.read(); System.out.println((char) b3); // 1 int b4 = is.read(); // 读取完毕返回-1 System.out.println(b4); //3.使用循环改进 int b; while ((b = is.read()) != -1){ System.out.print((char) b); } } }
每次读取一个字节数组存在什么问题?
- 性能较慢
- 读取中文字符输出无法避免乱码问题
每次读取一个字节数组
代码演示如下:
public class FileInputStreamDemo02 { public static void main(String[] args) throws Exception { //1.创建一个文件字节输入流管道与源文件接通 InputStream is = new FileInputStream("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data02.txt"); //2.定义一个字节数组,用于读取字节数组 // byte[] buffer = new byte[3]; //3B ----> 每次装三个字节 // int len = is.read(buffer); // System.out.println("读取了几个字节:" + len); // String rs = new String(buffer); // System.out.println(rs); // // int len1 = is.read(buffer); // System.out.println("读取了几个字节:" + len1); // String rs1 = new String(buffer); // System.out.println(rs1); // // int len2 = is.read(buffer); // System.out.println("读取了几个字节" + len2); // // 读取多少倒出多少 // String rs2 = new String(buffer,0,len2); // System.out.println(rs2); // // int len3 = is.read(buffer); // System.out.println("读取了几个字节" + len3); // 读取完毕返回-1 //3.改进使用循环,每次读取一个字节数组 byte[] buffer = new byte[3]; int len; // 记录每次读取的字节数 while ((len = is.read(buffer)) != -1){ //读取多少倒出多少 System.out.print(new String(buffer,0,len)); } }
每次读取一个字节数组存在什么问题?
- 读写的性能得到了提升
- 读取中文字符输出无法避免乱码问题
1、如何使用字节输入流读取中文内容输出不乱码呢?
- 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。
2、直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
- 如果文件过大,字节数组可能引起内存溢出。
代码演示如下:
public class FileInputStreamDemo03 { public static void main(String[] args) throws Exception { //1.创建一个文件字节输入流管道与源文件接通 File f = new File("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data02.txt"); InputStream is = new FileInputStream(f); //2.定义一个字节数组与文件的大小刚刚好一样大 // byte[] buffer = new byte[(int) f.length()]; // int len = is.read(buffer); // System.out.println("读取了多少个字节:" + len); // System.out.println("文件大小:" + f.length()); // System.out.println(new String(buffer)); //读取全部字节数组 byte[] buffer = is.readAllBytes(); System.out.println(new String(buffer)); } }
1.如何使用字节输入流读取中文内容输出不乱码呢?
- 一次性读取完全部字节。
- 可以定义与文件一样大的字节数组读取,也可以使用官方APl•
2.直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
- 如果文件过大,定义的字节数组可能引起内存溢出。