一、流
Java通过流实现I/O,流是一种可以产生或使用信息的抽象。
Java定义了两种类型的流:
- 字节流:处理字节的输入和输出,例如读写二进制数据。
- 字符流:处理字符的输入和输出。
在底层所有I/O仍然是面向字节的,字符流知识为处理字符提供更高效的方法。
二、字节流类
| BufferedInputStream BufferedOutputStream | 缓冲的输入流 缓冲的输出流 | 
| ByteArrayInputStream ByteArrayOutputStream | 读取字节数组的输入流 写入字节数组的输出流 | 
| DataInputStream DataOutputStream | 读取标准数据类型的方法的输入流 写入标准数据类型的方法的输出流 | 
| FileInputStream FileInputStream | 读取文件的输入流 写入文件的输出流 | 
| InputStream OutputStream | 描述流输入的抽象类 描述流输出的抽象类 | 
| FilterInputStream FilterOutputStream | 实现InputStream 实现OutputStream | 
| ObjectInputStream ObjectOutputStream | 对象的输入流 对象的输出流 | 
| PipedInputStream PipedOutputStream | 输入管道 输出管道 | 
| PrintStream | 包含print和println的输出流 | 
| PushbackInputStream | 允许字节返回的输入流 | 
| SequenceInputStream | 由多个依次读取的输入流组合而成的输入流 | 
三、字符流类
| BufferedReader BufferedWriter | 缓冲的输入字符流 缓冲的输出字符流 | 
| CharArrayReader CharArrayWriter | 从字符数组读取内容的输入流 向字符数组写入内容的输出流 | 
| FileReader FileWriter | 读取文件的输入流 写入文件的输出流 | 
| FilterReader FilterWriter | 过滤的读取器 过滤的写入器 | 
| InputStreamReader OutputStreamWriter | 将字节转换为字符的输入流 将字符转换为字节的输出流 | 
| StringReader StringWriter | 从字符串读取内容的输入流 向字符串写入内容的输出流 | 
| PipedReader PipedWriter | 输入管道 输出管道 | 
| Reader Writer | 描述字符流输入的抽象类 描述字符流输出的抽象类 | 
| PrintWriter | 包含print和println的输出流 | 
| PushbackReader | 允许字符返回的输入流 | 
| LineNumberReader | 支持行操作的输入流 | 
四、预定义流
System包含的预定义流
- System.out:标准输出流,PrintStream类型对象。
- System.err:标准错误流,PrintStream类型对象。
- System.in:标准输入流,InputStream类型对象。
五、控制台
 
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; class Solution { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); char c = (char) reader.read();//获取字符 System.out.write(c); String str = reader.readLine();//读取字符串 PrintWriter writer = new PrintWriter(System.out, true); writer.println(str); } }
六、读写文件
 
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; class Solution { static String read(String fileName) { FileInputStream fin = null; StringBuilder builder = new StringBuilder(); try { fin = new FileInputStream(fileName); int i; do { i = fin.read();//读取字节 if (i != -1)//-1表示到达文件结尾 builder.append((char) i); } while (i != -1); } catch (FileNotFoundException exc) { System.out.println("Cannot open file"); } catch (IOException exc) { System.out.println("Cannot read file"); } finally { try { if (fin != null) fin.close(); } catch (IOException exc) { System.out.println("Cannot close file"); } } return builder.toString(); } static void write(String fileName, String content) { FileOutputStream fout = null; try { fout = new FileOutputStream(fileName); for (int i = 0; i < content.length(); i++) fout.write((int) content.charAt(i));//写入字节 } catch (FileNotFoundException exc) { System.out.println("Cannot open file"); } catch (IOException exc) { System.out.println("Cannot write file"); } finally { try { if (fout != null) fout.close(); } catch (IOException exc) { System.out.println("Cannot close file"); } } } }
自动关闭文件,离开代码块后会隐式调用close方法关闭流关联的对象。
 
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; class Solution { public static void main(String[] args) { try (FileInputStream fin = new FileInputStream("file.txt")) { int i; do { i = fin.read(); if (i != -1) System.out.print((char) i); } while (i != -1); } catch (FileNotFoundException exc) { System.out.println("Cannot open file"); } catch (IOException exc) { System.out.println("Cannot read file"); } } }
 
         
