字符流:
- Reader: 用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
-
|---BufferedReader :从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
-
|---LineNumberReader :跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和getLineNumber(),它们可分别用于设置和获取当前行号。
-
|---InputStreamReader :是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
-
|---FileReader: :用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小
都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个InputStreamReader。
-
- |---CharArrayReade
- |---StringReader
- Writer: 写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。
- |---BufferedWriter: :将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
- |---OutputStreamWriter :是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
- |---FileWriter: :用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
- |---PrintWrite
- |---CharArrayWriter
- |---StringWriter
字 节 流:
- InputStream: 是表示字节输入流的所有类的超类。
- |--- FileInputStream: :从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
- |--- FilterInputStream: :包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
- |--- BufferedInputStream :该类实现缓冲的输入流。
- |--- Stream :
- |--- ObjectInputStream :
- |--- PipedInputStream
- OutputStream:此抽象类是表示输出字节流的所有类的超类。
- |--- FileOutputStream :文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
- |--- FilterOutputStream :此类是过滤输出流的所有类的超类。
- |--- BufferedOutputStream :该类实现缓冲的输出流。
- |--- PrintStream :
- |--- DataOutputStream :
- |--- ObjectOutputStream :
- |--- PipedOutputStream:
规律总结
IO流中的对象:其实很简单,就是读取和写入。但是因为功能的不同,流的体系中提供 N 多的对象。那么开始时,到
底该用哪个对象更为合适呢?这就需要明确流的操作规律。
1 ,明确源和目的。
- 数据源:就是需要读取,可以使用两个体系:InputStream、Reader;
- 数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;
2 ,操作的数据是否是纯文本数据?
- 如果是:数据源:Reader 数据汇:Writer
- 如果不是:数据源:InputStream 数据汇:OutputStream
3 ,虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?明确操作的数据设备。
- 数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)
- 数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。
4 ,需要在基本操作上附加其他功能吗?比如缓冲。
- 如果需要就进行装饰。
根据规律实例化演示
需求:读取键盘录入,将数据存储到一个文件中。
规律分析
1,明确体系:
- 源:InputStream ,Reader
- 目的:OutputStream ,Writer
2,明确数据:
- 源:是纯文本吗?是 Reader
- 目的;是纯文本吗?是 Writer
3,明确设备:
- 源:键盘,System.in
- 目的:硬盘,FileWriter
- InputStream in = System.in;
- FileWriter fw = new FileWriter("a.txt");
4,需要额外功能吗?
- 需要,因为源明确的体系时Reader。可是源的设备是System.in。所以为了方便于操作文本数据,将源转成字符流。需要转换流。
- InputStreamReader InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter("a.txt");
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
代码实现
/**
* 通过键盘录入文字输出到文件
*/
public static void test3() {
BufferedWriter bufferedWriter = null;
BufferedReader bufferedReader = null;
try {
bufferedWriter = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
"E:\\kejiang\\IdeaProjects\\JavaProjectTest\\src\\io\\SystemOut.txt"),"UTF-8"));
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s = "";
while ((s = bufferedReader.readLine()) != null) {
if ("over".equals(s)) {
break;
}
bufferedWriter.write(s.toUpperCase());
bufferedWriter.newLine();
bufferedWriter.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行效果
- 控制台
这是通过键盘录入的数据
测试一下
over
Process finished with exit code 0
-
输出的文件
这里写图片描述
网友评论