从Java中的文件无限循环读取

时间:2017-01-24 20:34:01

标签: java infinite-loop

有谁知道为什么这会让我的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();
   }

由于

3 个答案:

答案 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);