Как читать текстовый файл с сервера и отображать только 100 последних строк в текстовом представлении

Часть кода ниже взята из моего приложения для Android. Цель состоит в том, чтобы прочитать текстовый файл с сервера и отобразить 100 последних строк этого в текстовом представлении. Очевидно, что приведенный ниже код работает правильно, только если количество строк в текстовом файле равно 2000.
Я могу думать о том, что сначала мне нужно пройти все строки, чтобы подсчитать их количество, а затем снова пройти, чтобы отобразить 100 последних строк в текстовом представлении. Я пробовал вложенные BufferedReaders, но не получилось. Есть идеи?

 protected Void doInBackground(String...params){
        URL url;
        int lines = 0;
        try {
            //create url object to point to the file location on internet
            url = new URL(params[0]);
            //make a request to server
            HttpURLConnection con=(HttpURLConnection)url.openConnection();
            //get InputStream instance
            InputStream is=con.getInputStream();
            //create BufferedReader object

            BufferedReader br=new BufferedReader(new InputStreamReader(is));

            String line;

            //read content of the file line by line
            while((line=br.readLine())!=null){
                if(++lines > 1900)
                    text+=line + "\n";
            }

            br.close();

        }catch (Exception e) {
            e.printStackTrace();
            //close dialog if error occurs
            if(pd!=null) pd.dismiss();
        }
        return null;
    }

    protected void onPostExecute(Void result){
        //close dialog
        if(pd!=null)
            pd.dismiss();
        TextView txtview = (TextView) findViewById(R.id.text_view);
        txtview.setMovementMethod(ScrollingMovementMethod.getInstance());
        //display read text in TextView
        txtview.setText(text);
    }
}

}

2 ответа

Решение

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

Вот фрагмент кода:

/* Iterate File */
List<String> lst = new ArrayList<>();
String line = null;
while((line = br.readLine()) != null) {
    if(lst.size() == 100) {
        lst.remove(0);
    }
    lst.add(line);
}
br.close(); 

/* Make Text */
StringBuilder sb = new StringBuilder();
for(String s : lst) {
    sb.append(s).append("\n");
}
text = sb.toString();

/* Clear ArrayList */
lst.clear();

Как предложено в принятом ответе на Чтение последних n строк файла HUGE, вы можете оценить, с чего начать чтение и начать добавление строк в кеш Guava, который начнет удалять старые строки, когда у него будет 100.

Или вы можете использовать Apache ReversedLinesFileReader, как предложено в другом ответе на тот же вопрос

Или вы можете выполнить команду оболочки ('tail -n100'), как описано здесь. Если вам действительно нужен 'tail -f', подумайте об использовании Apache Commons Tailer или API уведомлений об изменениях файлов Java 7+.

НТН

Другие вопросы по тегам