2017-02-06 6 views
0

Я новичок и нуждаюсь в некоторой помощи. Я пытаюсь сканировать текстовый файл в массив по строкам, но не указывая одну строку. Мой текстовый файлСканирование текстового файла в массив и опускание одной указанной строки

я

вы

он

она

это

Я хочу, чтобы создать метод, который будет сканировать это и положить элементов в массив с исключением для одной строки (который выбирается путем ввода String в качестве параметра для метода). Затем удалите исходный текстовый файл и напечатайте там созданный массив (без этой удаленной строки). Извините, я сосать объяснение.

Я попытался это:

public static void deleteLine(String name, String line) throws IOException { 
    String sc = System.getProperty("user.dir") + new File("").separator; 
    FileReader fr = new FileReader(sc + name + ".txt"); 
    Scanner scan = new Scanner(fr); 
    int n = countLines(name); // a well working method returning the number if lines in the file (here 5) 
    String[] listArray = new String[n-1]; 
    for (int i = 0; i < n-1; i++) { 
     if (scan.hasNextLine() && !scan.nextLine().equals(line)) 
      listArray[i] = scan.nextLine(); 
     else if (scan.hasNextLine() && scan.nextLine().equals(line)) 
      i--; 
     else continue; 
    } 
    PrintWriter print = new PrintWriter(sc + name + ".txt"); 
    print.write(""); 
    for (int i = 0; i < n-2; i++) { 
     print.write(listArray[i] + "\n"); 
    } 
    print.close() 
} 

я получаю «Линию не найден» ошибка, когда я вхожу: deleteLine («all_names», «вы») (all_names это имя файла). Я уверен, что проблема заключается в for-loop, но я понятия не имею, почему это не работает. :(

// решаемые //

Этот код работал после того, как все. Спасибо за ответы!

public static void deleteLine(String name, String line) throws IOException{ 
    String sc = System.getProperty("user.dir") + new File("").separator; 
    FileReader fr = null; 
    fr = new FileReader(sc+name+".txt"); 
    Scanner scan = new Scanner(fr); 
    int n = LineCounter(name); 
    String[] listArray = new String[n-1]; 
    for (int i = 0; i < n-1; i++) { 
     if (scan.hasNextLine()) { 
      String nextLine = scan.nextLine(); 
      if (!nextLine.equals(line)) { 
       listArray[i] = nextLine; 
      } 
      else i--; 
     } 
    } 
    PrintWriter print = new PrintWriter(sc+name+".txt"); 
    print.write(""); 
    for(int i=0;i<n-1;i++){ 
     print.write(listArray[i]+System.lineSeparator()); 


    } 
    print.close(); 

} 
+0

Примечание по условному обозначению кодирования: в Java-методах начинается строчная буква. –

ответ

0

Вы просматриваете строки дважды scan.nextLine() во время сравнения, и из-за этого у вас заканчиваются линии.

Замените петлю с этим или подобным

for (int i = 0; i < n; i++) { 
     if (scan.hasNextLine()) { 
      String nextLine = scan.nextLine(); 
      if (nextLine.equals(line)) { 
       listArray[i] = nextLine; 
      } 
     } 
    } 
+0

Большое вам спасибо!Этот точный код не работал, но я работал над ним и сумел получить то, что хочу. – Alisa

0

Посмотрите на то, как вы сравниваете объекты String. Вы должны использовать метод equals для сравнить содержания строкового в. Использование операторов как == и != сравнивает если строка объектов идентичны.

Теперь после использования equals правильно посмотрите, как вы используете nextLine. Проверьте его Javadoc

+0

Спасибо, что может также создать проблемы, однако ошибка остается неизменной даже после ее исправления. (изменено на! scan.nextLine(). равно (строка) + тот же, что и без строки восклицательной метки ниже) – Alisa

0

Я чувствую LineCounter (имя) работает, потому что вы не поставили «.txt» там. Попробуйте удалить расширение «.txt» из имени файла в объектах Filereader и Printwriter и посмотреть, работает ли оно. Обычно в окнах расширение не является частью имени файла.

0

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

Также он избегает нескольких циклов , но вместо этого использует один поток Java 8.

public static void deleteLine(String name, String line) throws IOException { 
    List<String> lines = Files.readAllLines(Paths.get(name)); 
    lines = lines.stream().filter(v -> !v.equals(line)).collect(Collectors.toList()); 
    System.out.println(lines); 

    // if you want the String[] - but you don't need it 
    String[] linesAsStringArr = new String[lines.size()]; 
    linesAsStringArr = lines.toArray(linesAsStringArr); 

    // write the file using our List<String> 
    Path out = Paths.get("output.txt"); // or another filename you dynamically create 
    Files.write(out, lines, Charset.forName("UTF-8")); 
} 
+0

Спасибо! Для меня это слишком сложно, потому что я не понимаю всех функций. Но этот ответ будет полезен для будущей справки. – Alisa

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