如何在 Java 中删除文件内容(不是文件,需要相同的 inode),然后将文件截断为特定大小(例如 38 字节)



我想在Java领域实现以下目标:

  • 打开大小为非零的文件。
  • 删除其所有内容。
  • 同一文件截断为给定大小(例如 38 字节...

  • 不知何故,如果我删除内容(作品(,即使我在那之后发出截断,它也不会被接受并且文件大小保持 0。

        String fileName = "/home/me/dummy/a.1";
        try {
             Long size = 0L;
             // file exists already
             RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
             // set the file pointer at 0 position
             raf.seek(0);
             // print current length
             size = raf.length();
             System.out.println("Before deleting -  fileSize = " + size);
             // set the file length to 0
             raf.setLength(0);
             // print the new length
             System.out.println("After deleting - filesize = " + raf.length());
             raf.close();
    
            // truncating file to Size = 38 bytes
            FileChannel outChan = new FileOutputStream(fileName, true).getChannel();
            System.out.println("Before Truncating - File size = "+outChan.size());
            outChan.truncate(38);
            System.out.println("Aftre truncating  - File size = "+outChan.size());
            outChan.close();
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } 
    

我的操作系统 :

删除前 - 文件大小 = 21

删除后 - 文件大小 = 0

截断之前 - 文件大小 = 0

尾部截断 - 文件大小 = 0



我尝试了多种其他选项,例如:

  1. 将文件截断为 0,然后说 38 字节(我想要的非零值(

            // truncating file to Size = 0 bytes and then to 38 bytes
            FileChannel outChan = new FileOutputStream(fileName, true).getChannel();
            System.out.println("Before Truncating - File size = "+outChan.size());
            outChan.truncate(0);                
            outChan.truncate(38);
            System.out.println("Aftre truncating  - File size = "+outChan.size());
            outChan.close();
    

不行。文件大小保持 0。仅支持第 1 个截断。



2. 将文件截断为 0,关闭通道,再次打开通道并截断为 38 字节。

            FileChannel outChan = new FileOutputStream(fileName, true).getChannel();
            System.out.println("Before Truncating - File size = "+outChan.size());
            outChan.truncate(0);    
            outChan.close();
             FileChannel outChan1 = new FileOutputStream(fileName, true).getChannel();          
            outChan1.truncate(38);
            System.out.println("Aftre truncating  - File size = "+outChan1.size());
            outChan.close();

不行。文件大小保持 0。仅支持第 1 个截断。



您关于如何删除文件内容并将其截断为非零大小的输入。如果我只能在一次打开中执行此操作,而不是将其打开为(随机访问文件,然后作为文件通道(打开,那就太好了。

谢谢。

引用FileChannel.truncate javadocs:

如果给定大小大于或等于文件的当前大小,则不会修改文件。

由于您在截断之前清空了文件,因此其大小将为 0。 38 > 0 ,因此发出.trucate(38)将导致无操作。

要么截断到 38 个字节

而不先截断到 0,要么截断到 0 并向其写入 38 个字节(例如 38 个零(。

  • 删除其所有内容。
  • 同一文件截断为给定大小(例如 38 字节...

所以问题是,如何在不删除文件的情况下删除文件的内容,同时保留截断文件的能力?这是我的看法:

String fileName = "/home/me/dummy/a.1";
// file exists already
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
try {
    // set the file pointer at 0 position
    raf.seek(0);
    // print current length
    long size = raf.length();
    System.out.println("Before deleting -  fileSize = " + size);
    // delete file content
    raf.setLength(0);
    // truncate file to 38
    raf.setLength(Math.min(size, 38));
    // print the new length
    System.out.println("After deleting - filesize = " + raf.length());
} catch (IOException e) {
    e.printStackTrace();
} finally {
    raf.close();
}

你们怎么看;这满足了看似相互冲突的要求吗?

根据RandomAccessFile的最后一个代码:

第一个操作 setLength(0( 会在打开文件之前删除文件在介质上占用的所有 512 字节的物理块。

第二个动作 setLength(38( 为文件分配一个物理块(512 字节(;这个块用零填充,其中前 38 个字节进入 RAM。

分配的块很可能不是在打开之前构成同一文件的上一组块。因此,不可能检索旧信息。

这需要在文件系统 API 的较低级别执行逐块访问操作。

可以说,SIZE大于文件长度的setLength(SIZE(操作总是会得到用零填充的新字节。

相关内容

  • 没有找到相关文章

最新更新