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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

参考技术A 强制转换是一种方法的。但这个对小文件,正确来讲,是一次读完

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

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

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

学习中,谢谢~

java中byte[]转换成int

byte[] a=new byte(10);
从文件读取的数据a=[00:20.19]这10个字符,怎样让int a,b,c;
a=00;b=20;c=19.我是想把那延迟时间加上,还有什么好方法么

java中byte转换为 int有两种情况,一种是要求保持值不变,例如进行数值计算,可采用强制类型转换:int i = (int) aByte;
另一种是要求保持最低字节中各个位不变,3个高字节全部用0填充,例如进行编解码操作,
则需要采用位操作:int i = b & 0xff;

int InputStream.read()
该函数返回一个int类型,范围从0至255,如果到达流末尾,返回-1。通过ByteArrayInputStream的源码可以看到是如何从byte转到int
public synchronized int read()
return (pos < count) ? (buf[pos++] & 0xff) : -1;


注意,不是自动转的,需要强制做处理。
参考技术A 你可以用StringTokenizer,
StringTokenizer t = new StringTokenizer("[:.]");
意思是说以""内的所有字符区分获得的a里的字符段.
然后用
while(t.hasMoreToken)
Sting b = t.nextToken;

获得不同的b分别对应00,20,19本回答被提问者采纳

以上是关于java读取文件时 int强制转换为 byte,是如何保证结果正确的??不是损失了精度吗??的主要内容,如果未能解决你的问题,请参考以下文章

int类型和byte类型的强制类型转换

JAVA中int强制转换byte

socketRead0(FileDescriptor, byte[], int, int, int)

JAVA中int强制转换byte

java中int如何转换byte

强制类型转换(Java)