我想在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
我尝试了多种其他选项,例如:
-
将文件截断为 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)
将导致无操作。
而不先截断到 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(操作总是会得到用零填充的新字节。