2009-11-05 4 views
0

Я пытаюсь прочитать файл, а затем добавить некоторый текст в определенное место в файле (например, @ offset jabjab). Проблема возникает, когда я пытаюсь записать файл в смещение jabjab. Какая ошибка?Исключение PrintWriter: индекс строки за пределами допустимого диапазона

содержимое файла:

Mi 
<?xml Version="1.0"?> 

_

File f = new File("data.dat"); 
    String brstring = null; 
    String entrystring = null; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(f)); 
     String line; 
     StringBuilder result = new StringBuilder(); 
     while ((line = br.readLine()) != null) { 
     result.append(line+"\r\n"); 
     } 
     br.close(); 
     System.out.print(result); 
     int jabjab = result.indexOf("?>"); 
     System.out.println(jabjab); 
     PrintWriter fo = new PrintWriter(f); 
     fo.write("ok", jabjab, 2); 
     fo.flush(); 
     fo.close(); 
    } catch (Exception ex) { 
     System.out.print(ex.getMessage()); 
    } 

Консоль вывода, включая ошибки:

Mi// output of the result string 
<?xml Version="1.0"?>//output of the result string 
23//output of jabjab 
String index out of range: 25String index out of range: 25//output of exception 

Кроме того, после того, как этот метод сделал исходный файл теперь пуст ...

ответ

3

Я думаю, вы неправильно поняли определение PrintWriter.write (строка, смещение, длина). Если я правильно прочитаю ваш вопрос, вы думаете, что он будет записывать в выходной файл с этим смещением. Тем не менее, смещение указывает, где в строке записывается для запуска, поэтому вы пытаетесь написать строку «ok», начиная со смещения 23. Так как строка содержит только 2 символа, вы получаете исключение.

Посмотрите на java.io.RandomAccessFile, если вы действительно хотите перезаписать определенные байты в файле. Обратите внимание, что, хотя вы можете перезаписывать определенные байты в файле с помощью других байтов, вы не можете «вставлять» данные или удалять данные из файла (в результате получается файл разной длины), не читая его в памяти и не записывая новую копию на диск.