1、字节流和字符流的区别
其实字符流和字节流没多大区别,字符流也可以拷贝文件,但不推荐使用,因为读取的时候字节转字符,然后字符还是要转字节 (用码表来进行字节和字符之间的转换)
2、什么时候用到字符流?
“只读或者只写的时候”
程序需要读取一段文本,或者需要写出一段文本的时候可以用字符流
读取的时候按照字符大小读取的,不会出现半个中文这阵种情况
写出的时候可以直接将字符串写出,不用转换成字符数组
3、字符流只能拷贝纯文本的文件
原因:字节转换成字符,按照码表,如果不是纯文本,就找不到对应的字符(比如图片、mp3),就不能转换了
4、用nextLine反转文本
问题:将文本第一行变成最后一行,以此类推
思路:
-
用buffedReader的nextLine()方法读取每一行,放到ArrayList里面
一开始想用字符串数组存储每一行的字符串,结果发现数组需要给定初始化长度(就算动态也需要遍历),所以直接用集合!!!! -
反向遍历集合,输入到buffedRrite里面(这里用普通的遍历,因为增强for不能反序)
-
流对象尽量晚开早关(但是调整的话好烦啊)
代码:
package cn.njupt;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
//注意:流对象尽量晚开早关(但是调整的话好烦啊)
public class file {
public static void main(String[] args) throws IOException {
BufferedReader bre = new BufferedReader(new FileReader("xxx.txt"));
BufferedWriter bwr = new BufferedWriter(new FileWriter("bbb.txt"));
ArrayList<String> list = new ArrayList<>();
String line;
while ((line = bre.readLine()) != null) {
list.add(line);
}
// 增强for循环不能反序,所以这里直接用普通的for循环
for (int i = list.size() - 1; i >= 0; i--) {
bwr.write(list.get(i));
bwr.newLine();
}
bre.close();
bwr.close();
}
}
5、转换流:(为了优化流的传输)
public class file {
public static void main(String[] args) throws IOException {
BufferedReader bre =
new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"),"utf-8"));
BufferedWriter bwr =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"),"gbk.txt"));
}
转换流的内存示意图: