2013-01-11 79 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