文件处理,当初在C语言中是一个快被我玩坏了的知识点,但尽管有C语言中文件处理的基础,Java中的文件处理还是成为了我比较难啃的东西
- 首先是JAVA里有了流的概念,字节流,字符流等等一些奇怪的流派用起来真的不太顺手。
- 不知道我总结得对不对,在这里表述一下我的看法
先说字节流吧,字节流是以字节为基本读取或写入单位的一种流。它的特点是不会判断数据的真实表现形式, 就比如以下代码
``````public class 字节流1 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("C:\Users\qazxc\Desktop\大学\JAVA\代码Java\java.txt");
int len;
while( (len=fis.read())!=-1){
System.out.print((char)len);
}
}
}
java。txt:
hello0
hello1
hello2
hello3
hello4
hello5
hello6
hello7
hello8
hello9
高数多悲疯
结果中,hello0~9的输出都没有问题,但在输出中文时出现了乱码现象,原因在于中文用多个字节存储,而字节流一次读取一个。
再说说字符流,因为字符流是按字符对数据进行读取,而一个字符在JAVA中占用两个字节,所以对中文的读取就更加方便,同时因为读取字符,在用不同编码对文件进行读取或写入展现出来的效果和字节流处理中文时一致,即产生乱码。
``````public class 字符流1 {
public static void main(String[] args) throws IOException {
FileReader fr =new FileReader("C:\Users\qazxc\Desktop\大学\JAVA\代码Java\java.txt");
int len;
while( (len=fr.read())!=-1)
{
System.out.print((char)len);
}
}
}java。txt:
hello0
hello1
hello2
hello3
hello4
hello5
hello6
hello7
hello8
hello9
高数多悲疯
结果中,中文的输出没有出现问题。但是如果在构造方法后添加一个参数表示编码方式,这里就出现了乱码,此时不仅中文出了问题,英文也出了问题。
原因:在不同编码下字符所占的空间不同,字符流会按照读取时指定的编码进行读取,而此时如果读取的数据编码形式与字符流不同时,可能会对一个字符底层的字节数少读或多读,最后导致乱码现象。
总结:
- 字节流在读取数据时具有无视数据表现形式的特性,仅对字节进行读取
- 字符流会按照对应的编码对数据进行读取,当数据的编码形式和字符流不同时,会导致乱码现象。