麻烦大家看一下代码,问题在注释中
import java.io.*;public class TestBufferedStream1 {
public static void main(String[] args) {
try {
FileReader in = new FileReader("D:\\A.txt");
FileWriter out = new FileWriter("D:\\A.txt");
BufferedReader bin = new BufferedReader(in);
BufferedWriter bout = new BufferedWriter(out);
int c = 0;
//往文件中写入0到20数字
for(int i=0;i<=20;i++) {
bout.write(i);//这样编码,写入txt文件的是一些符号,而不是预想中的0到20的数字。如果改成bout.write(String.valueOf(i));就可以了,这是为什么呢
bout.newLine();
}
bout.flush();
//从文件中读取内容并打印出来
while((c=bin.read()) != -1) {
System.out.print(c);//这里如果这样写,输出的并不是预想中的数字,如果改成System.out.print((char)c);就可以了。为什么一定要转换成字符类型呢
}
bout.close();
bin.close();
in.close();
out.close();

}catch(FileNotFoundException e) {
System.out.println("未找到文件");
}catch(IOException e1) {
System.out.println(e1.getMessage());
}
}
}javaio

解决方案 »

  1.   

        用要用Reader来操作数字,因为Reader是字符流是用来处理字符的。bout.write(int c)是用来写入一个字符的,c表示一个字符的ASCII码,也就是bout.write(i);写入的是某个字符,而这个字符对应的ASCII码是i。
         你应该用OutputStream和InputStream来处理你这种情况。
      

  2.   

    不要用Reader来操作数字,因为Reader是字符流是用来处理字符的。bout.write(int c)是用来写入一个字符的,c表示一个字符的ASCII码,也就是bout.write(i);写入的是某个字符,而这个字符对应的ASCII码是i。你应该用OutputStream和InputStream来处理你这种情况。
      

  3.   

    这不是流的问题。
    你应该再去了解一下byte 与char 的关系。及他们的存储方式。
    你的第一问题,写进去就不是一个char 而是byte (0x01,0x02....) 这些byte转换成char有些是不可见字符,有些是符号,当26个字符也是在内的。好像是64- 90 a -z,97 - 113 A-Z ,记不太清了查一下编码表。
    如果你的 i = 64 是可以转换成可见字符 a 的。第二个问题,它读出来的是byte ,不是char 。如果这个byte是可见字符的编码,转换一下就可以了,否则是乱码或不可见。
      

  4.   

    你的第一个问题:
    bout.write(i);//这样编码,写入txt文件的是一些符号,而不是预想中的0到20的数字。如果改成 ;就可以了,这是为什么呢
    解释:bout.write(i)被调用时,i会被强制类型转换为char。而转换规则是ASCII码表。其中1到31都是映射到一些不可见字符。也就是你在txt中看到的奇怪的字符。。如果你就i从70循环到90你就会看到是一些熟悉的字母了。你改成valueOf之后为什么可以呢? 是因为这个方法实际上是调用了Integer.toString(i,10)。也就是没有用ascii码强制转换,所以你能在txt中看到你想要看到的字符。
    你的第二个问题:
    //这里如果这样写,输出的并不是预想中的数字,如果改成System.out.print((char)c);就可以了。为什么一定要转换成字符类型呢
    解释:其实如果你写入txt中的是那种怪字符的话,你再输出会是你想要的数字。。只是数字之间用一个特定的数字串隔开了,而这个数字串代表换行。。你说的用System.out.print((char)c)这种能正确,是因为你你在文本中记录的比方说数字20。那么如果不强制装换的话是20对应的ascii码。。