【发布时间】:2022-01-01 14:11:10
【问题描述】:
我们如何在 Java 中将字节数组写入文件(并从该文件中读取)?
是的,我们都知道已经有很多这样的问题,但是由于有很多方法可以完成这项任务,因此它们变得非常混乱和主观。
所以让我们缩小问题的范围:
域:
- 安卓/Java
我们想要什么:
- 快(尽可能)
- 无错误(以严格细致的方式)
我们没有做什么:
- 第三方库
- 任何需要高于 23 (Marshmallow) 的 Android API 的库
(所以,排除了Apache Commons、Google Guava、Java.nio,剩下的是good ol' Java.io)
我们需要什么:
- 字节数组在经过先写后读过程后总是完全相同(内容和大小)
- Write 方法只需要两个参数:File 文件和 byte[] 数据
- Read 方法返回一个字节[],并且只需要一个参数:文件文件
在我的特定情况下,这些方法是私有的(不是库)并且不负责以下内容,(但如果您想创建一个适用于更广泛受众的更通用的解决方案,去吧):
- 线程安全(文件不会同时被多个进程访问)
- 文件为空
- 文件指向不存在的位置
- 文件位置缺少权限
- 字节数组太大
- 字节数组为空
- 处理任何“索引”、“长度”或“附加”参数/功能
所以......我们正在寻找未来人们可以认为可以安全使用的最终防弹代码,因为您的答案有很多赞成票,并且没有 cmets 说,“如果...可能会崩溃。”
这是我目前所拥有的:
将字节写入文件:
private void writeBytesToFile(final File file, final byte[] data) {
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
}
从文件中读取字节:
private byte[] readBytesFromFile(final File file) {
RandomAccessFile raf;
byte[] bytesToReturn = new byte[(int) file.length()];
try {
raf = new RandomAccessFile(file, "r");
raf.readFully(bytesToReturn);
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
return bytesToReturn;
}
根据我的阅读,可能的例外是:
FileNotFoundException:我是否正确,只要提供的文件路径是使用 Android 自己的内部工具派生的和/或如果应用程序经过正确测试,这种情况就不应该发生?
IOException :我真的不知道是什么导致了这种情况......但我假设如果它确实没有办法解决它。
考虑到这一点……这些方法可以改进或替换吗?如果可以,用什么方法?
【问题讨论】:
-
一个改进是使用 try-with-resources 而不是手动调用
close()。您也未能在您的读取方法中关闭RandomAccessFile。 -
IOException可能是存储空间不足引起的。
-
或者权限问题。
标签: java android arrays file java-io