Java中File长度与Byte[]大小不匹配问题求助
问题原因与解决方案
问题根源
你用ImageIO.read()读取图片时,程序会解码JPG文件的像素数据,同时丢弃原文件里的JPG压缩参数、EXIF元数据、缩略图等额外信息。之后调用ImageIO.write()时,会用Java默认的JPG压缩配置重新编码像素数据,生成的byte[]是重新压缩后的结果,自然和原文件大小不一致。
解决方案
根据你的需求,分两种情况处理:
1. 仅需判断原文件大小(无需处理图片内容)
直接读取原文件的字节数组,跳过ImageIO的解码编码流程,得到的byte[]大小和原文件完全一致:
File file = new File("path/photo.jpg"); // 方法1:使用Files.readAllBytes(Java 7+) byte[] data = Files.readAllBytes(file.toPath()); // 方法2:使用FileInputStream手动读取 /* FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int readLen; while ((readLen = fis.read(buffer)) != -1) { bos.write(buffer, 0, readLen); } byte[] data = bos.toByteArray(); // 记得关闭流 fis.close(); bos.close(); */ System.out.println("byteSize:" + data.length); // 输出与file.length()完全一致
2. 必须处理图片内容(如修改像素后生成byte[])
如果需要先编辑图片再生成byte[],那么这个新byte[]的大小就是重新编码后的真实大小。原文件的大小无法从处理后的byte[]中获取——因为原文件的压缩参数、元数据等信息已经在解码时丢失,且重新编码使用的是默认配置,和原文件逻辑不同。这种情况下,你需要提前读取并保存file.length()的值,作为原文件的真实大小。
内容的提问来源于stack exchange,提问作者user404
相关产品推荐
相关产品推荐

