java读取文件时 int强制转换为 byte,是如何保证结果正确的??不是损失了精度吗??

import java.io.*;
public class InputStreamDemo04{
public static void main(String args[]) throws Exception{ // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f= new File("d:" + File.separator + "test.txt") ; // 声明File对象
// 第2步、通过子类实例化父类对象
InputStream input = null ; // 准备好一个输入的对象
input = new FileInputStream(f) ; // 通过对象多态性,进行实例化
// 第3步、进行读操作
byte b[] = new byte[(int)f.length()] ; // 数组大小由文件决定
for(int i=0;i<b.length;i++){
b[i] = (byte)input.read() ; // 读取内容===================这里=======================
}
// 第4步、关闭输出流
input.close() ; // 关闭输出流\
System.out.println("内容为:" + new String(b)) ; // 把byte数组变为字符串输出
}
};
上面是读取txt文件的代码,上面代码中input.read()返回的是int数组,强制转换byte明显失去精度,打印出来页显示int类型和byte类型数据不一致,可结果确是对的,能否稍微解释下,谢谢!

楼主没有真正理解input.read()这个方法,它的返回值是下一个读取的byte值(会自动转换为int),或者-1(表示读到文件尾,注意,这个-1 是int型),而楼主强行将其转换成byte,将不会产生数据溢出,故此结果是正确的,为效率性能计,建议楼主采用public int read(byte[] b)这个方法。追问

意思是它本来就是读取的下一个byte值,所以再转换回去不会错?
public int read(byte[] b)方法如果读取一个大文件,是不是就要一次性给足空间,不能用来读取超过内存的大文件,不知道这样理解对不对?

追答

第一个问题如你理解的一样,本身是byte值,转成int后在转回来不过是补位后又去位,最终不会出现数据的益处或错位。
第二个问题,其实不需要给足够的空间,byte[] 数组相当与一个缓存,执行read(b)的时候相当与将数据读取到缓存中,返回值是读取byte的个数,如果没有读到(比如文件到尾)此时返回-1.
一般做法是这样:
byte[] buf = new byte[1024];
int size = -1;
StringBuilder result = new StringBuilder();
while((size=input.read(buf)) != -1){
result.append( new String(buf,0,size) );
}
input.close();
System.out.println(result.toString());

你可以尝试一下,另外如果你对java的io不是很清楚的话我们可以相互交流,推荐你弄懂io后,可以看看java的新IO,nio. nio是jdk1.4之后推出的,对性能有很大提升。
欢迎你访问我的网站 www.zhaowen8.com ,共同学习Java

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-24
强制转换是一种方法的。但这个对小文件,正确来讲,是一次读完

// 第3步、进行读操作
byte b[] = new byte[(int)f.length()] ; // 数组大小由文件决定
input.read(b) ; // 读取内容===================这里=======================

这样就不需要int和byte之间的转换了。

对于大文件,是不可能一次全读入内存的,另论。追问

学习中,谢谢~

本回答被网友采纳

...byte,是如何保证结果正确的??不是损失了精度吗??
楼主没有真正理解input.read()这个方法,它的返回值是下一个读取的byte值(会自动转换为int),或者-1(表示读到文件尾,注意,这个-1 是int型),而楼主强行将其转换成byte,将不会产生数据溢出,故此结果是正确的,为效率性能计,建议楼主采用public int read(byte[] b)这个方法。

JAVA里int型强制转化成byte型
因为java的byte类型只占一个字节,即2的8次方,表示的范围是0~127,128溢出了当做0,129为1,以此类推。所以 257转换为byte后的值为:257-128-128=1323转换为byte后:323-128-128=67

在Java中int转byte类型,超出byte的范围该如何计算,答案尽可能详细_百 ...
一个字节byte长8位,也就是2的8次方,换成2进制后就是 00000000~11111111 取值范围就是那么多,10进制就是0~255。如果更长的类型如int转成更短的类型,那么只保留短类型那么多长度的数据。假设类型A为9位,其某变量值为 0 1111 1111 ,10进制为255,转成byte正好也是255 假设类型A变量值为 1 ...

java 强制类型转化:
byte b ;b=120; \/\/不会出错.是因为120java中默认是int型,也就是你在赋值的时候java中默认的转换成byte型了而byte型的存储范围是-128-127由int型120到byte型120并没超出byte的存储空间,所以不会报错,而如果你将其换成,128则会报"cannot convert from int to byte" 因为已经超出了存储范围了 b...

JAVA中int强制转换byte怎么理解?
int 是32位 4个字节 8位1字节\\x0d\\x0aint转换成byte 前面的3个字节 即24位 直接砍掉 就剩最后一位\\x0d\\x0a所以 266 ——(00000000)(00000000)(00000001)(00001010)\\x0d\\x0a== 0001010 = 1* 2 + 1 *2*2*2 = 10\\x0d\\x0a最开始的0 表示是正数\\x0d\\x0a如果是1...

在Java中int类型强转为byte类型,强转为byte之后,数据超出byte的表述范围...
byte的最小值是-128,最大值是127,就好像一杯水的容量是有限的,当你杯子的水装满了,自然也就会溢出,127就好像是杯子最上面的那一层水,你只要加上一滴,就会溢出,流到杯子底部,而杯子的最底部就是-128。按照这种逻辑,你的i+r=156,也就是有28流到了底部,最底部是-128,被28覆盖了28,...

JAVA中怎么将int数据转换为byte数据?
JAVA中根据以下代码将int数据转换为byte数据: public static byte[] int32ToBytes(int val) { int size = Integer.SIZE \/ Byte.SIZE; byte[] ret = new byte[size]; for (int i = 0; i < size; ++i) { ret[i] = (byte) (val << (8 * i) >> 56); } return ret...

java的类型转换报错: 不兼容的类型: 从int转换到byte可能会有损失
0x80如果不记述的话就是作为int类型,int是第一位是有符号的,0x80 大于127的数字,所以占用两位,byte只能占用一位,当然会出错。 如果要使用int赋值byte 0x80必须使用负数。 或者使用byte进行强制转换 byte a = (byte)0x80

Java中的强制类型转换是如何转换的?
java中数据类型的强制转换是通过强制转换语句完成的,强制转换语句的格式为“目标数据类型 变量 = (目标数据类型) 数据;”。下面给出例子:1、定义两个字节数据类型a、b、c,分别赋予1和2和a+b的值,进行加法运算的式子a+b=3,得出的结果“3”将会被编译环境判定为整形数据,把这个整形数据赋值...

在Java中int类型强转为byte类型,强转为byte之后,数据超出byte的表述范围...
int类型是4字节 byte是1字节 强转为byte会超出表示范围 超出表示范围就会去掉int类型的3字节 只是我不知道是哪三个

相似回答