我有一个文件,我正在尝试二进制编辑以切断标题。
我已经确定了要保留在文件中的实际数据的起始地址,但是我试图在Java中找到一种方法,我可以在其中指定要从文件中删除的字节范围。
目前我在(Buffered)FileInputStream中读取文件,我能看到切断此文件头的唯一方法是从我的起始地址保存到内存中文件的末尾,然后写出来覆盖原始文件。
是否有任何功能可以删除文件中的位而无需经历创建全新文件的过程?
答案 0 :(得分:1)
有一种截断文件的方法(setLength),但没有API可以从内部删除任意序列。
如果文件太大以至于重写它存在性能问题,我建议将其拆分为多个文件。通过使用RandomAccessFile寻找删除点,从那里重写然后截断,可以获得一些性能。
答案 1 :(得分:0)
试试这个,它使用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();
}
}
}
答案 2 :(得分:0)
我找不到任何API方法来执行我想要的(与上面的答案一致)
我解决了这个问题,只需将文件重新写回新文件,然后用新文件替换旧文件。
我使用以下代码执行替换:
FileOutputStream fout = new FileOutputStream(inFile.getAbsolutePath() + ".tmp");
FileChannel chanOut = fout.getChannel();
FileChannel chanIn = fin.getChannel();
chanIn.transferTo(pos, chanIn.size(), chanOut);
其中pos是我开始文件传输的起始地址,它直接发生在我正在删除此文件的标题下。
我也注意到使用这种方法没有减速