Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 24

Считывание из файла последней строки

23.03.2015, 10:42. Показов 9930. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть файл в нем хранится записи:

72 23.03.2015 10:37:28 7348537A889PB1
72 23.03.2015 10:37:29 7348537A889PB2
72 23.03.2015 10:37:30 7348537A889PB3
72 23.03.2015 10:37:31 7348537A889PB4
72 23.03.2015 10:37:32 7348537A889PB5

Надо определить последнюю строчку, и взять из нее значение 7348537A889PB5, файл всегда обновляется строки добавляются в конец файла.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2015, 10:42
Ответы с готовыми решениями:

Считывание строки из файла до точки
Доброго времени суток :) Вопрос вот в чем, у меня есть файл с текстом. Нужно считывать текст и заносить в переменную типа String до...

Считывание файла в массив без последней строки
Интересует вопрос, как считывать txt в list БЕЗ последней строки. Мой код который записывает txt в лист: ...

Считывание последней строки со спец-символом '\r' из текстового файла
Всем привет! Проблема состояла в том, что моя программа неправильно считывала последнее число в текстовом файле. Проблема...

10
 Аватар для bazJaz
36 / 33 / 21
Регистрация: 11.07.2014
Сообщений: 390
23.03.2015, 10:45
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public boolean isValidFile(String filename){
        try {
            FileInputStream fis = new FileInputStream(filename);
            BufferedReader br = new BufferedReader(new InputStreamReader(fis));
            String str1;
            String str2;
            while ((str1 = br.readLine()) != null) {
                str2 = str1;
            }
            if (str1.contains("some regexp")){
                return true;
            }else{
                return false;
            }
        } catch (IOException e) {
            log.error("IOException occured",e);
        }
    }
или

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private String getLastLine(final File aFile)
   {
      String line = null;
      String tmp = null;
      BufferedReader in = null;
 
 
 
      try
      {
         in = new BufferedReader(new FileReader(aFile));
 
         while ((tmp = in.readLine()) != null)
         {
            line = tmp;
         }
      }
      catch (FileNotFoundException exception)
      {
         LOGGER.error("", exception);
      }
      catch (IOException exception)
      {
         LOGGER.error("", exception);
      }
      finally
      {
         IOUtils.closeQuietly(in);
      }
 
      return line;
   }
2
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,757
23.03.2015, 13:30
На файле в 150Мбайт оба варианта мучаются около секунды, т.к. перебирают весь файл.

На базе RandomAccessFile последняя строка из того же файла получается за пару миллисекунд.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
    private static String ReadLastLine(File file) throws FileNotFoundException, IOException {
        String result;
        try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
            result = null;
            long startIdx = file.length();
            while (result == null || result.length() == 0) {
                raf.seek(startIdx--);
                raf.readLine();
                result = raf.readLine();
            }
        }
        return result;
    }
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 24
23.03.2015, 13:38  [ТС]
Цитата Сообщение от kotelok Посмотреть сообщение
Java
1
2
3
4
5
6
7
8
9
10
11
private static String ReadLastLine(File file) throws FileNotFoundException, IOException {
          RandomAccessFile raf = new RandomAccessFile(file, "r");
          String result = null;
          long startIdx = file.length();
          while (result == null || result.length() == 0) {
          raf.seek(startIdx--);
          raf.readLine();
          result = raf.readLine();
 }
          return result;
 }
Можно прокоментить код?
0
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,757
23.03.2015, 13:45
Если честно, то я про RandomAccessFile сам узнал только что, попытавшись решить эту задачу.
http://docs.oracle.com/javase/... sFile.html

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

По коду - встаём в самый конец файла и пытаемся считать две строки. Если вторая считалась успешно (не null и не пустая), то значит она и есть последняя строка файла. Если не считалась, то повторяем попытку с позиции на единицу меньше, чем конец файла. И так пока не достигнем успеха.

P.S.: но там кривовато получилось. Если в файле всего одна строка или вообще строк нет, то будет беда. Сейчас доработаю.
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 24
23.03.2015, 13:58  [ТС]
Ругается на String ReadLastLine(File file), The method ReadLastLine(File) from the type test is never used locally.
0
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,757
23.03.2015, 14:04
Вторая попытка. Если в файле больше одной строки, то вернёт первую не пустую с конца. Если в файле всего одна строка, то вернёт её. Если файл пустой, то вернёт null.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    private static String ReadLastLine(File file) throws FileNotFoundException, IOException {
        String result = null;
        try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
            long startIdx = file.length();
            while (startIdx >= 0 && (result == null || result.length() == 0)) {
                raf.seek(startIdx);
                if (startIdx > 0) 
                    raf.readLine();
                result = raf.readLine();
                startIdx--;
            }
        }
        return result;
    }
Цитата Сообщение от Alex@Rider Посмотреть сообщение
Ругается на String ReadLastLine(File file), The method ReadLastLine(File) from the type test is never used locally.
Так вызовите этот метод откуда-нибудь, из 'main', например.
Java
1
2
3
4
5
6
    public static void main(String[] args) throws FileNotFoundException, IOException {
        File file = new File("C:\\Temp\\test.txt");
        String lastLine = ReadLastLine(file);
        if (lastLine != null)
            System.out.println("last line is: " + lastLine);
    }
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 24
23.03.2015, 14:14  [ТС]
Последнюю строчку, достали, осталось значение например 7348537A889PB7, оно всегда будет состоять из 14 символов.
0
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,757
23.03.2015, 14:16
Если значение отделено пробелом (не табуляцией), то так.
Java
1
2
3
4
5
6
7
8
9
    public static void main(String[] args) throws FileNotFoundException, IOException {
        File file = new File("C:\\Temp\\java\\test.txt");
        String result = ReadLastLine(file);
        if (result != null) {
            System.out.println("last line: " + result);
            System.out.println("value: " + result.substring(result.lastIndexOf(' ') + 1));
        } else
            System.out.println("file is empty");
    }
Если же по размеру последнего блока определять (а не по последнему пробелу), то надо заменить строку с 'substring' на следующую.
Java
1
System.out.println("value: " + result.substring(result.length() - 14));
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 24
23.03.2015, 14:20  [ТС]
10:37:26 7348537A889PB7 так выводит

Добавлено через 2 минуты
Java
1
2
3
4
5
6
7
8
9
public static void main(String[] args) throws FileNotFoundException, IOException {
        File file = new File("C:/temp/PersonalNum_7002.txt");
        String result = ReadLastLine(file);
        if (result != null) {
            System.out.println("last line: " + result);
            System.out.println("value: " + result.substring(result.lastIndexOf(' ') + 10));
        } else
            System.out.println("file is empty");
    }
Добавлено через 10 секунд
Допер
0
 Аватар для Sanan07
284 / 264 / 173
Регистрация: 27.07.2014
Сообщений: 584
23.03.2015, 14:26
Java
1
System.out.println(result.split("\\s+")[1]);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2015, 14:26
Помогаю со студенческими работами здесь

Функция: сравнение первой строки первого текстового файла и последней строки второго файла
Даны два текстовый файла, состоящие из некоторого количества строк. Написать функцию для сравнения первой строки первого файла и...

Определить, совпадают ли первое слово в первой строке файла с первым словом последней строки файла.
1)Определить, совпадают ли первое слово в первой строке файла с первым словом последней строки файла. 2)Ввести данные о 5-ти...

Определить, совпадают ли первое слово в первой строке файла с первым словом последней строки файла
Определить, совпадают ли первое слово в первой строке файла с первым словом последней строки файла.

Определить, совпадают ли первое слово в первой строке файла с первым словом последней строки файла
Доброго времени суток! Нужна помощь с решением задачи по теме "Файлы". Буду очень признателен за помощь! Определить, совпадают ли...

Удаление последней строки из файла
Добрый день, форумчане. Назрел такой вопрос у меня: как удалить последнюю строчку в файле и переместить указатель на предыдущую? Заранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru