Java流的概念:什么是输入/输出流?

  在 Java 中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。

数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。

  • 按照流的方向主要分为输入流和输出流两大类。
  • 数据流按照数据单位的不同分为字节流和字符流。
  • 按照功能可以划分为节点流和处理流。

输入流

 所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类

java输入输出流 中文 java中输入输出流的知识_Java


    图3 InputStream类的层次结构图

  InputStream 类中所有方法遇到错误时都会引发 IOException 异常

  Java 中的字符是 Unicode 编码,即双字节的,而 InputerStream 是用来处理单字节的,在处理字符文本时不是很方便。这时可以使用 Java 的文本输入流 Reader 类,该类是字符输入流的抽象类,即所有字输入流的实现都是它的子类。

 

 

java输入输出流 中文 java中输入输出流的知识_输入流_02


  图4 Reader类的层次结构

 输出流

 在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类,

 

java输入输出流 中文 java中输入输出流的知识_输入流_03


图5 OutputStream类的层次结构图

java输入输出流 中文 java中输入输出流的知识_输入流_04


图6 OutputStream类的层次结构图

 

Java系统流

每个 Java 程序运行时都带有一个系统流,系统流对应的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流,分别通过 in、out 和 err 变量来引用。

  System.in 是 InputStream 类的一个对象

  对于 System.out 输出流主要用于将指定内容输出到控制台。 

  System.out 和 System.error 是 PrintStream 类的对象。

  尽管它们通常用于对控制台进行读取和写入字符,但是这些都是字节流。

Java File类(文件操作类)详解

 Java 中的 File 类是文件和目录路径名的抽象形式。

  

File 类简介

在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象。

  File 类不具有从文件读取信息和向文件写入信息的功能

获取文件属性

  创建一个 File 类对象并指向一个已存在的文件

创建和删除文件

 File 类不仅可以获取已知文件的属性信息,还可以在指定路径创建文件,以及删除一个文件。创建文件需要调用 createNewFile() 方法,删除文件需要调用 delete() 方法。无论是创建还是删除文件通常都先调用 exists() 方法判断文件是否存在。

遍历目录

 File 类的 list() 方法提供了遍历目录功能

1. String[] list()

  list() 方法返回的数组中仅包含文件名称,而不包含路径。

2. String[] list(FilenameFilter filter)

假设希望只列出目录下的某些文件,这就需要调用带过滤器参数的 list() 方法

Java RandomAccessFile类:动态读取文件内容

动态读取需要用到 Java 中的 RandomAccessFile 类,该类中有一个文件指针用于标识当前流的读写位置,这个指针可以向前或者向后移动。

注意:要写进文本的内容是中文,如果不进行字符的转换,写进去的会是乱码,读取出来的内容也会是乱码。

Java字节流的使用:字节输入/输出流、文件输入/输出流、字节数组输入/输出流

 所有表示字节输出流类的父类是 OutputStream

字节输入流

  InputStream 类及其子类的对象表示一个字节输入流。

  使用 InputStream 类的方法可以从流中读取一个或一批字节

  注意:在使用 mark() 方法和 reset() 方法之前,需要判断该文件系统是否支持这两个方法,以避免对程序造成影响。

 

字节输出流

  OutputStream 类及其子类的对象表示一个字节输出流。

  

字节数组输入流

ByteArrayInputStream 

 

字节数组输出流

ByteArrayOutputStream

 

文件输入流

在创建 FileInputStream 类的对象时,如果找不到指定的文件将拋出 FileNotFoundException 异常,该异常必须捕获或声明拋出。

注意:FileInputStream 类重写了父类 InputStream 中的 read() 方法、skip() 方法、available() 方法和 close() 方法,不支持 mark() 方法和 reset() 方法。

  在创建 FileOutputStream 类的对象时,如果指定的文件不存在,则创建一个新文件;如果文件已存在,则清除原文件的内容重新写入。

文件输出流

  FileOutputStream 类继承自 OutputStream 类,重写和实现了父类中的所有方法。FileOutputStream 类的对象表示一个文件字节输出流,可以向流中写入一个字节或一批字节。在创建 FileOutputStream 类的对象时,如果指定的文件不存在,则创建一个新文件;如果文件已存在,则清除原文件的内容重新写入。

  技巧:在创建 FileOutputStream 对象时,如果将 append 参数设置为 true,则可以在目标文件的内容末尾添加数据,此时目标文件仍然可以暂不存在。

Java字符流的使用:字符输入/输出流、字符文件和字符缓冲区的输入/输出流

字符输入流

 Reader 类是所有字符流输入类的父类,

字符输出流

  与 Reader类相反,Writer 类是所有字符输出流的父类

 注意:Writer 类所有的方法在出错的情况下都会引发 IOException 异常。关闭一个流后,再对其进行任何操作都会产生错误。

字符文件输入流——FileReader

  该类的构造方法有如下两种重载形式。

  1. FileReader(File file):在给定要读取数据的文件的情况下创建一个新的 FileReader 对象。其中,file 表示要从中读取数据的文件。
  2. FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader 对象。其中,fileName 表示要从中读取数据的文件的名称,表示的是一个文件的完整路径。

字符文件输出流—FileWriter

 该类的构造方法有如下 4 种重载形式。

  1. FileWriter(File file):在指定 File 对象的情况下构造一个 FileWriter 对象。其中,file 表示要写入数据的 File 对象。
  2. FileWriter(File file,boolean append):在指定 File 对象的情况下构造一个 FileWriter 对象,如果 append 的值为 true,则将字节写入文件末尾,而不是写入文件开始处。
  3. FileWriter(String fileName):在指定文件名的情况下构造一个 FileWriter 对象。其中,fileName 表示要写入字符的文件名,表示的是完整路径。
  4. FileWriter(String fileName,boolean append):在指定文件名以及要写入文件的位置的情况下构造 FileWriter 对象。其中,append 是一个 boolean 值,如果为 true,则将数据写入文件末尾,而不是文件开始处。

FileWriter 类的创建不依赖于文件存在与否,如果关联文件不存在,则会自动生成一个新的文件。在创建文件之前,FileWriter 将在创建对象时打开它作为输出。如果试图打开一个只读文件,将引发一个 IOException 异常。

  

字符缓冲区输入流

  BufferedReader 类主要用于辅助其他字符输入流,它带有缓冲区,可以先将一批数据读到内存缓冲区。

 

字符缓冲区输出流

BufferedWriter 类主要用于辅助其他字符输出流,

  BufferedWriter 类的构造方法有如下两种重载形式。

  1. BuflferedWriter(Writer out):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流。
  2. BufferedWriter(Writer out,int size):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流,参数 size 则用于指定缓冲区的大小,单位为字符。