2016-02-26 4 views
2

У меня есть следующий код:найти строку в текстовый файл и редактировать его

String mID = jTextField1.getText(); 
    String mType = jComboBox1.getSelectedItem().toString(); 
    String mFName = jTextField2.getText(); 
    String mLName = jTextField3.getText(); 
    String mHomePhone = jTextField4.getText(); 
    String mMobilePhone = mPhone2.getText(); 
    String mEmail = jTextField6.getText(); 
    String mHomeAddress = jTextField7.getText(); 
    //Defines the new line of data 
    String newLine = (mID + " | " + mType + " | " + mFName + " | " + mLName + " | " 
    + mHomePhone + " | " + mMobilePhone + " | " + mEmail + " | " + mHomeAddress); 

    try { 
     File inFile = new File("Members2.txt"); 
     BufferedReader br; 
     FileReader reader; 
     try (PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("Member2_Temp.txt", true)))) { 
      br = new BufferedReader(new FileReader(inFile)); 
      reader = new FileReader("Members2.txt"); 
      String line; 
      while (null != (line = br.readLine())) { 
       if (newLine.equals(line)) { 
        newLine = line.replace(line, newLine); 
       } 
       // Always write the line, whether you changed it or not. 
       writer.println(newLine); 
      } 
      br.close(); 
      reader.close(); 
      writer.close(); 
     } 

     File tempFile = new File("Member2_Temp.txt"); 
     Path source = tempFile.toPath(); 
     Path newdir = inFile.toPath(); 
     Files.move(source, newdir, REPLACE_EXISTING); 

     dispose(); 
     new Edit_Member_Final().setVisible(true); 

    } catch (IOException ex) { 
     Logger.getLogger(Edit_Member_Final.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Вопрос заключается в том, что он печатает только отредактированную строку в файл и не печатает остальную часть неопубликованных линий.

Если у меня есть 4 записи, по какой-то причине программы печатают строку редактирования 4 раза. Как я могу это решить?

+1

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

ответ

2

Редактировать

  BufferedReader br; 
      try (PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("Member2_Temp.txt", true)))) { 
       br = new BufferedReader(new FileReader(inFile)); 
       String line; 

       while (null != (line = br.readLine())) { 
        if (newLine.equals(line)) { 
         line = line.replace(line, newLine); 
        } 

        // Always write the line, whether you changed it or not. 
        writer.println(line); 
       } 
       br.close(); 
       writer.flush(); 
       writer.close(); 

Вы пишете newLine только, которые будут иметь данные только тогда, когда найти матч

writer.println(newLine); 

Вы также должны написать line также, как это, добавьте else условие

if (newLine.equals(line)) { 
    line= line.replace(line, newLine); 
} 

writer.println(line); 
+0

Должен ли я оставить цикл while таким же? или изменить его на newLine = br.readLine()? – JSmithers

+0

, похоже, он не печатает в файл. Теперь записи остаются прежними. – JSmithers

+0

По-прежнему не печатает :( – JSmithers

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