有谁知道为什么这会让我的Java servlet挂起?编译,但CPU达到100%,所以我假设某处有一个无限循环..?
quotes.txt只有10行。
String line = "";
try {
String filePath = new File("").getAbsolutePath();
filePath += "/quotes.txt";
Scanner scan = new Scanner(filePath);
int lines = 0;
while (scan.hasNextLine()) {
lines++;
}
Random random = new Random();
int randomInt = random.nextInt(lines);
for (int i = 0; i < randomInt; i++) {
line = scan.nextLine();
}
scan.close();
} catch (Exception e){
line = e.getMessage();
}
由于
答案 0 :(得分:0)
您的代码挂起,因为在第一个循环中未调用scan.nextLine()
。即使你实现它,第二个循环(for
循环)也会抛出异常,因为扫描程序没有从文件输入。
您可以通过重新初始化Scanner
对象来避免这种情况。
由于你想从文件中获取随机行(按任意顺序),我建议如下:
try {
String filePath = new File("").getAbsolutePath();
filePath += "/quotes.txt";
List<String> listOfLines = Files.readAllLines(Paths.get(filePath), Charset.defaultCharset());
Random random = new Random();
int randomInt = random.nextInt(listOfLines.size());
System.out.println(listOfLines.get(randomInt));
} catch (IOException e) {
e.getMessage();
}
现在上面的代码将所有行读入内存(此解决方案显然不适用于大文件),之后,您可以获取随机数并显示该行。
您还可以查看this SO Question
答案 1 :(得分:0)
您好,您正在扫描构造函数中传递字符串。 你需要使用
Scanner sc = new Scanner(new File(filepath));
如果您要使用计数器计数行,为什么如果要从文件中读取,为什么还要使用随机循环? 你可以用
while(sc.hasNextLine()){
line= sc.nextLine();}
这会给你最后一行。
编辑从文件中获取随机行。当光标移动到while循环中的文件末尾时
int count=0;
List<String> lines = new ArrayList<>();
while(sc.hasNextLine()){
line= sc.nextLine();
lines.add(line);
count++;
}
Random rand = new Random();
int n= rand.nextInt(count);
String output = lines.get(n);
答案 2 :(得分:0)
HasNextLine不会移动到下一个值,因此请使用nextLine移动它。如果要使用它,也可以将其分配给变量。
ArrayList<String> a = new Arraylist<String>();
while (scan.hasNextLine()) {
a.add(scanner.nextLine());
}
Random random = new Random();
int randomInt = random.nextInt(a.size());
line = a.get(randomInt);