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

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2015, 10:42
Ответы с готовыми решениями:

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

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

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

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

10
36 / 33 / 21
Регистрация: 11.07.2014
Сообщений: 390
23.03.2015, 10:45 2
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
1276 / 858 / 255
Регистрация: 08.08.2014
Сообщений: 2,454
23.03.2015, 13:30 3
На файле в 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  [ТС] 4
Цитата Сообщение от 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
1276 / 858 / 255
Регистрация: 08.08.2014
Сообщений: 2,454
23.03.2015, 13:45 5
Если честно, то я про RandomAccessFile сам узнал только что, попытавшись решить эту задачу.
http://docs.oracle.com/javase/... sFile.html

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

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

P.S.: но там кривовато получилось. Если в файле всего одна строка или вообще строк нет, то будет беда. Сейчас доработаю.
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 24
23.03.2015, 13:58  [ТС] 6
Ругается на String ReadLastLine(File file), The method ReadLastLine(File) from the type test is never used locally.
0
1276 / 858 / 255
Регистрация: 08.08.2014
Сообщений: 2,454
23.03.2015, 14:04 7
Вторая попытка. Если в файле больше одной строки, то вернёт первую не пустую с конца. Если в файле всего одна строка, то вернёт её. Если файл пустой, то вернёт 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  [ТС] 8
Последнюю строчку, достали, осталось значение например 7348537A889PB7, оно всегда будет состоять из 14 символов.
0
1276 / 858 / 255
Регистрация: 08.08.2014
Сообщений: 2,454
23.03.2015, 14:16 9
Если значение отделено пробелом (не табуляцией), то так.
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
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
284 / 264 / 173
Регистрация: 27.07.2014
Сообщений: 584
23.03.2015, 14:26 11
Java
1
System.out.println(result.split("\\s+")[1]);
1
23.03.2015, 14:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2015, 14:26
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru