2013-01-11 55 views
10

在Java中截断文件的最佳实践方式是什么?例如这个虚拟函数,只是作为一个例子来阐明的意图:因为文件被用作占位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? 

} 

的文件无法删除。

回答

26

使用FileChannel#truncate()

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

我最终做了简单的'try {new FileOutputStream(f).getChannel()。truncate(0).close(); } catch(IOException e){/ * log and ignore * /}'。问题:如果使用append == true打开文件,它是否重要? – hyde

+0

然后只是'新的FileWriter(f).close()'。 –

+1

如果你打开时没有追加=='true',那么文件立即被截断(你想要)。 –

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

我认为使用RandomAccessFile将允许阅读,然后截断与单个文件打开,所以+1。 – hyde

2

这取决于你如何去写文件,但最简单的方法是打开一个新的FileOutputStream,而不指定您打算追加到文件(注:基地FileOuptutStream构造将截断该文件,但如果你想清楚该文件被截断,我推荐使用双参数变体)。

+0

不会写入文件,只是想将其截断为零...它被读取和处理,内容需要清除以避免占用磁盘空间,但文件应该保留。 – hyde

+0

是的,'FileOutputStream'截断是有意义的,但我想知道为什么文档没有提到它(他们只是说从头开始写文件,而没有指定以前的文件内容会发生什么)。 – hyde

8

new FileWriter(f)将截断在打开你的文件(零个字节),然后,你可以写行给它

2

一个衬垫使用Files.write() ...

Files.write(outFile, new byte[0], StandardOpenOption.TRUNCATE_EXISTING); 

可以使用File.toPath()来之前也将文件转换为路径。

还允许其他StandardOpenOptions