Java 记住扫描仪中的位置

Java 记住扫描仪中的位置,java,java.util.scanner,Java,Java.util.scanner,下面是一个简单的例子,解释了我遇到的问题: public static String nextTwoTokens(Scanner scan) { String partOne = scan.next(); String partTwo = scan.next(); return partOne+partTwo; } 除了我不想用我的两个.next()修改“光标”在扫描仪中的位置外,这应该可以正常工作 据我所知,你不能复制扫描仪对象。在这种情况下,我如何“记住”光标在扫描

下面是一个简单的例子,解释了我遇到的问题:

public static String nextTwoTokens(Scanner scan) {
    String partOne = scan.next();
    String partTwo = scan.next();
    return partOne+partTwo;
}
除了我不想用我的两个
.next()
修改“光标”在扫描仪中的位置外,这应该可以正常工作

据我所知,你不能复制扫描仪对象。在这种情况下,我如何“记住”光标在扫描仪中的位置,然后在使用此方法返回之前返回到该位置


如果我做不到这一点,有没有办法获取扫描仪读取的源代码,以便构建另一个扫描仪?在这种情况下,如果我需要创建另一个扫描仪,那么新的扫描仪可以从文件/inputstream/的开头开始,而不是从旧扫描仪的光标所在的位置开始。Scanner类实际上没有实现可克隆接口。您可以通过实现可克隆接口来定制
.clone()
方法,但在这种情况下,克隆不是一个好主意

回答你的问题,不,你不能这样做。你需要找到更好的方法

另一种方法是使用方便的
.split(delimiter)
方法创建一个
字符串[]
!所以,你可以这样做:

String s = "This is a test.";
String[] tokens = s.split(" "); //split the string into tokens, cutting at the spaces
for(String token : tokens) {
    System.out.println(token);
}
这应该打印出来



a
测试

这样,您就可以循环使用
字符串[]
来获取下一个令牌,然后返回到您以前的位置

为了回答你在评论中提出的问题,如果你想做的不是一个真正没有拆分方法的字符串,我建议你这样做:

Scanner scan = new Scanner(INITIALIZE ME HOWEVER YOU WANT);
ArrayList<String> tokens = new ArrayList<String>();
while(scan.hasNext()) {
    tokens.add(scan.next());
}
Scanner scan=新扫描仪(根据需要初始化我);
ArrayList标记=新的ArrayList();
while(scan.hasNext()){
add(scan.next());
}
基本上,只需阅读所有内容并从中创建一组永久的、可导航的令牌


这是我能给你的最好的建议。这可能不是最有效的方法,但肯定是一种很好的方法

您可以使用
scan.match().end()
获取流中最后返回的令牌的位置


(这并不能解决OP的问题,但它是对问题标题的有效回答,它解决了我的问题。)

好吧,你没有。你不能。不。你需要另一种方法。对此不完全确定,所以我将留下评论。有一个
扫描仪(Techannel可读)
构造函数可用。还有一个允许您设置当前读取位置的方法。我如何使用类似于您的示例的方法,但该方法可以接受扫描仪通常能够解析的任何类型的输入(而不仅仅是字符串)?我查看了
可读的
界面,但其中不包括
文件
。如果我想这样做,我是否需要创建多个方法,比如多个
扫描器
构造函数,然后使用与
.split
方法等效的方法对我正在解析的任何对象进行标记?
扫描器#next()
不会返回除
字符串以外的其他内容,因此,没有理由使用
Object
作为列表的泛型类型。