在Java 7中删除二进制文件的一部分的最佳方法是什么

保罗·泰勒

即我有一个10 mb的文件,我想删除1M到2M的字节,所以结果文件是9mb,其中以2m字节开始的数据到文件中现在是1M

我使用Java 7可以制作NIO,文件通常为10MB,并且经常通过网络访问,因此我正在寻找一种性能良好的优雅解决方案。

我知道BteBuffer.allocateDirect()和File.getChannel()但我正在努力解决是否有办法做我想做的事,而不必为了写回而从文件通道向临时缓冲区写入8MB提交到其他位置,或者如果使用allocateDirect(),实际上可以吗

埃文·范德泽

我认为在磁盘上使用临时文件的方法是一种很好的方法。如果您可以在磁盘上创建新的临时文件,那么nio确实有一些选项可以为您提供帮助。我只是在这里使用API​​和nio教程,但似乎FileChannel.transferFrom还是FileChannel.transferTo您需要的工具。

我尚未测试以下代码,但它应为您指明正确的方向。

public static void main(String[] args) {
    int megaByte = 1024 * 1024;
    // prepare the paths
    Path inPath = Paths.get("D:/file.dat"); // java.nio.file.Paths
    Path outPath; // java.nio.file.Path
    try {
        outPath = Files.createTempFile(null, "swp"); // java.nio.file.Files
    } catch (IOException ex) {
        throw new IOError(ex);
    }

    // process the file
    try (
            FileChannel readChannel = new FileChannel.open(inPath, READ);
            FileChannel writeChannel = new FileChannel.open(outPath, WRITE, TRUNCATE_EXISTING)
    ) {
        long readFileSize = readChannel.size();
        long expectedWriteSize = readFileSize;
        if (readFileSize > 2 * megabyte)
            expectedWriteSize = readFileSize - megabyte;
        else if (readFileSize > megabyte)
            expectedWriteSize = megabyte;
        // copy first megabyte (or entire file if less than a megabyte)
        long bytesTrans = readChannel.transferTo(0, megabyte, writeChannel);
        // copy everything after the second megabyte
        if (readFileSize > 2 * megabyte)
            bytesTrans += readChannel.transferTo(2 * megabyte, readFileSize - 2 * megabyte, writeChannel);
        if (bytesTrans != expectedWriteSize)
            System.out.println("WARNING: Transferred " + bytesTrans + " bytes instead of " + expectedWriteSize);
    } catch (FileNotFoundException ex) {
        throw new RuntimeException("File not found!", ex);
    } catch (IOException ex) {
        throw new RuntimeException("Caught IOException", ex);
    }

    // replace the original file with the temporary file
    try {
        // ATOMIC_MOVE may cause IOException here . . .
        Files.move(outPath, inPath, REPLACE_EXISTING, ATOMIC_MOVE);
    } catch (IOException e1) {
        try {
            // . . . so it's probably worth trying again without that option
            Files.move(outPath, inPath, REPLACE_EXISTING);
        } catch (IOException e2) {
            throw new IOError(e2);
        }
    }
}

即使您无法打开新文件,nio也可能会提供帮助。如果您打开文件的读/写通道或在同一文件上打开两个不同的通道,则可以使用该transferTo方法将文件的一部分转移到文件的另一部分我没有足够的经验来知道。API指出,采用显式位置参数(如的第一个参数transferTo)的方法可以与写入文件的操作同时进行,因此我不排除它。如果尝试这样做,则可能需要以兆字节大小的块重写文件。如果这样行得通,那么FileChannel.truncate当您将文件的某些部分写入到文件中较早的位置时可以用它来截断文件的最后一个兆字节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java删除文件路径的一部分

在Java中合并二进制文件的最佳方法

检查xml是否是Java中pdf文档的一部分的最佳方法

在Java中删除文件扩展名的一部分

如何在Python中复制二进制文件的一部分?

在C ++中仅复制二进制文件的一部分

在方法签名中匹配二进制的一部分

如何在不复制的情况下删除二进制文件的一部分

重写二进制文件的一部分

如何转储二进制文件的一部分

如何使用 C++ 覆盖二进制文件的一部分?

读取十六进制字节数组中的文件并将该数组的一部分写入另一个文件 - java android

如何在Java中仅下载txt文件的一部分?

解析Java中的xml文件的一部分(Android)

从Java中的Google云端存储读取/下载文件的一部分

如何使用Java代码中restcontroller的一部分的方法?

使用Python的open()函数读取二进制文件时,只读取文件的一部分

读取Java中二进制文件的特定部分

用Java读取结构化二进制文件的最佳方法

使用gnu-coreutils,bash获取二进制文件的一部分

如何在提琴手中拦截多部分/表单数据并访问作为请求一部分的二进制文件

C++ 如何将二进制文件的一部分复制到新文件中?

接口不是Java中对象层次结构的一部分。为什么 ?它们属于某个等级吗?

在Java中,有没有什么好方法可以用不同长度的byte []替换byte []的一部分?

Java Graphics - 删除文本下的圆角矩形的一部分?

如何在Java中提取CSV文件的文件名的一部分

从Java中的二进制搜索树中删除

Java中的二进制兼容性是什么?

Java中的Sherwood二进制搜索算法是什么?