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 {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 就会有乱码
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();
}
}
这地方不太懂,什么地方造成不同了?
data.txt是unicode编码,写入的也是unicode呀 --------------------编程问答-------------------- 你可以这样理解,一个读/写大东西,一个读/写小东西 --------------------编程问答--------------------
本例中那个环节造成
不同的ENCODING/DECODING schema --------------------编程问答--------------------
当你声明 FileWriter outWriter = new FileWriter(outfile);的时候,用的是操作系统自定义的ENCODING (Cp1252)。 但是NOTEPAD UNICODE 是UTF-16 Little Endian (UTF-16LE)。 这里就产生了差别 --------------------编程问答-------------------- 字符,可以编码成字节,所以可以用字节流读写。实际应用用,多用字节流,可以读字节,几乎所有的数据文件都可以编码成字节。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
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)。 这里就产生了差别
字符,可以编码成字节,所以可以用字节流读写。实际应用用,多用字节流,可以读字节,几乎所有的数据文件都可以编码成字节。
字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符
unicode字符就只能用字符流
搞不清楚,什么时候用字符流,实际应用中,基本用字节流 --------------------编程问答-------------------- 编码最好自己指定,否则默认编码和操作系统有关。 --------------------编程问答--------------------
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