我有一个文件,我试图对其进行二进制编辑以切断标题。
我已经确定了要保留在文件中的实际数据的起始地址,但是我试图在 Java 中找到一种方法,在该方法中我可以指定要从文件中删除的字节范围。
目前我正在(缓冲)FileInputStream中读取文件,我能看到切断该文件标题的唯一方法是将我的起始地址保存到内存中的文件末尾,然后将其写出来覆盖原始文件。
是否有任何功能可以删除文件中的位而无需经历创建全新文件的过程?
有一种截断文件的方法(setLength),但没有 API 可以从内部删除任意序列。
如果文件太大以至于重写时存在性能问题,我建议将其拆分为多个文件。通过使用 RandomAccessFile 寻找删除点,从那里重写然后截断,可能可以获得一些性能。
试试这个,它使用 RandomAccessFile 清除文件中不需要的部分,首先查找起始索引,然后再清除不需要的字符。
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Main {
public static void main(String[] args) {
int startIndex = 21;
int numberOfCharsToRemove = 20;
// Using a RandomAccessFile, overwirte the part you want to wipe
// out using the NUL character
try (RandomAccessFile raf = new RandomAccessFile(new File("/Users/waleedmadanat/Desktop/sample.txt"), "rw")) {
raf.seek(startIndex);
for (int i = 1; i <= numberOfCharsToRemove; i++) {
raf.write('\u0000');
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
我找不到任何 API 方法来执行我想要的(与上面的答案一起)
我解决了这个问题,只需将文件重新写入一个新文件,然后用新文件替换旧文件。
我使用以下代码执行替换:
FileOutputStream fout = new FileOutputStream(inFile.getAbsolutePath() + ".tmp");
FileChannel chanOut = fout.getChannel();
FileChannel chanIn = fin.getChannel();
chanIn.transferTo(pos, chanIn.size(), chanOut);
其中 pos 是我开始文件传输的起始地址,它直接出现在我从这个文件中剪切出来的标题下。
我也注意到使用这种方法没有减速