首先来说一下FileInputStream的问题:
  有这样一段代码:
FileInputStream f=new FileInputStream("teat.txt");
int i;  int b=f.read();
for(i=0;b!=-1;i++)
{System.out.print((char)b);
b=f.read();
}
关于read()方法的说明是:从输入流中读取一个数据字节,返回下一个数据字节,如果到达文件末尾返回-1。
我的问题是:既然f.read()方法是从输入流中读取的一个数据字节,为什么返回的时候,却变成了一个int型的4个字节的数据?
这样在从文件流中读取数据应该是有影响的 啊。这个read方法为什么要设计成这样的呢?
另外,我还有一段代码不理解:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class JDataTest {
          public static void main(String[] args) {
try {
FileOutputStream fout =new FileOutputStream("q:\\out.txt");
DataOutputStream dfout=new DataOutputStream(fout);
int i;
for (i=0;i<4;i++)
{
dfout.writeInt('0'+i);

}
dfout.close();

FileInputStream fin=new FileInputStream("q:\\out.txt");
DataInputStream dfin=new DataInputStream(fin);
for(i=0;i<4;i++)
System.out.print(dfin.readInt()+", ");
dfin.close();
}catch(Exception e)
{
System.out.println("发生异常:"+e.getMessage());
e.printStackTrace();
}
}
}运行结果是:
控制台输出为:48, 49, 50, 51,
然后我的q盘中多了一个out.txt文件 文件中的内容为:   0   1   2   3  
注意0前面有3个空格
我不明白控制台为什么输出48, 49, 50 ,51, 往out.txt写入数据时,3个空格是哪里来的?
坐等高人救命啊              

解决方案 »

  1.   

    第一个问题:
    在不抛异常的情况下,返回int才可以表达到达文件尾这种特殊情况,
    当然, 其实也可以设计成 返回byte,  到达文件尾时抛异常di二个问题:
    用十六进制编辑器查看out.txt 应该是这样的
    00 00 00 30 00 00 00 31 00 00 00 32 00 00 00 33
    可以看出,那不是空格 0x20 ,而是0x00, 但这个字符没法显示, 只好当成空格了
      

  2.   

    第一个疑问:read是一个native方法,执行时调用底层C/c++写的方法,具体不知道怎么执行的,所以也不知道为什么要弄成int型的返回值。
    第二个,写入文件时是用int形式写入的,也就是说每4个字节写入时是一个整体,而如果在XP简体中文系统下打开txt文件时,默认是用gbk字符集解码,会把两个字节看成一个整体来读出,所以会解码错误。
      

  3.   

    对于第一个问题,因为read()方法每次读入的是一个字节的数据,而返回的却是一个4个字节的int型数据,那多出来的三个字节怎么办?用0补充么?  api文档里面没有说read()方法是一个native方法啊 ……纠结啊 
    对于第二个问题:
    那为啥控制台输出的是48, 49 ,50 ,51呢?谁能解释一下这些数据是怎么来的?
      

  4.   

    控制台输出的是48, 49 ,50 ,51呢?
    首先  dfout.writeInt('0'+i);  0的ASC码为48 ,然后 写入文件的依次为48 49 50 51(以java字符写入),然后你再用readInt()去读,读出到控制台(以java字符)为 48 49 50 51,至于打开文件,应该是用windows默认字符(我也不知道是什么)读取的,读出来的是什么就不知道了这里只强调  java字符流用什么写入的(比如此题是DataOutputStream)  读文件时就得用DataInputStream才能正确读取