Java中的文件截断操作

时间:2013-01-11 14:39:06

标签: java file file-io

在Java中截断文件的最佳实践方法是什么?例如,这个虚拟函数,仅作为澄清意图的一个例子:

void readAndTruncate(File f, List<String> lines)
        throws FileNotFoundException {
    for (Scanner s = new Scanner(f); s.hasNextLine(); lines.add(s.nextLine())) {}

    // truncate f here! how?

}

由于该文件充当占位符,因此无法删除该文件。

7 个答案:

答案 0 :(得分:32)

使用FileChannel#truncate()

    try (FileChannel outChan = new FileOutputStream(f, true).getChannel()) {
      outChan.truncate(newSize);
    }

答案 1 :(得分:8)

new FileWriter(f)将在打开时截断文件(到零字节),之后你可以在其上写行

答案 2 :(得分:5)

使用Files.write() ...

的一个班轮
Files.write(outFile, new byte[0], StandardOpenOption.TRUNCATE_EXISTING);

也可以先使用File.toPath()从File转换为Path。

还允许其他 StandardOpenOptions

答案 3 :(得分:2)

这取决于您要如何写入文件,但最简单的方法是打开一个新的FileOutputStream,而不指定您计划附加到该文件(注意:基础{{1}构造函数将截断该文件,但是如果你想明确该文件被截断,我推荐使用双参数变体。)

答案 4 :(得分:1)

RandomAccessFile.setLength()似乎正是这种情况下的规定。

答案 5 :(得分:0)

使用RandomAccessFile#read并将以这种方式记录的字节推送到新的File对象中。

RandomAccessFile raf = new RandomAccessFile(myFile,myMode);  
byte[] numberOfBytesToRead = new byte[truncatedFileSizeInBytes];  
raf.read(numberOfBytesToRead);    
FileOutputStream fos = new FileOutputStream(newFile);  
fos.write(numberOfBytesToRead);

答案 6 :(得分:0)

使用Apache Commons IO API:

    org.apache.commons.io.FileUtils.write(new File(...), "", Charset.defaultCharset());