#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
не имеет к этому никакого отношения.