2012-06-19 4 views
3

Ok, скажем, у меня есть текстовый файл с именем «people.txt», и содержит следующую информацию:редактировать определенную строку в текстовый файл с помощью Java программы

1 adam 20 M 
2 betty 49 F 
3 charles 9 M 
4 david 22 M 
5 ethan 41 M 
6 faith 23 F 
7 greg 22 M 
8 heidi 63 F 

В принципе, первый номер является Идентификатор человека, затем набирается имя, возраст и пол. Скажем, я хочу заменить строку 2 или человека с идентификационным номером 2 с разными значениями. Теперь я знаю, что я не могу использовать RandomAccessFile для этого, потому что имена не всегда равны числу байтов, ни один возраст. Во время поиска на случайных форумах Java я обнаружил, что StringBuilder или StringBuffer должно быть достаточно для моих нужд, но я не уверен, как реализовать это. Могут ли они использоваться для прямой записи в текстовый файл? Я хочу, чтобы это работало напрямую с пользовательского ввода.

+1

Добро пожаловать в Stack Overflow, aravindsai2. Этот сайт разработан, чтобы помочь вам помочь себе. Самый простой способ получить ответы - попытаться решить проблему самостоятельно и опубликовать свой код. При этом вам сначала нужно прочитать текст из файла. Попытайтесь узнать о TextReader и TextWriter. –

ответ

0

Одним из решений может быть чтение в файле по очереди, манипулирование строками, которые вам нужны (выполнение парсинга/токенизации для получения идентификатора/имени и т. Д.), А затем записать все строки в файл (переписывая его текущее содержимое). Это решение зависит от размера файла, с которым вы работаете: слишком большой файл будет потреблять много памяти при одновременном хранении всего содержимого в памяти

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

Классы FileReader и FileWriter должны помочь вам в чтении/записи в файл. Возможно, вы захотите обернуть их в BufferedReader/BufferedWriter, чтобы повысить производительность.

Кроме того, не забудьте закрыть читателя (также, писатель), когда закончите чтение (запись) файл, так как следствие получает доступ к файлу не заблокированы из-за файл по-прежнему является открытым

+0

Спасибо Attila ........... Я сделал файл креатина ... как вставка .... Я знаю, как удалить определенную строку из этого текстового файла по номеру ... пожалуйста, помогите –

+0

Если вам нужно удалить строку, просто не записывайте ее (например, не храните ее в списке строк, которые вы выписываете в конце). – Attila

+0

Я сделал удаление строки ...... что я должен сделать для обновления определенной строки .... ???? –

7

Просто вам понадобился

public static void main(String args[]) { 
     try { 
      // Open the file that is the first 
      // command line parameter 
      FileInputStream fstream = new FileInputStream("d:/new6.txt"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
      String strLine; 
      StringBuilder fileContent = new StringBuilder(); 
      //Read File Line By Line 
      while ((strLine = br.readLine()) != null) { 
       // Print the content on the console 
       System.out.println(strLine); 
       String tokens[] = strLine.split(" "); 
       if (tokens.length > 0) { 
        // Here tokens[0] will have value of ID 
        if (tokens[0].equals("2")) { 
         tokens[1] = "betty-updated"; 
         tokens[2] = "499"; 
         String newLine = tokens[0] + " " + tokens[1] + " " + tokens[2] + " " + tokens[3]; 
         fileContent.append(newLine); 
         fileContent.append("\n"); 
        } else { 
         // update content as it is 
         fileContent.append(strLine); 
         fileContent.append("\n"); 
        } 
       } 
      } 
      // Now fileContent will have updated content , which you can override into file 
      FileWriter fstreamWrite = new FileWriter("d:/new6.txt"); 
      BufferedWriter out = new BufferedWriter(fstreamWrite); 
      out.write(fileContent.toString()); 
      out.close(); 
      //Close the input stream 
      in.close(); 
     } catch (Exception e) {//Catch exception if any 
      System.err.println("Error: " + e.getMessage()); 
     } 
    } 
+0

@aleroot сравнивает идентификатор с startWith, эта логика потерпит неудачу, когда у вас есть несколько идентификаторов в файле, начинающемся с 1, например 1, 11, 111, 1111, поэтому он обновит все эти 4 строки. –

+0

You должен перемещать 'in.close()' перед открытием файла для записи, иначе вы можете получить исключение, поскольку файл может быть заблокирован – Attila

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