我还是java的新手,是否可以重新使用Scanner对象?
下面的例子是我正在读一个文件来做字符,单词和行数。我知道必须有一个更好的方法只使用一个扫描仪对象进行计数,但这不是主要观点。我只是想知道为什么有input.close()
但没有input.open()
或input.reset
等等。因为我实际上正在读同一个文件,是否可以只创建一个Scanner对象并传递3个方法用吗?谢谢
public class Test {
/**
* @throws java.io.FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
File file = new File("demo.java");
Scanner input = new Scanner(file);
Scanner input2 = new Scanner(file);
Scanner input3 = new Scanner(file);
int lines = 0;
int words = 0;
int characters = 0;
checkCharacters(input3);
checkLines(input);
checkwords(input2);
}
private static void checkLines(Scanner input) {
int count = 0;
while (input.hasNext()) {
String temp = input.nextLine();
String result = temp;
count++;
}
System.out.printf("%d lines \n", count);
}
private static void checkwords(Scanner input2) {
int count = 0;
while (input2.hasNext()) {
String temp = input2.next();
String result = temp;
count++;
}
System.out.printf("%d words \n", count);
}
private static void checkCharacters(Scanner input3) {
int count = 0;
while (input3.hasNext()) {
String temp = input3.nextLine();
String result = temp;
count += temp.length();
}
System.out.printf("%d characters \n", count);
}
}
答案 0 :(得分:1)
不,无法从扫描仪上的方法重置扫描仪。如果您将InputStream
传入扫描仪,然后直接重置流,但我认为这不值得,您可以这样做。
您似乎正在解析同一个文件3次并处理相同的输入3次。这似乎是浪费处理。你不能一次完成所有3个计数吗?
private static int[] getCounts(Scanner input) {
int[] counts = new int[3];
while(input.hasNextLine()){
String line = input.nextLine();
counts[0]++; // lines
counts[2]+=line.length(); //chars
//count words
//for simplicity make a new scanner could probably be better
//using regex or StringTokenizer
try(Scanner wordScanner = new Scanner(line)){
while (wordScanner.hasNext()) {
wordScanner.next();
count[1] ++; //words
}
}
}
return counts;
}
当然,面向对象的方式是返回一个名为Counts
的新对象,其方法为getNumLines()
,getNumChars()
等。
修改
有一点需要注意,我保持计算与原始问题中的计算相同。我不确定计数是否总是准确的,特别是字符,因为扫描仪可能不会返回所有行结束字符所以字符数可能会关闭,如果有连续的空白行,可能会关闭行数?你需要测试一下。
答案 1 :(得分:0)
不可能,因为documentation说
void close()
throws IOException
关闭此流并释放与之关联的所有系统资源 它。如果流已经关闭,则调用此方法没有 效果。
一旦resource
为relaesed
,就无法取回它,直到你有一个对它的引用,实际上是关闭的