2013-02-25 66 views
0

我有一个文件,我试图二进制编辑来切断标题。在java中的二进制编辑

我已经确定的实际数据我想保留在文件中的起始地址,但我想找到Java中的方式,我可以指定一个范围的字节从文件中删除。

目前我正在读取(Buffered)FileInputStream中的文件,并且我可以看到切断此文件头的唯一方法是从我的起始地址保存到内存中文件的末尾,然后写出来覆盖原始文件。

有什么功能来删除文件位,而不需要经过创建一个全新的文件的过程?

+0

如果你是在Unix或Linux,你可以用'尾-c + NNN'其中_NNN_是文件中开始复制的偏移量(即跳过也注意到没有放缓字节0至NNN-1 – 2013-02-25 07:25:18

+0

我不这么认为,AFAIK甚至不可能在底层的OS API中使用,你可以使用RandomAccessFile来覆盖文件的开头,但这可能比它更值钱。只要将它写入到一个新文件。 – starblue 2013-02-25 07:45:36

+0

这是一个程序我建立这样的Unix命令不会太顺利。我有一个看的RandomAccessFile以及FileChannel,SeekableByteChannel但他们似乎都难以截断的功能文件到一个给定的大小,这是关于你尽可能去 – Antix 2013-02-25 08:23:25

回答

1

有截断文件(setLength)的方法,但没有API来从内部取出的任意序列。

如果该文件是如此之大,有一个性能问题重写它,我建议将其分割成几个文件。通过使用RandomAccessFile寻求删除点,从那里重写然后截断,可能会获得一些性能。

+0

我看到的方法也可以,但看起来如果我想删除页脚,那么它会很酷。我最终使用FileChannel类中的transferTo()重写了临时文件。我已经在 – Antix 2013-02-25 08:25:37

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(); 
     } 
    } 
} 
+0

之下发布了我的代码段这不符合Antix的要求。该文件的长度是相同的。文件中只有\ 0个字符而不是原始字符。我认为Antix希望从文件中删除角色。操作后文件应该是numberOfCharsToRemove更短。 – Andreas 2013-02-25 08:23:12

+0

我需要从文件中实际删除这些位,所以这可以将数据归零,但在实际数据之前它仍然有一个大量的0头。编辑:殴打:) – Antix 2013-02-25 08:34:30

0

我找不到任何API方法来执行我想要的东西(云上面的答案)

我解决了它的只是重新写回文件出来一个新的文件,然后替换旧的与新的一个。

我用下面的代码进行替换:

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

chanIn.transferTo(pos, chanIn.size(), chanOut); 

若pos是开始文件传输,直接,我切了这个文件的标题下出现我的起始地址。

我一直在使用这种方法