Java - сканер не сканирует после определенного количества строк - PullRequest
1 голос
/ 09 сентября 2011

Я делаю несколько относительно простых операций ввода-вывода в Java. У меня есть файлы .txt, которые я читаю с помощью сканера, и файл .txt, который я записываю с помощью BufferedWriter. Затем другой сканер читает этот файл, а другой BufferedWriter затем создает другой файл .txt. Я предоставил приведенный ниже код на всякий случай, но я не знаю, поможет ли он слишком сильно, так как я не думаю, что здесь проблема с кодом. Код компилируется без ошибок, но он не делает то, что я ожидаю. По какой-то причине charReader будет читать только половину своего файла, затем hasNext () вернет false, даже если конец файла не достигнут. Это не большие текстовые файлы - файл statsReader - 34 КБ, а файл charReader - 29 КБ, что еще более странно, потому что statsReader отлично читает весь свой файл, и он больше! Кроме того, у меня есть этот код, заключенный в try / catch, я просто не включил его.

Из того, что я посмотрел в Интернете, это может произойти с очень большими файлами, но они очень маленькие, поэтому я довольно растерялся.

Моя ОС - Windows 7, 64-разрядная.

        Scanner statsReader = new Scanner(statsFile);
        BufferedWriter statsWriter = new BufferedWriter(new FileWriter(outputFile));

        while (statsReader.hasNext()) {
            statsWriter.write(statsReader.next());
            name = statsReader.nextLine();
            temp = statsReader.nextLine();
            if (temp.contains("form")) {
                name += " " + temp;
                temp = statsReader.next();
            }
            statsWriter.write(name);
            statsWriter.newLine();
            statsWriter.write(temp);
            if (! (temp = statsReader.next()).equals("-"))
                statsWriter.write("/" + temp);
            statsWriter.write("\t");
            statsWriter.write(statsReader.nextInt() + "\t");
            statsWriter.write(statsReader.nextInt() + "\t");
            statsWriter.write(statsReader.nextInt() + "\t");
            statsWriter.write(statsReader.nextInt() + "\t");
            statsWriter.write(statsReader.nextInt() + "\t");
            statsWriter.write(statsReader.nextInt() + "");
            statsWriter.newLine();
            statsReader.nextInt();
        }

        Scanner charReader = new Scanner(charFile);
        BufferedWriter codeWriter = new BufferedWriter(new FileWriter(codeFile));   

        while (charReader.hasNext()) {
            color = charReader.next();
            name = charReader.nextLine();
            name = name.replaceAll("\t", "");
            typing = pokeReader.next();
            place = charReader.nextInt();
            area = charReader.nextInt();
            def = charReader.nextInt();
            shape = charReader.nextInt();
            size = charReader.nextInt();
            spe = charReader.nextInt();

            index = typing.indexOf('/');
            if (index == -1) {
                typeOne = determineType(typing);
                typeTwo = '0';
            }
            else {
                typeOne = determineType(typing.substring(0, index));
                typeTwo = determineType(typing.substring(index+1, typing.length()));
            }
        }

SSCCE:

public class Tester {
public static void main(String[] args) {
    File statsFile = new File("stats.txt");
    File testFile = new File("test.txt");
    try {
        Scanner statsReader = new Scanner(statsFile);
        BufferedWriter statsWriter = new BufferedWriter(new FileWriter(testFile));
        while (statsReader.hasNext()) {
            statsWriter.write(statsReader.nextLine());
            statsWriter.newLine();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

Это классическая проблема: перед чтением файла необходимо flush и close выходной поток (в данном случае statsWriter).

Будучи буферизованным, он не на самом деле записывает в файл при вызове write. Вызов flush заставляет его завершить любые ожидающие операции записи.

Вот javadoc для OutputStream.flush () :

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

0 голосов
/ 09 сентября 2011

После того, как вы написали файл с вашим statsWriter, вам нужно позвонить:

statsWriter.flush();
statsWriter.close();

или просто:

statsWriter.close();  // this will call flush();

Это потому, что вы используете Buffered Writer, он не записывает все в файл при вызове функций write, а скорее в буферизованных блоках. Когда вы вызываете flush() и close(), он освобождает все содержимое, которое у него есть в буфере, в файл и закрывает поток.

Вам нужно будет сделать то же самое для вашего второго писателя.

...