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
作为列表的泛型类型。