Java BufferedWriter 创建空字符

标签 java java.util.scanner bufferedwriter null-character

我一直在使用 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/

相关文章:

java.io.FileNotFoundException(未找到文件)使用扫描仪。我的代码有什么问题?

Java:复制文本文件时覆盖一个字符

java - 在 Java 中,使用 BufferedWriter 或直接写入文件有什么区别?

Java - 将 ArrayList 中的字符串与 .txt 文件中的所有文本进行比较

java - Mongo Hadoop 连接器问题

java - 在 JPA 中加入命名查询

java - 抛出 NullPointerException,但对象已创建并正确返回值

java - Voip UDP 添加序列号(准备丢包)

java - 在构造函数中传递集合引用是不是糟糕的设计?

java - 如何使用 Scanner 拆分以空格为分隔符的字符串