Превращение удаленного файла в поток ввода через HTTP в Java - PullRequest
1 голос
/ 04 марта 2010

У меня есть URL-адрес текстового файла, и я хочу, чтобы моя Java-программа читала этот текстовый файл. Но сюжет сгущается! К файлу постоянно добавляются новые строки, и я хочу прочитать эти строки по мере их поступления.

Я думаю, что правильный подход - открыть URLConnection для URL-адреса файла и каким-то образом поместить этот URLConnection под «наблюдение» какого-либо объекта типа StreamReader или StreamBuffer.

Это - то, где мои навыки Java становятся сомнительными, и я задавался вопросом, хочет ли кто-нибудь пожертвовать ответ или два.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 05 марта 2010

Судя по комментариям выше, я думаю, что решил эту проблему. Я просто не уверен, что это не значит, что я загружаю весь файл каждый раз:

                long charsRead = 0;

                while(keepRunning)
                {
                    URL url = new URL(finalUrlString);
                    URLConnection connection = url.openConnection();
                    InputStreamReader stream = new InputStreamReader(connection.getInputStream());
                    BufferedReader reader = new BufferedReader(stream);
                    long skipped = reader.skip(charsRead);
                    String line = reader.readLine();
                    if(line != null)
                    {
                        charsRead += line.length() + 1;
                        process(line);
                    }
                    reader.close();
                }

Этот фрагмент кода работает внутри собственного потока. Я использую метод процесса, чтобы заполнить вектор объектов, генерируемых при разборе каждой строки.

Другой фрагмент кода в другом потоке смотрит на этот вектор - читает объекты - и очищает его.

Конечно, этот поток и другой поток синхронизируются вокруг этого экземпляра вектора.

1 голос
/ 04 марта 2010

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

псевдокод:

int read_bytes = 0;
while (should_be_reading) {
  # make http request

  # read or scan to read_bytes
  # emit any new bytes
  # update read_bytes

}
0 голосов
/ 04 марта 2010

Если вы отслеживаете общее количество прочитанных байтов, вы можете использовать заголовок диапазона http, чтобы сообщить серверу, чтобы начать обслуживание файла с заданной позиции. Эта функция в основном используется для возобновления загрузки, но должна применяться здесь.

Я понимаю, что это не дает вам входной поток, но я думаю, что это более надежное решение.

0 голосов
/ 04 марта 2010

Получите InputStream из URLConnection и оберните его в InputStreamReader, а затем ISR в BufferedReader:

InputStream is = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, <encoding>);
BufferedReader br = new BufferedReader(isr);

Теперь вы можете использовать br.readLine() для чтения каждой строки текста из ресурса, пока он не вернет значение NULL (EOF). Вы должны получить кодировку символов откуда-либо, либо из заголовка типа содержимого ответа HTTP, либо, если он известен, вы можете указать его напрямую.

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