嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本或二进制文件。 一个示例是将文件的内容转换为String以便显示。 不幸的是,用于表示文件和目录的Java的File类没有方法toByteArray()
。 它仅保存路径,并允许您执行某些操作,例如打开和关闭文件,但不允许直接将File转换为字节数组 。 无论如何,无需担心,因为还有其他几种将File读入字节数组的方法,您将在此Java文件教程中学习这些方法。
如果您像我一样是Apache Commons和Google Guava的粉丝,那么您可能已经熟悉单行代码,该代码可以将文件快速读取为字节数组。 如果不是,那么现在正是探索这些API的合适时机。
在本教程中,我们将看到7个不同的示例,以将File读取为字节数组 ,一些示例使用第三方库,而另一些示例使用JDK 6和JDK 7核心Java库。
根据您的选择,可以使用以下任何一种方法将文件数据转换为字节。 要记住的一件事是您对字节数组的处理方式。 如果要从字节数组创建String ,请提防字符编码。 您可能需要通过读取元数据信息(例如HTML页面和XML文档的Content-Type)来找出正确的字符编码。
在读取XML文档时,首先读取XML文件并将其存储在String中是个坏主意。 相反,最好将InputStream
传递给XML解析器,它们将自己正确地确定编码。
还有一点要注意的是,您不能将大于2GB的文件读取到一个字节数组中,为此您需要多个字节数组。 此限制来自Java中的数组索引为int类型,其最大值为2147483647
,大约等于2GB 。
顺便说一句,我希望您总体上熟悉基本的Java编程和Java API。
用Java将文件读入字节数组的7种方法
在不浪费您更多时间的情况下,以下是将文件加载到Java中的字节数组中的所有七种方法:
1)使用Apache Commons IOUtils
如果您不讨厌第三方库,这是将文件数据读入字节数组的最简单方法之一。 它之所以有用,是因为您不需要从头开始编写代码,也不必担心异常处理等。
byte [] filedata = IOUtils.toByteArray( new FileInputStream( "info.xml" [] filedata = IOUtils.toByteArray( "info.xml" ));
IOUtils.toByteArray(InputStream input)
获取以下内容:
InputStream作为byte [] 。 此方法还在内部缓冲输入,因此无需使用BufferedInputStream
,但它不是null安全的。 如果输入为null
,则抛出NullPointerException
。
2)使用Apache Commons FileUtils
org.apache.commons.io
包中的FileUtils class
提供了常规的文件操作功能,例如写入文件或从文件读取。 此方法用于将文件的内容读取到字节数组中,这的好处是文件始终处于关闭状态。
byte [] data = FileUtils.readFileToByteArray( new File( "info.xml" ));
3)使用FileInputStream和JDK
这是将文件内容读入字节数组的经典方法。 完成操作后,别忘了关闭流 。 这是使用Java中的FileInputStream类将文件读入字节数组的代码:
public static byte [] readFile(String file) throws IOException {
File f = new File(file);
// work only for 2GB file, because array index can only up to Integer.MAX
byte [] buffer = new byte [( int )f.length()];
FileInputStream is = new Fi