2013-01-11 2 views
10

Wie schneidet man eine Datei in Java am besten ab? Zum Beispiel dieser Dummy-Funktion, nur als Beispiel, die Absicht zu klären:Dateiabkürzung in 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? 

} 

Die Datei kann nicht gelöscht werden, da die Datei als Platzhalter fungiert.

Antwort

26

Verwenden Sie FileChannel#truncate().

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

Am Ende habe ich einfach 'try {new FileOutputStream (f) .getChannel(). Truncate (0) .close(); } catch (IOException e) {/ * log und ignore * /} '. Frage: Ist es wichtig, ob die Datei mit append == true geöffnet wird oder nicht? – hyde

+0

Dann nur 'neuer FileWriter (f) .close()'. –

+1

Wenn Sie ohne append == 'true' öffnen, wird die Datei sofort abgeschnitten (was Sie wollen). –

0

Verwenden Sie RandomAccessFile#read und schieben Sie die auf diese Weise aufgezeichneten Bytes in ein neues Objekt File.

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

Ich denke, mit RandomAccessFile würde Lesen und dann Abschneiden mit einzelnen Dateiöffnung, also +1 für das. – hyde

2

Es hängt davon ab, wie Sie in die Datei schreiben wollen, aber der einfachste Weg ist es, eine neue FileOutputStream zu öffnen, ohne Angabe, dass Sie auf die Datei (Notiz anhängen wollen: die Basis FileOuptutStream Konstruktor wird gestutzt die Datei, aber wenn Sie klarstellen möchten, dass die Datei abgeschnitten wird, empfehle ich die Verwendung der Zwei-Parameter-Variante).

+0

Nicht in die Datei schreiben, nur auf Null abschneiden ... Es wird gelesen und verarbeitet, Inhalt muss gelöscht werden, um Speicherplatz zu sparen, aber Dateieinträge sollten bleiben. – hyde

+0

Yeah, 'FileOutputStream' macht zwar Sinn, aber ich frage mich, warum die Docs es nicht erwähnen (sie sagen einfach, dass Datei von Anfang an geschrieben wird, ohne zu spezifizieren, was mit früheren Dateiinhalten passiert). – hyde

8

new FileWriter(f) wird die Datei beim Öffnen (auf Null Byte) gestutzt, nach, dass Sie

2

One-Liner mit Files.write() es Zeilen schreiben kann ...

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

File.toPath() verwenden können konvertieren Sie auch vorher von Datei nach Pfad.

Ermöglicht auch andere StandardOpenOptions.