2017-03-16 94 views
0

下面是一些读取文件的方法,用于在我的android应用程序中使用的字节数组。将文件读取到字节数组时的冗余字节

  • M1:
private static byte[] readFileAsBytes(String filePath) 
      throws java.io.IOException{ 
     FileInputStream fisTargetFile = new FileInputStream(new File(filePath)); 
     String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8"); 
     byte[] inputData = IOUtils.toByteArray(new StringReader(targetFileStr),"UTF-8"); 
     return inputData; 
} 
  • M2
private static byte[] readFileAsBytes(String filePath) 
      throws java.io.IOException{ 

     File file = new File(filePath); 
     FileInputStream inputFile = new FileInputStream(file); 
     byte inputData[] = new byte[(int)file.length()]; 
     inputFile.read(inputData); 
     inputFile.close(); 
     return inputData; 
    } 

this 还使用方法......

但是,当我调试,我dectect一些多余字节,例如:

文件文本:ABCDEF

当调试:
- 在M1:inputData: {-17,-69,-65,65,66,67,68,69,70}

我知道A - > 65,B - > 66,...但是为什么出现{-17,-69,-65}

-In M2:出现比M1多的冗余。

我已经搜索,但没有发现相同的问题。

对我有任何建议。

谢谢!

+0

这两个片段都是错误的。 – Henry

+0

请对字节值使用十六进制表示法。小数点是不可读的。 – greenapps

+0

'文件文本:ABCDEF'。你有哪些程序/应用程序制作文件?文件的大小是多少? 6或9? 9我相信你有9个价值观。但是ABCDEF只有6个字符。最有可能的前三个值是BOM。一个字节顺序标记。 – greenapps

回答

0
String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8"); 
byte[] inputData = IOUtils.toByteArray(new StringReader(targetFileStr),"UTF-8"); 

不要使用中间字符串或StringReader将文件的字节放入字节数组中。

例如,你不能把一个jpg文件放在字符串中,因为它没有文本。

将字节直接放入字节数组中,就像在第二个readFileAsBytes()中一样。那个应该工作。但是你必须检查inputFile.read(inputData)的返回值;并最终形成一个循环。

三个前导字节是BOM。一个字节顺序标记。参见:https://en.wikipedia.org/wiki/Byte_order_mark

The UTF-8 representation of the BOM is the byte sequence 0xEF,0xBB,0xBF 
+0

第二个不能保证工作(虽然它通常会),因为读取调用不需要读取完整阵列或完整文件。 – Henry