如何从文本文件中使用Scanner检测行尾

时间:2013-08-05 22:20:05

标签: java arrays file input line

所以我正在读取一个输入文本文件,该文件是4行单空格分隔数字。文本文件只是:

5 
9 6
4 6 8
0 7 1 5

我想将这些数字输入到称为行的2D数组中。例如,rows[1][0]应为9,即第二行中的第一个数字。

我的问题是当我使用适用于in.next()in.nextInt()的扫描程序时,它会忽略该行的结尾并继续前进,因此rows[0][1]最终成为9而不是0。如果该插槽没有编号,我希望数组完成0的填充。因此,由于第一行只有1个数字5,我希望数组rows[0][0]5,但rows[0][1]为{{1}成为rows[0][3]

我尝试使用0的try / catch和if NoSuchElementException,但这些似乎都不起作用。

非常感谢任何想法或帮助。

5 个答案:

答案 0 :(得分:5)

您可以使用扫描仪阅读单个令牌,您可以使用扫描仪读取整行,但不能使用扫描仪同时执行这两项操作。

您要做的是首先将该行读入String,然后使用该String上的Scanner来解析该行,例如:

BufferedReader lineReader = new BufferedReader(...);
String line;

while ((line = lineReader.readLine()) != null) {
    Scanner scanner = new Scanner(line); 
    // use scanner here
}

您也可以使用扫描仪来读取行而不是BufferedReader,但除非您有特定要求(例如,您尝试将其放入已使用扫描仪的代码中),否则您的身份并不重要读行。

希望有所帮助。

答案 1 :(得分:3)

使用多个扫描仪。 One Scanner使用nextLine()获取每一行,然后将获得的行提供给下一个Scanner分析每行的标记。使用它时,一定要确保内部扫描仪(以及外部扫描仪)的关闭()。

伪代码:

create fileScanner with file
while fileScanner has more lines
  get next line from fileScanner
  create new Scanner with next line, lineScanner
  while lineScanner has next, 
    get next token.
    do what you want with token.
  close of lineScanner
close fileScanner

答案 2 :(得分:1)

您应该使用BufferedReadersplit。这样做的好处是,您知道在第二维中制作数组有多大,因为split方法将返回一个数组,您可以检查其length

public static void main(String[] args) throws Exception {
    final String s = "5\n"
            + "9 6\n"
            + "4 6 8\n"
            + "0 7 1 5";
    final InputStream is = new ByteArrayInputStream(s.getBytes());
    final int[][] array = new int[4][];
    try (final BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
        String line;
        for (int i = 0; (line = br.readLine()) != null; ++i) {
            final String[] tokens = line.split("\\s");
            final int[] parsed = new int[tokens.length];
            for (int j = 0; j < tokens.length; ++j) {
                parsed[j] = Integer.parseInt(tokens[j]);
            }
            array[i] = parsed;
        }
    }
    System.out.println(Arrays.deepToString(array));
}

输出:

[[5], [9, 6], [4, 6, 8], [0, 7, 1, 5]]

由于数组不扩展,在while循环中使用它们并不容易,因为它们不知道它们的大小。使用split,您只需执行final int[] parsed = new int[tokens.length];,而Scanner超过您无法使用的空格。

第一个尺寸尺寸是硬编码的,但是如上所述,您的文件总是有4行。

答案 3 :(得分:0)

Scanner scanner = new Scanner(
            "5\n9 6\n4 6 8\n0 7 1 5");

while (scanner.hasNextLine())
{
    String currentline = scanner.nextLine();

    String[] items = currentline.split(" ");
    int[] intitems = new int[items.length];

    for (int i = 0; i < items.length; i++)
    {
        intitem[i] = Integer.parseInt(items[i]);
    }
}

答案 4 :(得分:0)

在每行的结束处,有'\ n',在每行的第一处(第一行),有'\ r'。您可以通过他们来控制文件。