Как выйти из непрерывного цикла while с помощью пользовательского ввода? - PullRequest
0 голосов
/ 20 декабря 2011

Я довольно новичок в Java. В настоящее время я читаю ввод с URL, который предоставляет мне поток текста в реальном времени. Я хочу постоянно записывать это в текстовый файл, поэтому каждый раз, когда URL дает новую строку, я добавляю это в строковый буфер, вне моего бесконечного цикла while, я записываю содержимое буфера в свой файл. Проблема в том, что мне нужен способ выхода из цикла while, потому что сервер никогда не прекращает давать мне данные, поэтому я хочу сделать что-то, например, ввести 0 в консоли, чтобы выйти из цикла while и записать содержимое в файл. По этому вопросу кто-нибудь знает, достигнет ли мой объект класса StringBuffer ограничение хранилища?

Ответы [ 4 ]

2 голосов
/ 20 декабря 2011

Цикл должен записывать не в буфер в памяти, а непосредственно в средство записи файлов (обернуто внутри BufferedWriter).Это позволит избежать нехватки памяти.

Вы должны запустить новый поток, который выполняет ваш цикл while и проверяет на каждой итерации, если потоку было предложено прервать себя, используя Thread.currentThread().isInterrupted().После прерывания поток должен остановить цикл while и закрыть средство записи.

Пусть ваш основной поток прочитал из командной строки, а после ввода команды остановки вызовите interrupt() в потоке устройства записи.

0 голосов
/ 20 декабря 2011

Используя статуэтку break;, вы можете выйти из самой внутренней петли.Я бы предложил создать логическое поле с именем running.Каждую итерацию цикла проверяйте.Если false, выйдите из цикла.

Или еще более эффективным будет использование логического значения в качестве условия while:

/* Declaration */
public volatile boolean running = true;

/* Code */
running = true;
while (running)
{


}

В зависимости от введенного пользователем, установите флаг запуска на false.

Вы можете попробовать что-то вроде этого, чтобы флаг стал ложным при вводе чего-либо в консоли:

new Thread("User Input Handler", new Runnable()
{
    public void run()
    {
        try
        {
            System.in.read();
            running = false;
        } catch (Exception e) {}
    }
}).start();
0 голосов
/ 20 декабря 2011

Вы можете использовать оператор break;, чтобы выйти из цикла.То, что вам нужно сделать, это проверить, что вы прочитали входные данные, с тем, что вы хотите, чтобы ваше условие остановки, и если они совпадают, то вызовите break;.Как то так:

while(true) {
    String input = /* read input */;
    if("0".equals(input)
        break;
    /* whatever you want to do if you haven't hit your stopping condition */
}
0 голосов
/ 20 декабря 2011

Когда вы добавляете «Бесконечность» на картинку, ДА в какой-то момент у вас кончится память.

Чтобы выйти из цикла, вы можете запустить его в отдельном потоке и позволить основному потоку прослушивать вводимые пользователем данные. И на основе входных данных основной поток изменит общую переменную, обычно булеву, чтобы определить конец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...