Java BufferedReader FileReader проблема

1

Поэтому у меня есть следующий код:

import java.io.*;

public class Plagiarism {

    public static void main(String[] args) {

        Plagiarism myPlag = new Plagiarism();

        if  (args.length == 0) {
            System.out.println("Error: No files input");
        }
        else if (args.length > 0) {
            try {
                for (int i = 0; i < args.length; i++) {
                    BufferedReader reader = new BufferedReader (new FileReader (args[i]));
                    simplify (reader);
                    reader.close();
                }
            }
            catch (Exception e) {
                System.err.println ("Error reading from file");
            }
        }
    }

    public static void simplify(BufferedReader input) throws IOException {
        String line = null;

        line = input.readLine();
        while (line != null) {
            line = line.replaceAll ("[^a-zA-Z0-9 ]", "");
            line = line.toLowerCase();
        }    
    }

}

Проблема с этим кодом заключается в том, что он компилируется, но когда я запускаю его и добавляю 2 аргумента в командной строке, например. Java Plagiarism text1.txt text2.txt. EDIT: Когда я запускаю это, он просто ничего не делает или даже не заканчивает, он как будто застрял где-то.

Спасибо за любую помощь.

Теги:
try-catch
bufferedreader
filereader

2 ответа

1
Лучший ответ

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

Проблема заключается в вашем simplify методе.

line = input.readLine();
while (line != null) {

... должно стать:

while ((line = input.readLine()) != null)

Причина этого в том, что вы вызываете readLine только один раз и итерации только по первому значению в противном случае.

С собственно в while петля конвейеру значение readLine вызова в non- null состояние после назначения его на line переменной.

После этого вы можете делать все, что вы хотите с line String вы манипулировали в вашем в while цикла, такие как добавление его в array или Collection, как Вы предложили в своем комментарии.

Например:

public static List<String> simplify(BufferedReader input) throws IOException {
    String line = null;
    List<String> result = new ArrayList<String>();

    while ((line = input.readLine()) != null) {
        result.add(line.replaceAll ("[^a-zA-Z0-9 ]", "").toLowerCase());
    }    
    return result;
}

... тогда в вашем main методе...

List<String> foo = simplify(reader);
  • 0
    Я ценю ваш ответ. Что же касается второго вопроса, как вы имеете в виду? Этот код обязательно должен работать? Если это не может работать, как я могу заставить это работать с читателями? Спасибо
  • 0
    @ user3364788 редактируя мой ответ, наберитесь терпения :)
Показать ещё 11 комментариев
0

EDIT: Когда я запускаю это, он просто ничего не делает или даже не заканчивает, он как будто застрял где-то.

Это совершенно нормально. Посмотрите на свой в while цикла:

    while (line != null) {
        line = line.replaceAll ("[^a-zA-Z0-9 ]", "");
        line = line.toLowerCase();
    }

line никогда не будет равна нулю. Вам следует:

while ((line = input.readLine()) != null)
    // etc 

У вас есть более фундаментальная проблема: ваша программа никогда не будет работать правильно, если ваша цель - заменить строки во входных файлах...

Попробуйте это вместо этого:

private static final Pattern PATTERN = Pattern.compile("[^a-zA-Z0-9 ]+");

private static void simplify(final String fileName)
    throws IOException
{
    final Path path = Paths.get(fileName);
    final Path tempfile = Files.createTempFile(fileName.getFileName(), "tmp");
    try (
        final BufferedReader reader = Files.newBufferedReader(path);
        final BufferedWriter writer = Files.newBufferedWriter(tempfile);
    ) {
        String line;
        while ((line = reader.readLine()) != null) {
            line = PATTERN.matcher(line).replaceAll("").toLowerCase();
            writer.write(line);
            writer.newLine();
        }
        writer.flush();
    }
    Files.move(tempfile, path, StandardCopyOption.REPLACE_EXISTING);
}
  • 0
    Спасибо за Ваш ответ. Это не то, что мне нужно, хотя я не думаю. По сути, я сравниваю оба текстовых документа, поэтому я не заменяю содержимое файлов, а использую его, а затем редактирую содержимое в массивах.
  • 0
    Files.readAllLines() вы можете найти Files.readAllLines() интересным

Ещё вопросы

Сообщество Overcoder
Наверх
Меню