2017-01-24 4 views
1

Может ли кто-нибудь понять, почему это заставляет Java-сервлет зависать? Компилирует, но CPU идет на 100%, поэтому я предполагаю, что где-то есть бесконечный цикл?Чтение из файла бесконечного цикла в Java

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(); 
    } 

Благодаря

+2

ваше время проверки цикла, если он не имеет следующую строку, но не читает, что следующая строка –

+1

'в то время как (scan.hasNextLine())' - Вы никогда не читали со сканера в этом цикле. Так что, если есть даже одна строка, то навсегда будет доступна следующая строка. – David

+0

@ A.A. Первый цикл подсчитывает строки так, что второй цикл выбирает случайное число строк, которые фактически находятся в файле. –

ответ

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

0

Hi вы передаете строку в конструктор сканера. Вы должны использовать

Scanner sc = new Scanner(new File(filepath)); 

Почему, если вы используете счетчик для подсчета строк, почему вы используете цикл снова случайным образом, если вы хотите прочитать из файла вы можете использовать

while(sc.hasNextLine()){ 
line= sc.nextLine();} 

это будет дайте последнюю строку.

EDIT Чтобы получить случайную строку из файла. Как курсор перемещается в конец файла в то время цикла

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); 
+0

Я пытаюсь получить случайную строку, а не последнюю. –

+0

Ваша петля - это прекрасный сканер-конструктор, вам нужно передать поток ввода, и вы просто передаете строку. – Manoj

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