是这样子的:
疑问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:我往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.");
}
}
→→→修改→→→
//应该是4个byte啊,为什么长度不是4??
虽然参数是整数,但是,写入的其实是一个字节,
这个参数的低位被写入,高位被丢失。
我这样说,能明白吗 ?
一个整数,用四个字节长度的变量来保存。
调用write方法之后,写入IO的数据,其实只是 byte b = 0x11;
其余部分被丢失。换句话说,
fos.write(n);
fos.write(b);
这两句的执行结果,效果是一样的。
因为,变量n的高位(0x443322)已经被丢弃了。
你这句定义的数组长度已经是1了
为什么会有这种情况呢?只写入低位的那8 bit?
难道我想写入一个int,要自己把int转为4 byte??
java api的bug??
比如,整型数据(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都针对字节数组来进行操作,
而不是,针对一个字节(或者你认为的整数)进行写入,
而针对字节数组进行读取。
API 上面是这样写的
public void write(int b) throws IOException
将指定字节写入此文件输出流。
看清楚了吗?是将字节写入。一个INT 占四个字节,所以就把最低的那个字节写入咯!
我大概明白楼主的意思,楼主就是想 把一个 int 写入文件,但是int是JAVA的基本类型,所以运行之后不能用记事本打开,要用查看二进制的文件打开,看到的是二进制码。
要是楼主想运行之后能直接用记事本打开的,就用String,再用字符流(writer)写入文件,这样就行了!
呵呵,谢谢,我大概明白了。现在还是有点奇怪,既然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 ,真是让人意外...
是这样的吧