我如何将java.io.File转换为字节[]?
当前回答
可以像这样简单地完成(Kotlin版本)
val byteArray = File(path).inputStream().readBytes()
编辑:
我读过readBytes方法的文档。它说:
将此流完全读入字节数组。 注意:关闭这个流是调用者的责任。
因此,为了能够关闭流,同时保持一切干净,使用以下代码:
val byteArray = File(path).inputStream().use { it.readBytes() }
感谢@user2768856指出这一点。
其他回答
基本上你必须在记忆中读它。打开文件,分配数组,并将文件中的内容读入数组。
最简单的方法是这样的:
public byte[] read(File file) throws IOException, FileTooBigException {
if (file.length() > MAX_FILE_SIZE) {
throw new FileTooBigException(file);
}
ByteArrayOutputStream ous = null;
InputStream ios = null;
try {
byte[] buffer = new byte[4096];
ous = new ByteArrayOutputStream();
ios = new FileInputStream(file);
int read = 0;
while ((read = ios.read(buffer)) != -1) {
ous.write(buffer, 0, read);
}
}finally {
try {
if (ous != null)
ous.close();
} catch (IOException e) {
}
try {
if (ios != null)
ios.close();
} catch (IOException e) {
}
}
return ous.toByteArray();
}
这对文件内容有一些不必要的复制(实际上数据复制了三次:从文件到缓冲区,从缓冲区到ByteArrayOutputStream,从ByteArrayOutputStream到实际的结果数组)。
你还需要确保你只在内存中读取一定大小的文件(这通常取决于应用程序):-)。
您还需要在函数外部处理IOException。
另一种方式是:
public byte[] read(File file) throws IOException, FileTooBigException {
if (file.length() > MAX_FILE_SIZE) {
throw new FileTooBigException(file);
}
byte[] buffer = new byte[(int) file.length()];
InputStream ios = null;
try {
ios = new FileInputStream(file);
if (ios.read(buffer) == -1) {
throw new IOException(
"EOF reached while trying to read the whole file");
}
} finally {
try {
if (ios != null)
ios.close();
} catch (IOException e) {
}
}
return buffer;
}
这没有不必要的复制。
FileTooBigException是自定义应用程序异常。 MAX_FILE_SIZE常量是一个应用程序参数。
对于大文件,您可能应该考虑流处理算法或使用内存映射(参见java.nio)。
如果你的目标版本少于26个API,试试这个
private static byte[] readFileToBytes(String filePath) {
File file = new File(filePath);
byte[] bytes = new byte[(int) file.length()];
// funny, if can use Java 7, please uses Files.readAllBytes(path)
try(FileInputStream fis = new FileInputStream(file)){
fis.read(bytes);
return bytes;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//The file that you wanna convert into byte[]
File file=new File("/storage/0CE2-EA3D/DCIM/Camera/VID_20190822_205931.mp4");
FileInputStream fileInputStream=new FileInputStream(file);
byte[] data=new byte[(int) file.length()];
BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
bufferedInputStream.read(data,0,data.length);
//Now the bytes of the file are contain in the "byte[] data"
正如有人所说,Apache Commons File Utils可能有您正在寻找的东西
public static byte[] readFileToByteArray(File file) throws IOException
示例使用(Program.java):
import org.apache.commons.io.FileUtils;
public class Program {
public static void main(String[] args) throws IOException {
File file = new File(args[0]); // assume args[0] is the path to file
byte[] data = FileUtils.readFileToByteArray(file);
...
}
}
可以像这样简单地完成(Kotlin版本)
val byteArray = File(path).inputStream().readBytes()
编辑:
我读过readBytes方法的文档。它说:
将此流完全读入字节数组。 注意:关闭这个流是调用者的责任。
因此,为了能够关闭流,同时保持一切干净,使用以下代码:
val byteArray = File(path).inputStream().use { it.readBytes() }
感谢@user2768856指出这一点。
推荐文章
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?
- 应该……接住环内还是环外?