2016-07-17 3 views
0

Я хочу написать круговой файл журнала:Как получить последнее место в файле в JAVA?

public class CircularLogFile { 
    public static final String LOG_FILE_NAME = "circular.log"; 
    public static final int LOG_FILE_SIZE_MAX = 256; 

    public static void write(String line) throws IOException { 
     //BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(logFileName, true)); 
     RandomAccessFile raf = new RandomAccessFile(LOG_FILE_NAME, "rw"); 
     System.out.println("file size: "+raf.length()); 
     System.out.println("file pointer: "+raf.getFilePointer()); 
     if (raf.length() >= LOG_FILE_SIZE_MAX && raf.getFilePointer() >= LOG_FILE_SIZE_MAX) { 
      raf.seek(0); 
     } else if (raf.length() >= LOG_FILE_SIZE_MAX && raf.getFilePointer() < LOG_FILE_SIZE_MAX) { 
     } else if (raf.length() < LOG_FILE_SIZE_MAX) { 
      raf.seek(raf.length()); 
     } 

     raf.writeChars(line+"\n"); 

     raf.close(); 
    } 

    public static void main(String[] args) throws IOException { 
     int lineNumber = 0; 

     while (true) { 
      lineNumber++; 
      write("This is Line "+lineNumber); 
     } 
    } 
} 

выход:

This is Line 1400 
s is Line 2 
This is Line 3 
This is Line 4 
This is Line 5 
This is Line 6 
This is Line 7 
This is Line 8 
This is Line 9 

не

This is Line 10 
This is Line 11 
This is Line 12 
This is Line 4 
This is Line 5 
This is Line 6 
This is Line 7 
This is Line 8 
This is Line 9 

Я хочу выше результата, но я нашел, что я не могу получить позицию последней писал в файле, как его получить?

+0

это не очень понятно. Увидев ваш код, выход должен начинаться с 'This is Line 1' – davidxxx

+0

Почему 1400, 2, 3, 4 неверно, но 12, 4, 5, 6 просто нормально? – csmckelvey

+0

Даже если вы получили последнюю позицию записи (откуда? Magic?), Это не поможет вам, когда вы хотите изменить длину старых строк, прочитать, сдвинуть последующее содержимое файла. – Holger

ответ

1

Что вы хотите сделать довольно сложно, и, на мой взгляд, это может быть даже не лучший способ справиться с этим. Вы используете и злоупотребляете файловым I/O (дорогостоящим и с вашей целью, несколько жестким).

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

Смежные вопросы