一、流
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"); } } }