2015-06-03 2 views
2

Я пытаюсь заменить ? на - в текстовом документе, но только ArrayList<String> записывается в новый файл без всех строк старого. Как я могу это исправить?Прочтите файл, замените строку и создайте новый со всем содержимым

File file = new File("D:\\hl_sv\\L09MF.txt"); 

ArrayList<String> lns = new ArrayList<String>(); 
Scanner scanner; 
try { 

    scanner = new Scanner(file); 

    int lineNum = 0; 
    while (scanner.hasNextLine()) { 
     String line = scanner.nextLine(); 
     lineNum++; 
     if (line.contains("?")) { 
      line = line.replace("?", "-"); 
      lns.add(line); 

      // System.out.println("I found it on line " + lineNum); 
     } 
    } 
    lines.clear(); 
    lines = lns; 
    System.out.println("Test: " + lines); 

    FileWriter writer; 
    try { 
     writer = new FileWriter("D:\\hl_sv\\L09MF2.txt"); 
     for (String str : lines) { 
      writer.write(str); 
     } 

     writer.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
+0

Вы можете добавить пример входных данных, и то, что она выглядит, как после выполнения кода? –

+0

Не могли бы вы опубликовать компилируемую и исполняемую версию? BTW, вы должны использовать try-with-resources для всех 'close' для вас. Если нет, вы должны переместить 'close()' в 'finally' раздел после блоков' try-catch'. – Pshemo

+1

Как насчет перемещения 'lns.add (line); 'после условия, в котором он сейчас находится? –

ответ

3

Я не понимаю, почему вы храните lines в List для начала. Я буду выполнять преобразование и печать, пока я читаю. Вам не нужно проверять наличие ? (замена ничего не изменит, если его нет). И я бы также использовал try-with-resources. Что-то вроде

File file = new File("D:\\hl_sv\\L09MF.txt"); 
try (PrintWriter writer = new PrintWriter("D:\\hl_sv\\L09MF2.txt"); 
     Scanner scanner = new Scanner(file)) { 
    while (scanner.hasNextLine()) { 
     String line = scanner.nextLine(); 
     writer.println(line.replace('?', '-')); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

Является ли try-with-resources как используемый блок в C#? Некоторое время отвлекался от Java. –

+1

@EricJ. Try-with-resources просто обеспечивает вызов 'close()' в разделе 'finally' на закрываемом экземпляре, объявленном как ресурсы. – Pshemo

1

Проверьте этот код:

if (line.contains("?")) { 
    line = line.replace("?", "-"); 
    lns.add(line); 
} 

Вы только добавление текущей строки (с заменой), если он был? в нем, игнорируя другие строки. Перестройте его, чтобы всегда добавлять существующую строку.

if (line.contains("?")) { 
    line = line.replace("?", "-"); 
} 
lns.add(line); 

Кроме того, часть

if (line.contains("?")) 

сканирует line искать?, А затем код

line.replace("?", "-"); 

делает то же самое, но на этот раз вместо любого? с -. Вы можете также сканировать line только один раз:

lns.add(line.replace("?", "-")); 

Обратите внимание, что создание ArrayList просто провести новые линии отходов изрядное количество памяти, если файл большой. Лучше всего было бы написать каждую строку, при необходимости изменив ее, сразу после чтения в соответствующей строке.

+0

За исключением, конечно, избыточного условного. –

+0

На самом деле нам даже не нужно 'if (line.contains ("? "))'. 'line = line.replace ("? "," - ");' достаточно. Или даже лучше 'lns.add (line.replace ('?', '-'));' – Pshemo

+0

Хорошая точка, хотя некоторое обучение будет потеряно, если вы прыгнете прямо к этой форме. Однако я добавлю это к ответу. –

0

Внутри цикла while у вас есть инструкция if, проверяющая строку, которая добавляет измененную строку в массив. Вам также необходимо добавить неизменные строки в массив.

+0

Возможно, было бы лучше, если бы вы разместили код для иллюстрации. –

0

Это должно исправить проблему: «?»

 int lineNum = 0; 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      lineNum++; 
      if (line.contains("?")) { 
       line = line.replace("?", "-"); 
       lns.add(line); 

       // System.out.println("I found it on line " + lineNum); 
      } 
      else{ 
       lns.add(line); 
      } 

Раньше вы были только добавив строку в ArrayList, если она содержала персонаж. Вам нужно добавить строку в ArrayList независимо от того, содержит ли она??

+1

DRY: 'lns.add (строка)' появляется дважды. –

0

Я хотел бы использовать другой подход, если я пытаюсь работать над функциональностью вы хотите реализовать, пожалуйста, проверьте этот подход и скажите мне, если это поможет вам :)

public void saveReplacedFile() { 
    //1. Given a file in your system 
    File file = new File("D:\\hl_sv\\L09MF.txt"); 

    try { 
     //2. I will read it, not necessarily with Scanner, but use a BufferedReader instead 
     BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); 

     //3. Define a variable that will hold the value of each line 
     String line = null; 
     //and also the information of your file 
     StringBuilder contentHolder = new StringBuilder(); 
     //why not get your line separator based on your O.S? 
     String lineSeparator = System.getProperty("line.separator"); 

     //4. Check your file line by line 
     while ((line = bufferedReader.readLine()) != null) { 
      contentHolder.append(line); 
      contentHolder.append(lineSeparator); 
     } 

     //5. By this point, your contentHolder will contain all the data of your text 
     //But it is still a StringBuilder type object, why not convert it to a String? 
     String contentAsString = contentHolder.toString(); 

     //6. Now we can replace your "?" with "-" 
     String replacedString = contentAsString.replace("?", "-"); 

     //7. Now, let's save it in a new file using BufferedWriter :) 
     File fileToBeSaved = new File("D:\\hl_sv\\L09MF2.txt"); 

     BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(fileToBeSaved)); 

     bufferedWriter.write(replacedString); 

     //Done :) 


    } catch (FileNotFoundException e) { 
     // Exception thrown if the file does not exist in your system 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // Exception thrown due to an issue with IO 
     e.printStackTrace(); 
    } 
} 

Надеюсь, это полезно. Счастливое кодирование :)

+0

Я пробовал свой код, и созданный 'L09MF2.txt' пуст – MrPencil

0

Если вы можете использовать Java 8, то ваш код может быть упрощен

try (PrintStream ps = new PrintStream("D:\\hl_sv\\L09MF2.txt"); 
    Stream<String> stream = Files.lines(Paths.get("D:\\hl_sv\\L09MF.txt"))) { 
    stream.map(line -> line.replace('?', '-')).forEach(ps::println); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
Смежные вопросы