После чтения с помощью BufferReader ‘ n’ не будет принято в качестве символа новой строки, как это решить?

#java #io

#java #io

Вопрос:

У меня есть большой текстовый файл, который я хочу отформатировать. Допустим, вызывается входной файл inputFile и вызывается выходной файл outputFile .

Это мой код для использования BufferedReader и BufferedWriter вот мой код

  public static void readAndWrite(String fileNameToRead, String fileNameToWrite) {
        try{
            BufferedReader fr = new BufferedReader(
                    new FileReader(String.format("%s.txt", fileNameToRead)));
            BufferedWriter out = new BufferedWriter(
                    new FileWriter(String.format("%s.txt", fileNameToWrite), true));
            String currentTmp = "";
            String tmp = "";

            String test = "work nwork";
            out.append(test);


            while((tmp = fr.readLine()) != null) {
                tmp = tmp.trim();
                if(tmp.isEmpty()) {
                    currentTmp = currentTmp.trim();
                    out.append(currentTmp);
                    out.newLine();
                    out.newLine();
                    currentTmp = "";
                } else {
                    currentTmp = currentTmp.concat(" ").concat(tmp);
                }
            }
            if(!currentTmp.equals("")) {
                out.write(currentTmp);
            }
            fr.close();
            out.close();
        } catch (IOException e) {
            System.out.println("exception occoured"   e);
        }

    }

    public static void main(String[] args) {
        String readFile = "inPutFile";
        String writeFile = "outPutFile";
        readAndWrite(readFile, writeFile);
    }
  

Проблема в том, что test строку внутри кода, в которой есть ‘ n’, мы можем преобразовать в новую строку с помощью BufferedWriter . Но если я помещу ту же строку в текстовый файл, она не будет работать так же.

Более простой способ увидеть, что я хочу, чтобы мой входной файл имел это

 workn
work
  

и выводить как

 work 
work
  

Я использую mac, поэтому разделителем должно быть ‘ n’

Комментарии:

1. Вывод, который вы получаете, правильный. Вы не должны видеть символы n , только запуск новой строки. n Строковый литерал внутри преобразуется в новую строку компилятором Java, а не BufferedWriter . Неясно, о чем вы спрашиваете.

Ответ №1:

 workn 
  

если вы видите «n» в вашем файле, это не символ новой строки. Это всего лишь два символа.

trim() Метод не удалит эти символы.

Вместо этого у вас может быть что-то вроде:

 if (tmp.endsWith("n")
    tmp = tmp.substring(0, tmp.length() - 2);
  

Я использую mac, поэтому разделителем должно быть ‘ n’

Вы должны использовать символ новой строки для платформы. Итак, при записи в ваш файл код должен быть:

 } else {
    currentTmp = currentTmp.concat(" ").concat(tmp);
    out.append( currentTmp );
    out.newLine();
}
  

Метод newline() будет использовать соответствующую строку новой строки для платформы.

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

Вам нужно понять, что такое escape-символ в Java. Когда вы используете:

 String text = "testn"
  

и запишите строку в файл, в файл записывается только 5 символов, а не 6. » n» — это escape-последовательность, которая приведет к добавлению значения ascii для символа новой строки в файл. Этот символ не отображается, поэтому вы не можете увидеть его в файле.

Комментарии:

1. ` n` находится внутри строкового литерала Java "work nwork" , так что это действительно новая строка.

2. Тестовая строка, которая work nwork дает результат, соответствует ожиданиям. В чем моя проблема, если у меня есть n во входном файле, он не выдает правильный результат

3. @MalcolmLiu, в вашем вопросе вы показываете две строки данных, которые, я полагаю, вы видите, если загружаете файл в редактор. Если вы видите » n» в файлах, то это НЕ конечная строка. Вот почему я заявил, что вам нужно проверить, заканчивается ли прочитанная вами строка на » n». Вам нужно удалить эти два символа самостоятельно, потому что BufferedReader не удалит символы для вас, потому что is не распознается как строка новой строки. Смотрите Редактирование.

4. @MarquisofLorne, OP заявляет: «Но если я помещу ту же строку в текстовый файл, она не будет выполнять то же самое». — итак, я НЕ говорил о буквальной строке в программе, которая, по словам OP, работает. Я утверждаю, что если вы видите два символа » n» в файле, то это НЕ строка новой строки.

5. Я думаю, вы правы в том, что если в файле BufferReader не будет обрабатывать n как один символ. Скорее это будет рассматриваться как два символа » и ‘n’. Я думаю, именно поэтому, когда он превращается в строку, он по-прежнему обрабатывает ее как два символа. Итак, единственным решением, как вы сказали, было бы заменить » n» на один ‘ n’.

Ответ №2:

После ответа @camickr, я думаю, я понял проблему. Некоторые как, если у меня есть текст в файле, подобный этому

 work nwork
  

n Не будет обрабатываться как один символ (‘ n’), скорее, он был обработан как два символа. Я думаю, именно поэтому, когда BufferWriter записывает входную строку, она не будет рассматривать ее как новую строку.

Комментарии:

1. «Каким-то образом» было объяснено. BufferedWriter не имеет к этому никакого отношения.