I/O体系图
I/O流使用对照图
注:粗体为节点流。蓝色为转换流(字节流转为字符流)。
流的理解
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。 数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。
简而言之:数据流是一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
当程序需要读取数据的时候,就会建立一个通向数据源的连接,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会建立一个通向目的地的连接。
流处理分类
节点流:可以从或向一个特定的地方(节点)读写数据。如FileInputStream、FileReader。
处理流:是对一个已存在的流的连接和封装(就犹如在水管中添加了一个过滤器对水的处理),通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。 一个流对象经过其他流的多次包装,称为流的链接
I/O流的操作
1. 操作规律
1、明确源和目的。
数据源:就是需要读取,可以使用两个体系:InputStream、Reader;
数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;
2、操作的数据是否是纯文本数据?
如果是:数据源:Reader
数据汇:Writer
如果不是:数据源:InputStream
数据汇:OutputStream
3、虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?
明确操作的数据设备。
数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)
数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。
4、需要在基本操作上附加其他功能吗?比如缓冲。
如果需要就进行装饰。
/记住,只要一读取键盘录入,就用这句话。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
2.输入流操作
-
读取磁盘的文件
//对磁盘文件读的操作 public static void fileInput() throws FileNotFoundException { // 创建输入流 FileInputStream fis = null; // 创建转换流 InputStreamReader isr = null; // 创建缓冲流 BufferedReader br = null; try { fis = new FileInputStream("E:/test.txt"); isr = new InputStreamReader(fis); br = new BufferedReader(isr); String line = null; // 按行读取文件 while ((line=br.readLine()) != null) { System.out.println(line); } }catch (Exception e) { e.printStackTrace(); } } //* 读取磁盘下多个文件遍历输出 public static void fileListInput() throws IOException { // 创建路径 File file = new File("e:/test"); // 读取该文件夹多有文件 File[] files = file.listFiles(); // 创建输入流 BufferedReader br = null; // 遍历输出 for (File file1 : files) { try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file1))); String str = null; while ((str=br.readLine()) != null) { System.out.println(str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } br.close(); }
4.输出流操作
- 将文本写到磁盘
//* 读取磁盘下多个文件遍历输出 public static void fileListInput() throws IOException { // 创建路径 File file = new File("e:/test"); // 读取该文件夹多有文件 File[] files = file.listFiles(); // 创建输入流 BufferedReader br = null; // 遍历输出 for (File file1 : files) { try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file1))); String str = null; while ((str=br.readLine()) != null) { System.out.println(str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } br.close(); }