是这样子的:
疑问1:我往log.txt中写入一int为 0x 0001 0000,然后再以byte的形式读出来,为什么读出来的byte[]长度不是4呢?
疑问2:我写入0x 0001 0000时,我用二进制阅读工具直接查看log.txt信息,发现其只有一个 字节,为 0,这是为什么?
谢谢...
public class Test {
public static void main(String[] args) {
try {
writeSmsFile();
readSmsFile();
} catch (Exception e) {
e.printStackTrace();
}
} private static void writeSmsFile() throws Exception {
File file = new File("log.txt");
if (file.exists()) {
file.delete();
}
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
//写入 int
fos.write(0x00010000);
fos.flush();
fos.close();
System.out.println("WriteToFile End.");
} private static void readSmsFile() throws Exception {
File file = new File("log.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();
//此处输出长度值为: 1, 一个int是32bit,应该是4个bit啊,为什么长度不是4??
System.out.println("read->data.length=" + data.length);
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
System.out.println("readSmsFile End.");
}
}

解决方案 »

  1.   

    代码中的注释有误://应该是4个bit啊,为什么长度不是4??
    →→→修改→→→
    //应该是4个byte啊,为什么长度不是4??
      

  2.   

    write方法。
    虽然参数是整数,但是,写入的其实是一个字节,
    这个参数的低位被写入,高位被丢失。
    我这样说,能明白吗 ?
      

  3.   

    int n = 0x44332211;
    一个整数,用四个字节长度的变量来保存。
    调用write方法之后,写入IO的数据,其实只是 byte b = 0x11;
    其余部分被丢失。换句话说,
    fos.write(n);
    fos.write(b);
    这两句的执行结果,效果是一样的。
    因为,变量n的高位(0x443322)已经被丢弃了。
      

  4.   

    问题1:byte[] data = new byte[(int) file.length()];
    你这句定义的数组长度已经是1了
      

  5.   


    为什么会有这种情况呢?只写入低位的那8 bit?
    难道我想写入一个int,要自己把int转为4 byte??
    java api的bug??
      

  6.   

    呵呵。楼主可能对底层通信不太了解,其实,write方法,这样实现,还是有一定的道理的。比特流传输数据,所要传输的信息,都要有相应的数据结构。
    比如,整型数据(int),一般由4个字节的变量表示,
    如果传输,你是先传输高位字节,还是,低位字节呢 ?
    这个选择,其实,应该交给程序员来决定,因为,我们这个时候,是面向字节编程的。读写一致,我还没有理解是什么意思。
    InputStream和OutputStream里面,都有一个相对应的读写方法。
    in.write(int b);和int n = out.read();
    这两个方法,都是读写一个字节的内容。
    都是高位截断(填充),保留低位。
    由于读取出的字节用整型表示都是正数,
    所以,当n是负数时,可以表示其他情况,
    比如,IO已经读取完毕,或是已经到了末尾了,没有数据了。既然要实现读写一直,那么,楼主在编程时,就要使用相对应的方法来进行。
    比如:
    byte bi[] = new byte[]{0x44,0x33,0x22,0x11};
    in.write(bi);in.flush();byte bo[] = new byte[4];
    int n = out.read(bo);
    //n==4都针对字节数组来进行操作,
    而不是,针对一个字节(或者你认为的整数)进行写入,
    而针对字节数组进行读取。
      

  7.   

    我是这样理解的:
    API 上面是这样写的
         public void write(int b) throws IOException
             将指定字节写入此文件输出流。
    看清楚了吗?是将字节写入。一个INT 占四个字节,所以就把最低的那个字节写入咯!
    我大概明白楼主的意思,楼主就是想 把一个 int 写入文件,但是int是JAVA的基本类型,所以运行之后不能用记事本打开,要用查看二进制的文件打开,看到的是二进制码。
    要是楼主想运行之后能直接用记事本打开的,就用String,再用字符流(writer)写入文件,这样就行了!
      

  8.   


    呵呵,谢谢,我大概明白了。现在还是有点奇怪,既然OutputStream的write方法支持写int,但结果却只写入低位的8bit,不仔细的话太容易让人误解了。
    查了下api:public void write(int b)
               throws IOException
    Writes the specified byte to this file output stream. Implements the write method of OutputStream. Specified by:
    write in class OutputStream
    Parameters:
    b - the byte to be written. 只是byte, XX ,真是让人意外...
      

  9.   

            byte[] data = new byte[(int) fis.available()];
    是这样的吧