首页 > 解决方案 > Java .split() 越界

问题描述

我的代码有问题。

我正在尝试从 .txt 文件中提取频道的名称。我不明白为什么该方法line.split()会返回一个长度为 0 的数组:

有人可以帮助我吗?

这是文件 .txt:

------------[channels.txt]----------

...
#CH id="" tvg-name="Example1" tvg-logo="http... 
#CH id="" tvg-name="Example2" tvg-logo="http...
#CH id="" tvg-name="Example3" tvg-logo="http...
#CH id="" tvg-name="Example4" tvg-logo="http...
...

这是我的代码:

try {
    FileInputStream VOD = new FileInputStream("channels.txt");
    BufferedReader buffer_r = new BufferedReader(new InputStreamReader(VOD));
    String line;
    ArrayList<String> name_channels = new ArrayList<String>();

    while ((line = buffer_r.readLine()) != null ) {
        if (line.startsWith("#")) {
            String[] first_scan = line.split(" tvg-name=\" ", 2);
            String first = first_scan[1];               // <--- out of bounds

            String[] second_scan = first.split(" \"tvg-logo= ", 2);
            String second = second_scan[0];

            name_channels.add(second);

        } else {
            //...           
        }
    }
    for (int i = 0; i < name_channels.size(); i++) {
        System.out.println("Channel: " + name_channels.get(i));
    }
} catch(Exception e) {
    System.out.println(e);
}

标签: javafilesplit

解决方案


所以你有这样的例子

#CH id="" tvg-name="Example1" tvg-logo="http... 

并试图拆分这些字符串

" tvg-name=\" "
" \"tvg-logo= "

这些字符串都没有在示例中。附加了一个虚假的空格,第二个开头的空格位于错误的位置。

修复字符串,这是一个简洁但完整的程序来演示

interface Split {
    static void main(String[] args) {
        String line = "#CH id=\"\" tvg-name=\"Example1\" tvg-logo=\"http...";

        String[] first_scan = line.split(" tvg-name=\"", 2);
        String first = first_scan[1];               // <--- out of bounds

        String[] second_scan = first.split("\" tvg-logo=", 2);
        String second = second_scan[0];

        System.err.println(second);
    } 
}

当然,如果您有任何以开头'#'但不匹配的行,您将遇到类似的问题。

使用正则表达式和捕获组可能会更好地完成这类事情。


推荐阅读