用于拆分数据行的String.split无法正常工作

时间:2011-08-31 09:36:55

标签: java .net string newline

我使用VB.NET为我的游戏创建数据(适用于Android,Java代码),这就是它的样子:

5;0000000100011100010000000;2;2
5;1000001100010000000000000;0,1;0,1

其中每一行都是一个级别。在VB.NET中,我通过vbNewLine常量创建新行(我认为它的ASCII代码是13)然后使用IO.File.WriteAllText将其写入文件。

在我的Java游戏中,我使用\n来分割级别:

String[] levelData = rawData.split("\n");

但是,在处理整个数据时,levelData在结束后总是有一个“新行”。例如,levelData [0]为5;00...2;2<new line>,导致Integer.parseInt异常。然后我调试,发现了这个:

rawData.charAt(31) //It's a \r, not \n

所以,我改变了分割线:

String[] levelData = rawData.split("\r");

但是现在,levelData [1]将是<newline>5...

我究竟需要做些什么才能解决这个问题? 请解释“新行”如何在Java String中工作。

4 个答案:

答案 0 :(得分:10)

我认为vbNewLine常量将两个“\ r \ n”放在最后,因此在分割时会留下一个字符。尝试使用两者进行拆分。

答案 1 :(得分:4)

很可能是你在VB中显示的代码就是问题。

  

我通过vbNewLine常量创建新行(我认为它的ASCII代码是13)

首先验证这一点,然后查找代码13是什么!这是一般ascii table

  

代码13是一个carrige返回,在Java中表示为\ r

     

代码10是换行符,用Java表示为\ n

一个好的提示是阅读一些关于NewLines的信息,它完全被提升,Windows和Linux使用不同的方式来表示新的一行。

  • CR + LF: Microsoft Windows,DEC TOPS-10,RT-11和大多数其他早期的非Unix和非IBM操作系统,CP / M,MP / M,DOS(MS- DOS,PC-DOS等),Atari TOS,OS / 2,Symbian OS,Palm OS
  • LF: Multics,Unix和类Unix系统(GNU / Linux,AIX,Xenix,Mac OS X,FreeBSD等),BeOS,Amiga,RISC OS等。< / LI>
  • CR: Commodore 8位计算机,Acorn BBC,TRS-80,Apple II系列,Mac OS高达9版和OS-9

答案 2 :(得分:2)

为什么不使用Scanner来阅读文件并拆分换行?

Scanner sc = new Scanner(new File("levels.text"));
while (sc.hasNextLine()) {
  String nextLine = sc.nextLine();
  if(nextLine.lenght() > 0) { // you could even use Java regexes to validate the format of every line
    String[] levelElements = nextLine.split(";");
    // ...
  }
}

答案 3 :(得分:1)

vbNewLine依赖于平台。在Windows上,换行符包含两个字符\ n和\ r \ n而不仅仅是\ n