我试图理解任何面向字节的流(比如FileInputStream)和任何面向字符的流(比如FileReader)的行为之间的区别。
我经历了以下内容:http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html
第一个程序:
`import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;
public class CopyBytes { public static void main(String [] args)抛出IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
} ` 第二个计划:
import java.io.FileReader;
import java.io.FileWriter; import java.io.IOException;
公共类CopyCharacters { public static void main(String [] args)抛出IOException {
FileReader inputStream = null;
FileWriter outputStream = null;
try {
inputStream = new FileReader("xanadu.txt");
outputStream = new FileWriter("characteroutput.txt");
int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
}
它说: 在CopyCharacters中,int变量在其最后16位中保存一个字符值;在CopyBytes中,int变量在其最后8位中保存一个字节值。
我的问题是:我想检查上面的句子,以便在复制时检查c(程序中定义的整数)的值。现在c的值在连续读取时必须不同,因为在字节流中它逐字节读取,所以有字节值,而在字符流中它逐字符读取,所以有字符ASCII值。但它给出了相同的c值。为什么呢?
答案 0 :(得分:0)
试图以不同的方式思考,如果我的源文件只有一个字符说'a'。
现在CopyBytes应该在循环至少2次时运行,因为字符需要2个字节。但它只运行一次。
import java.io.FileReader;
import java.io.FileWriter; import java.io.IOException; //在CopyCharacters中,int变量在最后16位中保存一个字符值; //在CopyBytes中,int变量在最后8位保存一个字节值。
公共类CopyCharacters { public static void main(String [] args)抛出IOException {
FileReader inputStream = null;
FileWriter outputStream = null;
try {
inputStream = new FileReader("source.txt");
outputStream = new FileWriter("characteroutput.txt");
int c;
while ((c = inputStream.read()) != -1) {
System.out.println("one");
outputStream.write(c);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
}
这里只打印一次