无法在Java中String.split返回的字符串中打印换行符(\ n)

时间:2017-05-27 03:13:57

标签: java split special-characters

我正在编写一个Java程序,其中包含两列信息的制表符分隔值(TSV)文件由BufferedReader读取,然后分成两个组件(稍后将在HashMap中用作[key,value]对)在程序中)使用String.split(" \ t")。让我们说TSV文件的第一行如下:

  

Key1 \ tHello world \ n编程很酷\ nGoodbye

下面显示的代码将此行分为" Key1"和#34; Hello world \ n编程很酷\ nGoodbye":

File file = new File("sample.tsv");
BufferedReader br = new BufferedReader(new FileReader(file));
String s = br.readLine();
String[] tokens = new String[2];
tokens = s.split("\t");

现在出现的问题是尝试打印第二个字符串(即标记[1])。

System.out.println(tokens[1]);

上面的代码行导致第二个字符串被打印,并且新行字符(\ n)被忽略。换句话说,这是印刷的......

  

Hello world \ n编程很酷\ nGoodbye

......而不是......

  

Hello world

编程很酷

再见

如果我使用与上面相同的文本创建一个新字符串并使用String.equals()方法来比较两者,则返回false。

String str = "Hello world\nProgramming is cool\nGoodbye";
boolean sameString = str.equals(tokens[1]);    // false

为什么String.split()返回的字符串中的特殊字符是否可以正确打印?

2 个答案:

答案 0 :(得分:0)

BufferedReader.readLine()将您的字符串读取为一行,就像它在文件中的表示方式一样。缓冲读取器没有读取“\ n”作为ASCII(10)0x0A,它读取“ASCII(92)0x9C ASCII(110)0x6E”。

如果您按照预期的方式使用文本编辑器输入输入文件,它将以您期望的方式打印。

在类似unix的系统上

echo -e“Hello world \ nProgramming很酷\ nGoodbye”> InputFile.result_you_want

回声“Hello world \ nProgramming很酷\ nGoodbye”> InputFile.result_you_get

您可以使用echo之类的程序来转换TSV,但是您需要拆分“\ t”字符,ASCII(9)0x09,而不是文字“\ t”。

Split采用正则表达式。转义该标签字符可能很有趣。 “\ t”或“\\ t”可以在那里做到。

如果这是为了工作,您可能希望使用工具或库来解决必须使用echo转换文件的问题。 String parsing in Java with delimeter tab "\t" using split在那里有一些建议。

搜索CSV java API可能非常有用。大多数都允许您设置分隔符字符和行结束格式的信息。

答案 1 :(得分:-1)

因为在计算机方面,文本'\ n'不像二进制'\ n'。

你的第一行文件,我认为就像key1 Hello world \ nProgramming \ ncool

所以它可以分割\ t,但是当涉及到打印时,它只显示文本 '\ n'但不是二进制'\ n',它将构成新的行

相关问题