第11篇-JAVA IO

第11篇-JAVA IO

  • 每篇一句 :不要在失败时才想起别人的忠告,不要在失去之后才想起珍惜
  • 初学心得: 环境越艰难,越会出聪明人
  • (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-17| JAVA IO流 ] 

1.流概念

流是指一连串流动的字符,是以先进先出方式发送信息的通道 
即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作

2.JAVA IO流

Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作

Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收(sink)的有序数据 
Java把所有传统的个流类型(类或抽象类)都放在java.io包中,用以实现输入/输出功能

3.JAVA IO流分类

按流向来分类:可以分为输入流和输出流:

  • 输入流:只能从中读取数据,而不能向其写出数据
  • 输出流:只能向其写出数据,而不能从中读取数据

字节流和字符流: 
按照流的角色分,可以分为节点流和处理流

IO流的四个基类: 
Java把所有设备里的有序数据抽象成流模型简化了输入/输出的处理 
Java的IO流共涉及到40多个类,这些类看上去芜杂而凌乱,但实际上是非常规则、而且彼此之间存在非常紧密的联系 
Java的IO流的40多个类都是从4个抽象基类派生出来的:

  • InputStream/Reader:所有输入流的基类,前者是输入字节流,后者是输入字符。
  • OutputStream/Writer:所有输出流的基类,前者是输出字节流,后者是输出字符流

- 输入流:InputStream和Reader是所有输入流的基类,它们都是两个抽象类,本身并不能创建实例来执行输入,但它们将所谓所有输入流的模板,所以它们的方法是所有输入流都可使用的方法

  • int read():从输入流中读取单个字节(相当于从图15.5所示水管中取出一滴水),返回所读取的字节数据(字节数据可直接转换为int类型)
  • int read(byte[]/char[] b):从输入流中读取最多b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数
  • int read(byte[]/char[] b, int off, int len):从输入流中读取最多len字节的数据,并将其存储在数组 b 中,放入b数组中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节数

- 输出流:OutputStream和Writer也非常相似,它们采用模型来执行输出,两个流都提供了如下三个方法

  • void write(int c):将指定的字节/字符输出到输出流中,其中c既可以代表字节,也可以代表字符
  • void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定输出流中
  • void write(char[] cbuf, int off, int len):将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中

处理流的用法:

  • 使用处理流来包装节点流,程序通过处理流来执行输入/输出功能,让节点流与底层的I/O设备、文件交互
  • 程序使用处理流非常简单,通常只需要在创建处理流时传入一个节点流作为构造器参数即可,这样创建的处理流就是包装了该节点流的处理流

4.流的操作规律

  • 1、明确源和目的。 
    数据源:就是需要读取,可以使用两个体系:InputStream、Reader; 
    数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;
  • 2、操作的数据是否是纯文本数据? 
    如果是:数据源:Reader 
    数据汇:Writer 
    如果不是:数据源:InputStream 
    数据汇:OutputStream
  • 3、虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢? 
    明确操作的数据设备。 
    数据源对应的设备:硬盘(File),内存(数组),键盘(System.in) 
    数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)
  • 4、需要在基本操作上附加其他功能吗?比如缓冲,如果需要就进行装饰

5.java.io包

文本文件的读写:

  • 用FileInputStream读文件
  • 用FileOutputStream写文件
  • 用BufferedReader读文本文件
  • 用BufferedWriter写文本文件

二进制文件的读写:

  • DataOutputStream
  • DataInputStream

6.字节流文件拷贝

1.public class IoTest {
2.  public static void main(String[] args) throws IOException,InterruptedException {
3.      String path = "c:\\b.txt";
4.      readFile(path);
5.  }
6.  private static void readFile(String path) {
7.      FileInputStream fis = null;
8.      try {
9.          fis = new FileInputStream(path);
10.          byte[] byt = new byte[1024];
11.          int len = fis.read(byt);
12.          System.out.println(new String(byt, 0, len));
13.      } catch (IOException e) {
14.          // 抛出运行时异常
15.          throw new RuntimeException(e);
16.      } finally {
17.          // 把close方法放入finally中保证一定会执行
18.          // 先判断是否空指针
19.          if (fis != null) {
20.              try {
21.                  fis.close();
22.              } catch (Exception e) {
23.                  throw new RuntimeException(e);
24.              }
25.          }
26.      }
27.  }
28.}
1.public static void copyFile(String srcPath, String destPath) {
2.      FileInputStream fis = null;
3.      FileOutputStream fos = null;
4.      try {
5.          fis = new FileInputStream(srcPath);
6.          fos = new FileOutputStream(destPath);
7.          byte[] byt = new byte[1024 * 1024];
8.          int len = 0;
9.          while ((len = fis.read(byt)) != -1) {
10.              fos.write(byt, 0, len);
11.          }
12.      } catch (IOException e) {
13.          throw new RuntimeException(e);
14.      } finally {
15.          try {
16.              if (fis != null) {
17.                  fis.close();
18.              }
19.          } catch (IOException e) {
20.              throw new RuntimeException(e);
21.          } finally {
22.              if (fos != null) {
23.                  try {
24.                      fos.close();
25.                  } catch (IOException e) {
26.                      throw new RuntimeException(e);
27.                  }
28.              }
29.          }
30.      }
31.  }

7.字符流文件拷贝

1.public static void main(String[] args) throws Exception {
2.      String path1 = "c:/a.txt";
3.      String path2 = "c:/b.txt";
4.      copyFile2(path1, path2);
5.  }
6./**
7.   * 使用字符流拷贝文件,有完善的异常处理
8.   */
9.public static void copyFile2(String path1, String path2) {
10.      Reader reader = null;
11.      Writer writer = null;
12.      try {
13.          // 打开流
14.          reader = new FileReader(path1);
15.          writer = new FileWriter(path2);
16.          // 进行拷贝
17.          int ch = -1;
18.          while ((ch = reader.read()) != -1) {
19.              writer.write(ch);
20.          }
21.      } catch (Exception e) {
22.          throw new RuntimeException(e);
23.      } finally {
24.          // 关闭流,注意一定要能执行到close()方法,所以都要放到finally代码块中
25.          try {
26.              if (reader != null) {
27.                  reader.close();
28.              }
29.          } catch (Exception e) {
30.              throw new RuntimeException(e);
31.          } finally {
32.              try {
33.                  if (writer != null) {
34.                      writer.close();
35.                  }
36.              } catch (Exception e) {
37.                  throw new RuntimeException(e);
38.              }
39.          }
40.      }
41.  }

初学(JAVA IO流 高级阶段) 难点: ★★★★★

希望每一篇文章都能够对读者们提供帮助与提升,这乃是每一位笔者的初衷


posted @ 2017-08-11 18:32  JEEP711  阅读(97)  评论(0编辑  收藏  举报