【问题标题】:Reading specific column of file line by line in Java exception在Java异常中逐行读取文件的特定列
【发布时间】:2016-02-17 19:42:46
【问题描述】:

我在下面有这段代码。我要做的是读取一个文本文件,其中每一行都有由制表符分隔的字符串。例如 (name \t country \t id \t content) 其中 \t 是制表符。然后我只想打印每行的第二列。我正在尝试将整行拆分为标记,但它仅适用于文件的第一行,然后它抛出 ArrayIndexOutOfBoundsException。当我尝试仅打印第一列(令牌 [0])而不是我需要的令牌 [1] 时,它也很完美。那么我需要做什么才能获得每行的第二列?

public static void main(String[] args) throws FileNotFoundException, IOException
{
    FileInputStream fis=new FileInputStream("a.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(dis)) ;
    String line;
    while ((line = br.readLine()) != null) 
    {
        String[] tokens=line.split("\\t");
        System.out.println(tokens[1]);  

    }
    fis.close();
}  

【问题讨论】:

  • 如果输入有效,你的代码应该没问题。检查输入文件。
  • 你不应该转义\字符,试试这个:line.split("\t")
  • 如果输入无效,如果我用空格分割标记,我可以让它工作吗?像 String[] tokens=line.split("\\s") ?
  • @cricket_007 "\t" 是制表符,"\\t" 是 "\t" 文本。
  • 数组是零索引的。你在数组的第二个位置抓取一些东西,而不是“第一个”。我建议在访问数组之前拆分 "\\s+" 并使用 if 语句

标签: java file


【解决方案1】:

如果该行看起来像这样

asdf\t\t\t

那你就有问题了。你应该使用

String[] tokens=line.split("\\t", -1);

见Java: String split(): I want it to include the empty strings at the end

【讨论】:

    【解决方案2】:

    如果该行中不存在选项卡,则会出现异常。

    您应该在访问第二个元素之前检查 tokens.length()>1。

    【讨论】:

    • 这成功了!!!我只是在打印上方放了一个 if 状态。非常感谢您的帮助
    【解决方案3】:

    Java 8:

        try (Stream<String> stream = Files.lines(Paths.get("a.txt"))) {
            stream.map(line -> line.split("\\t"))
                    .filter(tokens -> tokens.length > 1)
                    .forEach(tokens -> System.out.println(tokens[1]));
        } catch (IOException e) {
            e.printStackTrace();
        }
    

    【讨论】:

    • 这不会打印所需的列,它会打印任何列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多