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之间的转换了。

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

学习中,谢谢~

本回答被网友采纳
相似回答