Java String.startsWith () «кажется» не работает для первой строки текстового файла - PullRequest
0 голосов
/ 10 марта 2019

У меня есть такой текстовый файл, и я хочу проанализировать информацию из текстового файла.

#title キミと☆Are You Ready?
#artist トライクロニカ
#mobile deresimu
#easy 0
#normal 22
#hard 27
#tag SHOW BY ROCK!!
#preset all

Я использовал этот код для его анализа.

<code>File infoFile = new File(dir, "info.txt");
//parse info.txt
String songName="?";
String artist = "?";
int difficulties[] = new int[5];

try {
    BufferedReader br = new BufferedReader(new FileReader(infoFile));
    String line = br.readLine();
    while (line != null) {
        Log.v(TAG, "line=" + line);
        //I hate BOM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        /*
        <a href="http://www.faqs.org/rfcs/rfc3629.html">RFC 3629 - UTF-8, a transformation format of ISO 10646</a>
        *
        * <p>The
         * <a href="http://www.unicode.org/unicode/faq/utf_bom.html">Unicode FAQ</a>
    * defines 5 types of BOMs:<ul>
        * <li><pre>00 00 FE FF  = UTF-32, big-endian
*
FF FE 00 00  = UTF-32, little-endian
*
FE FF        = UTF-16, big-endian
*
FF FE        = UTF-16, little-endian
*
EF BB BF     = UTF-8
* * * /1152697/poryadok-sledovaniya-baitov-zatrudnyaet-chtenie-failov-v-java * / line = line.replace ("\ u00EF \ u00BB \ u00BF", ""); line = line.replace ("\ u0000 \ u00FE \ u00FF", ""); line = line.replace ("\ u00FF \ u00FE \ u0000", ""); line = line.replace ("\ u00FE \ u00FF", ""); line = line.replace ("\ u00FF \ u00FE", ""); if (line.startsWith ("# title")) { Log.v (TAG, «начинается с»); line = line.replace ("# title", "") .trim (); songName = line; } else if (line.startsWith ("# artist")) { line = line.replace ("# artist", "") .trim (); художник = линия; } else if (line.startsWith ("# easy")) { затруднения [0] = Integer.parseInt (line.replace ("# easy", "") .trim ()); } else if (line.startsWith ("# normal")) { трудности [1] = Integer.parseInt (line.replace ("# normal", "") .trim ()); } else if (line.startsWith ("# hard")) { затруднения [2] = Integer.parseInt (line.replace ("# hard", "") .trim ()); } else if (line.startsWith ("# master")) { трудности [3] = Integer.parseInt (line.replace ("# master", "") .trim ()); } else if (line.startsWith ("# apex")) { трудностей [4] = Integer.parseInt (line.replace ("# apex", "") .trim ()); Продолжить; } line = br.readLine (); } } catch (IOException | NumberFormatException e) { бросить новое RuntimeException (e); } //info.txt анализ выполнен. Log.v (TAG, "Info.txt parse done."); Log.v (TAG, "Song name =" + songName); Log.v (TAG, "Трудности =" + Arrays.toString (сложности)); Log.v (TAG, "Artist =" + artist); Log.v (TAG, "Folder =" + dir.getName ());

Разбор всех остальных строк в порядке, кроме первой. if (line.startsWith("#title")) {, кажется, никогда не будет верным для данного текстового файла. Когда я изменил startsWith на contains, все заработало.

Сначала я подумал, что это проблема спецификации, поэтому я добавил 5 строк, удаляющих последовательности спецификации. Однако это не сработало. Переменная songName всегда равна "?" когда я использую startsWith для первой строки.

Любые подсказки, почему этот код не может соответствовать #title? Спасибо.

Выход Logcat:

2019-03-10 23:00:22.872 23600-23600/sma.rhythmtapper V/NoteFile: line=#title キミと☆Are You Ready?
2019-03-10 23:00:22.872 23600-23600/sma.rhythmtapper V/NoteFile: line=#artist トライクロニカ
2019-03-10 23:00:22.872 23600-23600/sma.rhythmtapper V/NoteFile: line=#mobile deresimu
2019-03-10 23:00:22.873 23600-23600/sma.rhythmtapper V/NoteFile: line=#easy 0
2019-03-10 23:00:22.873 23600-23600/sma.rhythmtapper V/NoteFile: line=#normal 22
2019-03-10 23:00:22.873 23600-23600/sma.rhythmtapper V/NoteFile: line=#hard 27
2019-03-10 23:00:22.874 23600-23600/sma.rhythmtapper V/NoteFile: line=#tag SHOW BY ROCK!!
2019-03-10 23:00:22.876 23600-23600/sma.rhythmtapper V/NoteFile: line=#preset all
2019-03-10 23:00:22.876 23600-23600/sma.rhythmtapper V/NoteFile: Info.txt parse done.
2019-03-10 23:00:22.876 23600-23600/sma.rhythmtapper V/NoteFile: Song name=?
2019-03-10 23:00:22.877 23600-23600/sma.rhythmtapper V/NoteFile: Difficulties=[0, 22, 27, 0, 0]
2019-03-10 23:00:22.877 23600-23600/sma.rhythmtapper V/NoteFile: Artist=トライクロニカ
2019-03-10 23:00:22.877 23600-23600/sma.rhythmtapper V/NoteFile: Folder=キミと☆Are You Ready?

EDIT

Я обнаружил проблему, напечатав последовательность байтов в logcat. Он сказал:

"# title キ ミ と ☆ Ты готов?" -> [-17, -69, -65, 35, 116, 105, 116, 108, 101, 32, -29, -126, -83, - 29, -125, -97, -29, -127, -88, -30, -104, -122, 65, 114, 101, 32, 89, 111, 117, 32, 82, 101, 97, 100, 121, -17, -68, -97]

"# title" -> [35, 116, 105, 116, 108, 101]

Поэтому мне нужно удалить -17, -69, -65 из переменной line. Как мне достичь цели без использования внешней библиотеки?

1 Ответ

1 голос
/ 10 марта 2019

Подозрение, что спецификация стала причиной проблемы, было правдой.

Плюс, я изменил код удаления спецификации на этот:

line=line.replace("\uEFBB\u00BF", "");
line=line.replace("\u0000\uFEFF","");
line=line.replace("\uFFFE\u0000","");
line=line.replace("\uFEFF","");
line=line.replace("\uFFFE","");

Будьте осторожны с

  • Пробел
  • \ u00EF! = байт 0xEF

Спасибо всем, кто пытался мне помочь, и надеемся, что другие, кто может иметь такую ​​же проблему, получат помощь из этого поста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...