java中的二进制编辑

java中的二进制编辑,java,file,byte,Java,File,Byte,我有一个文件,我正试图二进制编辑,以切断一个标题 我已经确定了我想要保存在文件中的实际数据的起始地址,但是我正在尝试在Java中找到一种方法,可以指定要从文件中删除的字节范围 目前,我正在读取一个(缓冲)FileInputStream中的文件,我能看到的切断该文件头的唯一方法是将我的起始地址保存到内存中文件的结尾,然后将其写出来,覆盖原始文件 是否有任何功能可以删除文件中的位而不必经历创建一个全新文件的过程?有一种方法可以截断文件(),但没有API可以从内部删除任意序列 如果文件太大以至于重写时

我有一个文件,我正试图二进制编辑,以切断一个标题

我已经确定了我想要保存在文件中的实际数据的起始地址,但是我正在尝试在Java中找到一种方法,可以指定要从文件中删除的字节范围

目前,我正在读取一个(缓冲)FileInputStream中的文件,我能看到的切断该文件头的唯一方法是将我的起始地址保存到内存中文件的结尾,然后将其写出来,覆盖原始文件


是否有任何功能可以删除文件中的位而不必经历创建一个全新文件的过程?

有一种方法可以截断文件(),但没有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();
        }
    }
}
导入java.io.File;
导入java.io.IOException;
导入java.io.RandomAccessFile;
公共班机{
公共静态void main(字符串[]args){
int startIndex=21;
int numberOfCharsToRemove=20;
//使用RandomAccessFile,覆盖要擦除的零件
//使用NUL字符输出
try(RandomAccessFile raf=新的RandomAccessFile(新文件(“/Users/waleedmadanat/Desktop/sample.txt”),“rw”)){
英国皇家空军搜索(startIndex);

对于(inti=1;i我找不到任何API方法来执行我想要的(与上面的答案一致)

我解决了这个问题,只需将文件重新写入一个新文件,然后用新文件替换旧文件

我使用以下代码执行替换:

FileOutputStream fout = new FileOutputStream(inFile.getAbsolutePath() + ".tmp");
FileChannel chanOut = fout.getChannel();
FileChannel chanIn = fin.getChannel();

chanIn.transferTo(pos, chanIn.size(), chanOut);
其中pos是我开始文件传输的起始地址,它直接出现在我从该文件中剪切出来的标题下


我还注意到,使用此方法不会减慢速度

如果您在Unix或Linux上,则可以使用
tail-c+NNN
其中NNN是文件中开始复制的偏移量(即跳过字节0到NNN-1。我不这么认为,因为在底层操作系统API中甚至不可能这样做。您可以使用
RandomAccessFile
覆盖文件的开头,但这可能比它的价值更麻烦。只需将其写入一个新文件。这是我正在构建的程序的一个功能,因此unix命令不会工作得太好。)l、 我查看了RandomAccessFile和FileChannel,SeekableByteChannel,但它们似乎都很难将文件截断为给定的大小,这是您所能做到的。这并不是Antix想要的。文件的长度是相同的。文件中只有\0个字符,而不是原始字符。我认为Antix想要要从文件中删除的e个字符。操作后,文件应缩短numberOfCharsToRemove。我需要从文件中实际删除位,这样可以将数据置零,但在实际数据之前仍有大量0的头。编辑:beat:)我也看到了这个方法,但看起来如果我想删除一个页脚,那就太酷了。我最后在FileChannel类中使用transferTo()重新写入了一个临时文件。我在下面发布了我的代码片段