2014-12-13 6 views
0

Я хочу, чтобы достичь следующих в Java области:Как удалить содержимое файла (не файл, нужно же индексный дескриптор) в Java, а затем обрезает файл до определенного размера (скажем, 38 байт)

  • Open файл ненулевого размера.
  • Удалить все содержимое.
  • Обрезать тот же файл заданного размера (скажем, 38 байт ....)

  • Так или иначе, если я удалить содержимое (работы), даже если я выдаю усечение после этого, его не чтят и файл размер остается 0.

    String fileName = "/home/me/dummy/a.1"; 
        try { 
         Long size = 0L; 
    
         // file exists already 
         RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 
         // set the file pointer at 0 position 
         raf.seek(0); 
         // print current length 
         size = raf.length(); 
         System.out.println("Before deleting - fileSize = " + size); 
    
         // set the file length to 0 
         raf.setLength(0); 
         // print the new length 
         System.out.println("After deleting - filesize = " + raf.length()); 
         raf.close(); 
    
    
         // truncating file to Size = 38 bytes 
         FileChannel outChan = new FileOutputStream(fileName, true).getChannel(); 
         System.out.println("Before Truncating - File size = "+outChan.size()); 
         outChan.truncate(38); 
         System.out.println("Aftre truncating - File size = "+outChan.size()); 
         outChan.close(); 
    
        } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
        } 
    

My O/Ps:

Перед удалением - FileSize = 21

После удаления - размер файла = 0

Перед Усечение - Размер файла = 0

AFTRE усечения - Размер файла = 0



Я попробовал несколько других вариантов, как:

  1. Усечение файла до 0, а затем 38 байт (ненулевое значение, которое я хочу)

     // truncating file to Size = 0 bytes and then to 38 bytes 
         FileChannel outChan = new FileOutputStream(fileName, true).getChannel(); 
         System.out.println("Before Truncating - File size = "+outChan.size()); 
         outChan.truncate(0);     
         outChan.truncate(38); 
         System.out.println("Aftre truncating - File size = "+outChan.size()); 
         outChan.close(); 
    

Не работает. Размер файла остается 0. Выполняется только 1-й усечение.



2. Обрежьте файл на 0, закройте канал, снова откройте канал и обрезайте до 38 байт.

  FileChannel outChan = new FileOutputStream(fileName, true).getChannel(); 
      System.out.println("Before Truncating - File size = "+outChan.size()); 
      outChan.truncate(0);  
      outChan.close(); 
      FileChannel outChan1 = new FileOutputStream(fileName, true).getChannel();   
      outChan1.truncate(38); 
      System.out.println("Aftre truncating - File size = "+outChan1.size()); 
      outChan.close(); 

Не работает. Размер файла остается 0. Выполняется только 1-й усечение.

Ваши данные о том, как я могу удалить содержимое файла и усечь его до ненулевого размера. Было бы здорово, если бы я мог сделать это только в одном открытии, в отличие от его открытия (RandomAccessFile, а затем в качестве FileChannel).

Спасибо.

ответ

1

Цитируя FileChannel.truncate javadocs:

Если данный размер больше или равен текущему размеру файла в то файл не изменяется.

Так как вы очистили файл перед усечением, его размер будет равен 0. 38 > 0, поэтому выдача .trucate(38) приведет к не-оп.

Либо вы обрезаете до 38 байт, не переведя его в 0, либо обрезаете до 0 и напишите 38 байт (например, 38 нулей).

0
  • Удалить все его содержание.
  • Обрезать один и тот же файл заданного размера (скажем, 38 байт ....)

Таким образом, вопрос, как бы один удалить содержимое файла целиком без удаления файла и в то же время сохраняя способность усечь файл? Это мой взгляд на него:

String fileName = "/home/me/dummy/a.1"; 
// file exists already 
RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 
try { 
    // set the file pointer at 0 position 
    raf.seek(0); 
    // print current length 
    long size = raf.length(); 
    System.out.println("Before deleting - fileSize = " + size); 

    // delete file content 
    raf.setLength(0); 
    // truncate file to 38 
    raf.setLength(Math.min(size, 38)); 
    // print the new length 
    System.out.println("After deleting - filesize = " + raf.length()); 

} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    raf.close(); 
} 

Что вы думаете, ребята; удовлетворяет ли это, по-видимому, противоречивым требованиям?

+0

Разве это не то, что делает OP? –

+0

Закрыть, но не то же самое. Он закрывает файл после обрезания до 0, затем открывает его и пытается «обрезать» уже сохраненный файл. Что еще более важно, это работает. – gknicker