Sor*_*Hat 8 java bufferedwriter null-character java.util.scanner
我一直在使用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();
Run Code Online (Sandbox Code Playgroud)
也许问题甚至不是BufferedWriter?
我把它缩小到这个代码块,因为如果我将它注释掉,输出文件中就没有空字符.如果我在VIM中进行正则表达式替换,则该文件为null-character free(:%s /.*^ L // g).
如果您需要更多信息,请与我们联系.
谢谢!
编辑: 正常线的hexdump看起来像:0000000 5349 2a41 3030 202a
但是当运行此代码时,hexdump看起来像:0000000 5330 2a49 4130 202a
我不确定为什么事情变得混乱了.
编辑: 此外,即使文件与正则表达式不匹配并贯穿该代码块,它也会出现空字符.
编辑: 这是差异的前几行的十六进制:http: //pastie.org/pastes/8964701/text
命令是:diff -y testfile.hexdump expectedoutput.hexdump
其余的线条与最后两条线条不同.
编辑:看看你给出的hexdump diff,唯一的区别是一个有LF行结尾(0A)而另一个有CRLF行结尾(0D 0A).差异中的所有其他数据都向前移动以容纳额外的字节.
CRLF是您正在使用的操作系统上的默认行.如果要在输出中以特定行结束,请写入字符串"\n"
或"\r\n"
.
以前我注意到Scanner
没有指定字符集.它应该指定已知编码输入的适当的输入.但是,这不是意外输出的来源.