2013-01-11 15 views
10

Java'da bir dosyayı kırpmanın en iyi yolu nedir? Örneğin sadece bir örnek olarak bu kukla işlevi, niyet netleştirmek için: Dosya bir yer tutucu olarak davranmaktadır beriJava'da dosya kısaltma işlemi

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? 

} 

dosya silinemez.

cevap

26

FileChannel#truncate()'u kullanın.

+2

Basit 'try {new FileOutputStream (f) .getChannel(). Truncate (0) .close(); } yakalamak (IOException e) {/ * günlüğü ve yoksay * /} '. Soru: dosya append == true ile açılmışsa veya olmasın farketmez mi? – hyde

+0

Sonra sadece yeni FileWriter (f) .close() '. –

+1

Eğer append == 'açmadan açılırsanız, dosya hemen kesilir (wha istediğiniz). –

0

RandomAccessFile#read kullanın ve bu şekilde kaydedilen baytları yeni bir File nesnesine doğru itin.

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

RandomAccessFile kullanarak, tek bir dosya açılışıyla okumaya ve sonra kesmeye izin veririm, bu yüzden bunun için +1 olur. – hyde

2

Bu dosyaya yazmak için gidiyoruz bağlıdır, ancak en basit yolu dosyaya (not eklenecek planladığınız belirtmeden yeni FileOutputStream açmaktır: Baz FileOuptutStream kurucu keser dosya, ancak dosyanın kesildiğini açıkça belirtmek isterseniz, iki parametreli varyantı kullanmanızı öneririz.

+0

Dosyaya yazılmayacak, sadece sıfıra kırpmak istiyorum ... Okunan ve işlenen, içerikler disk alanından kaçınmak için temizlenmelidir, ancak dosya girişi kalmalıdır. – hyde

+0

Evet, 'FileOutputStream' truncating anlamlıdır, ancak neden dokümanlar bundan bahsetmediğini merak ediyorum (sadece önceki dosya içeriğine ne olduğunu belirtmeden dosya baştan yazılacaklarını söylüyorlar). – hyde

8

new FileWriter(f), (sıfır bayt) açılması üzerine dosya keser Önceden de Dosyadan Yol'a dönüştürün.

Ayrıca diğer StandardOpenOptions izin verir.

2

Bir Files.write() kullanarak astar ...

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

için File.toPath() kullanabilir miyim o buna satırları yazabilir sonra

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