String.split для разделения строк данных не работает правильно - PullRequest
3 голосов
/ 31 августа 2011

Я использую 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 ]

10 голосов
/ 31 августа 2011

Я полагаю, что константа vbNewLine ставит оба символа "\ r \ n" в конце и, следовательно, один символ остается при разбиении.Попробуйте разделить его, используя оба.

4 голосов
/ 31 августа 2011

Скорее всего, проблема заключается в коде, который вы показываете в VB.

Я создаю новую строку с помощью константы vbNewLine (я думаю, что ее код ASCII равен 13)

Сначала убедитесь в этом, а затем посмотрите, что такое код 13! Вот общая таблица ascii .

код 13 - возврат каретки и представлен в 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 и другие.
  • CR: Commodore 8-битные машины, Acorn BBC, TRS-80, семейство Apple II, Mac OS до версии 9 и OS-9
2 голосов
/ 31 августа 2011

Почему бы вам не использовать Сканер , чтобы прочитать ваш файл и разбить его на строки?

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(";");
    // ...
  }
}
1 голос
/ 31 августа 2011

vbNewLine зависит от платформы.в Windows символ новой строки состоит из двух символов \ n и \ r, а не просто \ n

...