使用 Java 从文件末尾移动 100 个字节到文件开头(RandomAccessFile 太慢)
Move 100 bytes from end of file to beginning of file with Java (RandomAccessFile is too slow)
我需要使用 Java(在 android 上)将文件的最后 100 个字节移动到文件的开头。在做了一些研究之后,我有了一个可行的解决方案,但是对于我正在处理的一些较大的文件(最多 2GB)来说它太慢了。我最初尝试在 RandomAccessFile 对象上使用 read() 方法,但它太慢了,所以在进一步挖掘之后,我找到了一种使用 BufferedInputStream 的替代方法,但它似乎根本没有提高性能。
我认为必须有一种更简单、更容易、更快的方法来做到这一点。
这是我的工作代码,它太慢了:
File file = new File(Environment.getExternalStorageDirectory()+"/sam.dll");
RandomAccessFile f;
OutputStream f1;
try {
f = new RandomAccessFile(file, "r");
long size = file.length();
f.seek(size - 100);
FileInputStream fis = new FileInputStream(f.getFD());
BufferedInputStream bis = new BufferedInputStream(fis);
try {
f1 = new FileOutputStream(new File((Environment.getExternalStorageDirectory()+"/sam.dl4")));
for(int i = 0; i < 100; i++) {
f1.write(bis.read());
}
f.seek(0);
bis = new BufferedInputStream(fis);
for(int j =0; j < size - 100;j++) {
f1.write(f.read());
}
f.close();
f1.close();
bis.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
Log.e("blah",e.toString());
} catch (IOException e) {
e.printStackTrace();
}
有什么可以加快速度的建议吗?我会以完全错误的方式解决这个问题吗?我用 C# 和一个 FileStream 对象设置它,它在几秒钟内移动字节(即使是 2GB 的文件)但是使用上面的方法,它实际上需要几个小时。
TIA
如前所述,按字节 I/O 操作会耗尽性能。
合适的方式是:
- 分配适当大小的缓冲区
- 让您的
InputStream
在一次或很少的 I/O 操作中填充缓冲区
- 操纵缓冲区
- 让你的
OutputStream
在一次或很少的 I/O 操作中将缓冲区刷新到磁盘
在Java中(仅使用类你已经用过):
byte[] buf = new byte[4096];
// lengthRead is the count of bytes read
int lengthRead = inputStream.read(buf);
doBufferMagic(buf, lengthRead);
outputStream.write(buf, 0, lengthRead);
我需要使用 Java(在 android 上)将文件的最后 100 个字节移动到文件的开头。在做了一些研究之后,我有了一个可行的解决方案,但是对于我正在处理的一些较大的文件(最多 2GB)来说它太慢了。我最初尝试在 RandomAccessFile 对象上使用 read() 方法,但它太慢了,所以在进一步挖掘之后,我找到了一种使用 BufferedInputStream 的替代方法,但它似乎根本没有提高性能。
我认为必须有一种更简单、更容易、更快的方法来做到这一点。
这是我的工作代码,它太慢了:
File file = new File(Environment.getExternalStorageDirectory()+"/sam.dll");
RandomAccessFile f;
OutputStream f1;
try {
f = new RandomAccessFile(file, "r");
long size = file.length();
f.seek(size - 100);
FileInputStream fis = new FileInputStream(f.getFD());
BufferedInputStream bis = new BufferedInputStream(fis);
try {
f1 = new FileOutputStream(new File((Environment.getExternalStorageDirectory()+"/sam.dl4")));
for(int i = 0; i < 100; i++) {
f1.write(bis.read());
}
f.seek(0);
bis = new BufferedInputStream(fis);
for(int j =0; j < size - 100;j++) {
f1.write(f.read());
}
f.close();
f1.close();
bis.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
Log.e("blah",e.toString());
} catch (IOException e) {
e.printStackTrace();
}
有什么可以加快速度的建议吗?我会以完全错误的方式解决这个问题吗?我用 C# 和一个 FileStream 对象设置它,它在几秒钟内移动字节(即使是 2GB 的文件)但是使用上面的方法,它实际上需要几个小时。
TIA
如前所述,按字节 I/O 操作会耗尽性能。
合适的方式是:
- 分配适当大小的缓冲区
- 让您的
InputStream
在一次或很少的 I/O 操作中填充缓冲区 - 操纵缓冲区
- 让你的
OutputStream
在一次或很少的 I/O 操作中将缓冲区刷新到磁盘
在Java中(仅使用类你已经用过):
byte[] buf = new byte[4096];
// lengthRead is the count of bytes read
int lengthRead = inputStream.read(buf);
doBufferMagic(buf, lengthRead);
outputStream.write(buf, 0, lengthRead);