当前位置:编程学习 > JAVA >>

reader/writer都什么时候用

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,
字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
字节流处理单元为1个字节, 操作字节和字节数组。

我将
“哈哈发达eeedfdagfr!@#$%^&*()_+”保存为unicode编码的data.txt文件,
分别用reader/writer和inputstream和outputstream来读写到两个txt文件中

为什么reader/writer写入的有乱码,inputstream/outputstream写入的没有乱码



将data.txt编码改成utf-8后,reader/writer和inputstream和outputstream写入文件,都没有乱码

1:reader/writer都什么时候用
2:txt是文本文件,为什么用inputstream/outputstream也可以读写

代码如下:
public class ReaderTest {


public static void readWrite1() throws Exception {
String filePath = "c:\\data.txt";
String out = "c:\\out1.txt";
File infile = new File(filePath);
File outfile = new File(out);

if(!outfile.exists()) {
outfile.createNewFile();
}



FileReader fileReader = new FileReader(infile);
FileWriter outWriter = new FileWriter(outfile);

while(true) {
int reader = fileReader.read();
if(reader == -1) {
break;
}

outWriter.write(reader);
}
outWriter.flush();

fileReader.close();
outWriter.close();

}


public static void inputStream1() throws Exception {
String filePath = "c:\\data.txt";
String out = "c:\\out2.txt";
File infile = new File(filePath);
File outfile = new File(out);

if(!outfile.exists()) {
outfile.createNewFile();
}

FileInputStream inputStream = new FileInputStream(infile);
FileOutputStream outStream = new FileOutputStream(outfile);

while(true) {
int oneByte = inputStream.read();
if(oneByte == -1) {
break;
}
outStream.write(oneByte);
}


inputStream.close();
outStream.close();
}

public static void main(String[] args) throws Exception {
readWrite1();
inputStream1();
}
}
java --------------------编程问答-------------------- Java 使用UTF_8 ENCODING。 TXT 保存的UNICODE 是UTF-32 --------------------编程问答-------------------- reader 会先把你的TXT 保存的BYTE CODE DECODING 再读入JAVA程序。 而WRITER 先把你输入的character ENCODING 再把 BYTE 写到你的文件。如果用不同的ENCODING/DECODING schema 就会有乱码。而INPUTSREAM/OUTPUTSTREAM 是直接读写BYTE --------------------编程问答-------------------- 如果用不同的ENCODING/DECODING schema 就会有乱码
这地方不太懂,什么地方造成不同了?
data.txt是unicode编码,写入的也是unicode呀 --------------------编程问答-------------------- 你可以这样理解,一个读/写大东西,一个读/写小东西 --------------------编程问答--------------------
引用 2 楼 soton_dolphin 的回复:
reader 会先把你的TXT 保存的BYTE CODE DECODING 再读入JAVA程序。 而WRITER 先把你输入的character ENCODING 再把 BYTE 写到你的文件。如果用不同的ENCODING/DECODING schema 就会有乱码。而INPUTSREAM/OUTPUTSTREAM 是直接读写BYTE


本例中那个环节造成
不同的ENCODING/DECODING schema  --------------------编程问答--------------------
引用 5 楼 winer1220 的回复:
Quote: 引用 2 楼 soton_dolphin 的回复:

reader 会先把你的TXT 保存的BYTE CODE DECODING 再读入JAVA程序。 而WRITER 先把你输入的character ENCODING 再把 BYTE 写到你的文件。如果用不同的ENCODING/DECODING schema 就会有乱码。而INPUTSREAM/OUTPUTSTREAM 是直接读写BYTE


本例中那个环节造成
不同的ENCODING/DECODING schema 

当你声明 FileWriter outWriter = new FileWriter(outfile);的时候,用的是操作系统自定义的ENCODING (Cp1252)。 但是NOTEPAD UNICODE 是UTF-16 Little Endian (UTF-16LE)。 这里就产生了差别 --------------------编程问答--------------------  字符,可以编码成字节,所以可以用字节流读写。实际应用用,多用字节流,可以读字节,几乎所有的数据文件都可以编码成字节。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 6 楼 soton_dolphin 的回复:
Quote: 引用 5 楼 winer1220 的回复:

Quote: 引用 2 楼 soton_dolphin 的回复:

reader 会先把你的TXT 保存的BYTE CODE DECODING 再读入JAVA程序。 而WRITER 先把你输入的character ENCODING 再把 BYTE 写到你的文件。如果用不同的ENCODING/DECODING schema 就会有乱码。而INPUTSREAM/OUTPUTSTREAM 是直接读写BYTE


本例中那个环节造成
不同的ENCODING/DECODING schema 

当你声明 FileWriter outWriter = new FileWriter(outfile);的时候,用的是操作系统自定义的ENCODING (Cp1252)。 但是NOTEPAD UNICODE 是UTF-16 Little Endian (UTF-16LE)。 这里就产生了差别
围观大神级回答! --------------------编程问答--------------------
引用 7 楼 beijing20110905 的回复:
 字符,可以编码成字节,所以可以用字节流读写。实际应用用,多用字节流,可以读字节,几乎所有的数据文件都可以编码成字节。


字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符
unicode字符就只能用字符流
搞不清楚,什么时候用字符流,实际应用中,基本用字节流 --------------------编程问答-------------------- 编码最好自己指定,否则默认编码和操作系统有关。 --------------------编程问答--------------------
引用 6 楼 soton_dolphin 的回复:
Quote: 引用 5 楼 winer1220 的回复:

Quote: 引用 2 楼 soton_dolphin 的回复:

reader 会先把你的TXT 保存的BYTE CODE DECODING 再读入JAVA程序。 而WRITER 先把你输入的character ENCODING 再把 BYTE 写到你的文件。如果用不同的ENCODING/DECODING schema 就会有乱码。而INPUTSREAM/OUTPUTSTREAM 是直接读写BYTE


本例中那个环节造成
不同的ENCODING/DECODING schema 

当你声明 FileWriter outWriter = new FileWriter(outfile);的时候,用的是操作系统自定义的ENCODING (Cp1252)。 但是NOTEPAD UNICODE 是UTF-16 Little Endian (UTF-16LE)。 这里就产生了差别



这些知识能够提供一个书或网址,参考下 --------------------编程问答-------------------- 哪位大师能否提供些这方面的参考资料
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,