新的风暴已经出现,再次出现的IO流,这次是专门针对字符处理的,单一性还是很强的。
-
1.字符流是什么
- 字符流是可以直接读写字符的IO流
- 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.
-
2.FileReader
- FileReader类的read()方法可以按照字符大小读取
- FileReader fr = new FileReader(“aaa.txt”); //创建输入流对象,关联aaa.txt
int ch;
while((ch = fr.read()) != -1) { //将读到的字符赋值给ch
System.out.println((char)ch); //将读到的字符强转后打印
}
fr.close(); //关流
然后便是用FileWriter来将write(“dos”)写出文件内。大部分内容和之前一样,例如:
FileReader fr = new FileReader(“a.txt”);
FileWriter fw = new FileWriter(“b.txt”);
int ch;
while((ch = fr.read()) != -1) {
fw.write(ch);
}
fr.close();
fw.close();
- 字符流也可以拷贝非文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
- 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
- 读取的时候是按照字符的大小读取的,不会出现半个中文
- 写出的时候可以直接将字符串写出,不用转换为字节数组
所以就当作不可以拷贝非纯文本的文件就好了。
同样的RW也可以加Buffered
- BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
- BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率
- BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)
- BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"
流还有其它的,例如
- 序列流 SequenceInputStream 可以把多个字节输入流整合成一个, 从序列流中读取数据时,将从被整合的第一个流开始读, 读完一个之后继续读第二个,以此类推
- 内存输出流 ByteArrayOutputStream
- 该输出流可以向内存中写数据,把内存当作一个缓冲区,写出之后可以一次性获取出所有数据
- 创建对象: new ByteArrayOutputStream()
- 写出数据: write(int), write(byte[])
- 获取数据: toByteArray()
随机访问流概述和读写数据
- 随机访问流概述
- RandomAccessFile概述
- RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
- 支持对随机访问文件的读取和写入。
- read(), write(),seek()
对象操作流ObjecOutputStream- 什么是对象操作流
- 该流可以将一个对象写出,或者读取一个对象到程序中.也就是执行了序列化和反序列化的操作.
*序列化 : 将对象写出到文件
*反序列化 : 将文件中的字节数据翻译成对象
- 使用方式
- 写出: new ObjectOutputStream(OutputStream), writeObject()
打印流的概述和特点
- 写出: new ObjectOutputStream(OutputStream), writeObject()
- 什么是打印流
- 该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模式
- System.out就是一个PrintStream, 其默认向控制台输出信息
PrintStream ps = System.out;
别忘了.close();
ps:每日一词
烛影摇红
睡脸残慵,淡眉描画红颜浅。粉妆镜面乱新容,几是多重见。一点晕红长短,不更有、流苏顾盼。又回寻目,鸳鸯枕侣,日东云散。
烛影摇红,夜来炊饮需君返。重山复水玉门关,明月天涯远。归计去来须叹。路八千、一千一念。杨花独秀,孤雁徘徊,风声入院。