我一直在使用 Java 的 BufferedWriter 写入文件以解析一些输入。但是,当我之后打开文件时,似乎添加了空字符。我尝试将编码指定为“US-ASCII”和“UTF8”,但我得到了相同的结果。这是我的代码片段:
Scanner fileScanner = new Scanner(original);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "US-ASCII"));
while(fileScanner.hasNextLine())
{
String next = fileScanner.nextLine();
next = next.replaceAll(".*\\x0C", ""); //remove up to ^L
out.write(next);
out.newLine();
}
out.flush();
out.close();
也许问题甚至不在 BufferedWriter 上?
我已将其缩小到此代码块,因为如果我将其注释掉,输出文件中将没有空字符。如果我在 VIM 中进行正则表达式替换,则该文件不含空字符 (:%s/.*^L//g)。
如果您需要更多信息,请告诉我。
谢谢!
编辑: 正常行的 hexdump 看起来像: 0000000 5349 2a41 3030 202a
但是当这段代码运行时,hexdump 看起来像: 0000000 5330 2a49 4130 202a
我不确定为什么事情会变得困惑。
编辑: 此外,即使文件与正则表达式不匹配并运行该代码块,它也会以空字符出现。
编辑: 这是 diff 前几行的 hexdump: http://pastie.org/pastes/8964701/text
命令是:diff -y testfile.hexdump expectedoutput.hexdump
其余的行与最后两行不同。
最佳答案
编辑:查看您提供的 hexdump diff,唯一的区别是一个具有 LF 行结尾 (0A),另一个具有 CRLF 行结尾 (0D 0A)。 diff 中的所有其他数据都提前移动以容纳额外的字节。
CRLF 是在您使用的操作系统上结束的默认行。如果您希望在输出中以特定行结尾,请写入字符串 "\n"
或 "\r\n"
。
之前我注意到 Scanner
没有指定字符集。它应该指定已知输入被编码的适当的一个。但是,这不是意外输出的来源。
关于Java BufferedWriter 创建空字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507957/