Java 使用数组在Scanner类中hasNext和FindLine

Java 使用数组在Scanner类中hasNext和FindLine,java,Java,我是Java新手,我有多年的C语言经验,希望你能帮助我 我有一个十进制文件,我需要找到一个标题,从那里选择数据,然后再次查找标题。 假设我的文件如下所示: 480 124 125 001 047 001 047 001 480 001 001 001 001 001 001 001 001 001 001 001 001 047 001 480 002 002 002 002 002 002 002 002 我的标题是: 001 047 001 480 标头存储在名为“header”的int

我是Java新手,我有多年的C语言经验,希望你能帮助我

我有一个十进制文件,我需要找到一个标题,从那里选择数据,然后再次查找标题。 假设我的文件如下所示:

480 124 125 001 047 001 047 001 480 001 001 001 001 001 001 001 001 001 001 001 001 047 001 480 002 002 002 002 002 002 002 002
我的标题是:

001 047 001 480
标头存储在名为“header”的int数组中

我尝试了多种方法- 守则:

Integer i1 = new Integer(this.header[0]);
Integer i2 = new Integer(this.header[1]);
Integer i3 = new Integer(this.header[2]);
Integer i4 = new Integer(this.header[3]);

nextDec.hasNext(i1.toString() + i2.toString() + i3.toString() + i4.toString());
返回false,但我希望为true。 即使我删除了文件中头号的前导零,它也会返回false(实际上我无法删除它们)

守则:

Integer i1 = new Integer(this.header[0]);
Integer i2 = new Integer(this.header[1]);
Integer i3 = new Integer(this.header[2]);
Integer i4 = new Integer(this.header[3]);

nextDec.hasNext(i1.toString() + i2.toString() + i3.toString() + i4.toString());
nextDec.findInLine(i1.toString() + " " + i2.toString() + " " + i3.toString() + " "
                + i4.toString());
返回null,但我希望它返回头。 如果我删除文件中头号的前导零,它将返回头,为什么它不能与hasNext方法一起工作

守则:

nextDec.findInLine(Arrays.toString(header));
没有任何产出,这是为什么? 如何检测带有前导零的标题,检索数据并重新找到它?是否可以找到找到标头的位置(索引)

多谢各位


我会尽量说清楚的。我使用监控软件在PC上记录了流数据。数据以十进制形式记录到文件中,前导零(有3位数字)和数字之间的空格。该文件包含多个缓冲区。 数据缓冲区以一个4字节的头开始,我需要在文件中找到头,并收集它后面的数据到适当的变量,以显示在图形中。我在考虑使用nextInt,nextFloat,根据我想在找到报头后读取的数据类型


谢谢

可能的解决方案是使用标题作为分隔符,然后扫描输入。 但我认为最好是手动操作,而不是使用扫描仪

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        String s = "480 124 125 001 047 001 047 001 480 001 001 001 001 001 001 001 001 001 001 001 001 047 001 480 002 002 002 002 002 002 002 002\n";

        int header[] = new int[] {1, 47, 1, 480};
        String stringHeader = "";
        for (int e : header) {
            stringHeader += String.format("%03d ", e);
        }
        Scanner scanner = new Scanner(s);
        scanner.useDelimiter(stringHeader);

        // Skipping everything before first header
        scanner.skip(".*?"+stringHeader);

        // Now we get data between headers
        while(scanner.hasNext()) {
            System.out.println(   scanner.next()   );
        }

    }
}
输出(第一个和第二个标头后的两个标记):


这是你想要得到的吗?

你能用一个例子来解释你期望得到的输出吗。1) 查找行中标题的位置。2) ?您正在寻找一个特定的字符串,没有空格或前导零。该字符串不会出现在您的输入中。你为什么希望
hasNext()
找到它?我会尽量说清楚的。我使用监控软件在PC上记录了流数据。数据以十进制形式记录到文件中,前导零(有3位数字)和数字之间的空格。该文件包含多个缓冲区。数据缓冲区以一个4字节的头开始,我需要在文件中找到头,并收集它后面的数据到适当的变量,以显示在图形中。我在考虑使用nextInt,nextFloat,根据在找到报头后我想要读取的数据类型来实现这一点。报头数组是如何定义的?例如,如果您在java中使用047 literal,它将其视为oct,当转换为字符串时,结果为39(dec),因此您不会得到您期望的结果?谢谢您的回复,我必须使用某种读取文件的方法,我无法将字符串复制到应用程序中(txt文件可能有几MB长)。此外,由于我不知道缓冲区长度是否存在错误,skip方法可能会导致不同步错误(传输中发生错误,并且短缓冲区意外到达)。我知道java中没有C中的union,我可以使用scanner将流的一部分称为byte/short/int/float吗?有更好的方法吗?再次感谢您如果我在接收缓冲区时出错,我可能会得到比预期更短的缓冲区。但现在我明白了,我将能够使用数组长度找到长度(每个scanner.next();将给我一个恼怒的缓冲区)。如何使用读取文件而不是将数据复制到应用程序中的字符串?感谢您可以使用file类获取文件大小:
newfile(“/path/to/file.txt”).length()