2016-05-11 4 views
5

В моем приложении я прочитал файл, используя следующий метод,Укажите время последнего доступа и последнее изменение времени в java?

public void readFIleData(String path) { 
    BufferedReader br = null; 
    try { 
     String sCurrentLine; 
     br = new BufferedReader(new FileReader(path)); 
     while ((sCurrentLine = br.readLine()) != null) { 
      System.out.println("Data : "+sCurrentLine); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (br != null)br.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Также я в последний раз доступа и время последнего изменения файла, используя следующий метод,

public void getFIleInfo(String path) { 
    Path file = Paths.get(path); 
    try { 
     BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class); 
     FileTime accessTime = attrs.lastAccessTime(); 
     System.out.println("accessTime : "+accessTime.toMillis()); 
     FileTime modifiedTime = attrs.lastModifiedTime(); 
     System.out.println("modifiedTime : "+modifiedTime.toMillis()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Я побежал выше методы в следующем порядке ,

1-> getFIleInfo() 
2-> readFIleData() 
3-> getFIleInfo() 

я получил следующее в качестве выходного сигнала,

accessTime : 1462943491685 
modifiedTime : 1462943925846 
Data : erteuyuittdgfdfghjkhw5643rtrr66664fdghf 
accessTime : 1462943491685 
modifiedTime : 1462943925846 

Вот выходной раз в формате строки,

accessTime : 2016-05-11T05:11:31.685881Z 
modifiedTime : 2016-05-11T07:39:28.237884Z 
Data : erteuyuittdgfdfghjkhw5643rtrr66LE229F1HBQ664fdghf 
accessTime : 2016-05-11T05:11:31.685881Z 
modifiedTime : 2016-05-11T07:39:28.237884Z 

У меня есть сомнения по поводу этой продукции, поскольку время доступа остается такой же, как перед чтением данных из файла. Может кто-нибудь, пожалуйста, объясните мне, что на самом деле означает последнее время доступа и последнее измененное время в java?

+0

[Это может быть причиной] (http://superuser.com/questions/251263/the-last-access-date-is-not-changed-even-after-reading-the-file-on-windows -7). С другой стороны, на какой ОС вы работаете? Возможно, это не ошибка Javas, но вместо этого ОС не обновляет ее правильно – Draken

+0

Win8.1 64bit здесь, и я могу реплицировать то же самое. Интересно. –

+4

Java ничего не делает сам по себе: он просто запрашивает значения базовой файловой системы. Просто убедитесь, что просто создайте текстовый файл, посмотрите * с помощью инструментов os или файловой системы * во время доступа ('ls -atime' на Unix-like или explorer в Windows), подождите одну или две минуты, отобразите файл и еще раз посмотреть время доступа. Если ничего не изменилось, основная файловая система виновата. –

ответ

2

Во-первых, давайте сосредоточимся на том, что означают эти вещи.

Доступ - последний раз, когда файл был прочитан, то есть в последний раз, когда к файлам поступали данные.

Изменить - в последний раз, когда файл был изменен (содержимое было изменено), то есть время последнего изменения данных файла.

Изменение - в последний раз метаданные файла были изменены (например, разрешения), то есть время последнего изменения статуса файла.

Редактировать. Время доступа IS изменение. Я предлагаю вам использовать Thread.sleep(100) или что-то еще, а затем посмотреть, не исчезла ли эта проблема. Если это так, то виновник должен быть ОС, которую вы используете, поскольку Java просто читает из файловой системы. Комментарии @Serge Ballesta должны дать представление о том, что Windows NTFS имеет возможность отключить запись любых изменений, внесенных в атрибуты файла, обратно на жесткий диск по соображениям производительности. На самом деле этого больше.

С [docs]

NTFS задерживает обновления до последнего времени доступа к файлу до одного часа после последнего доступа. NTFS также позволяет отключать последние обновления времени доступа. Время последнего доступа не обновляется по томам NTFS по умолчанию.

Ниже приведены некоторые данные о запуске скрипта на mac os x.

calling getFileInfo() at: 11.4.2016 3:13:08:738 
    accessTime : 11.4.2016 3:12:53:0 
    modifiedTime : 29.10.2015 1:49:14:0 
-------------------- 
sleeping for 100ms 
-------------------- 
calling readFIleData() at: 11.4.2016 3:13:08:873 
-------------------- 
sleeping for 100ms 
-------------------- 
re-calling getFileInfo() at: 11.4.2016 3:13:08:977 
    accessTime : 11.4.2016 3:13:08:0 <---- READING FILE CHANGES ACCESS TIME 
    modifiedTime : 29.10.2015 1:49:14:0 
-------------------- 
sleeping for 100ms 
-------------------- 
re-calling getFileInfo() at: 11.4.2016 3:13:09:81 
    accessTime : 11.4.2016 3:13:08:0 <---- READING FILE ATTRIBUTES DOES NOT CHANGE ACCESS TIME 
    modifiedTime : 29.10.2015 1:49:14:0 


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

long accessTimeSinceEpoch = Files.readAttributes(file, BasicFileAttributes.class).lastAccessTime().toMillis(); 

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(accessTimeSinceEpoch); 

int mYear = calendar.get(Calendar.YEAR); 
int mMonth = calendar.get(Calendar.MONTH); 
int mDay = calendar.get(Calendar.DAY_OF_MONTH); 

int mHour = calendar.get(Calendar.HOUR); 
int mMin = calendar.get(Calendar.MINUTE); 
int mSec = calendar.get(Calendar.SECOND); 
int mMilisec = calendar.get(Calendar.MILLISECOND); 
String st = mDay + "." + mMonth + "." + mYear + " " + mHour + ":" + mMin + ":" + mSec + ":" + mMilisec; 
+1

Это вообще не отвечает на вопрос. Он не просит конверсии миллисов. Он спрашивает, почему звонок для чтения не влияет на последнее время доступа. –

+0

@RichardEriksson Прошу прощения за отсутствие ясности. Я ожидал, что первая часть ответа ответит на эту часть вопроса. –

+0

@RichardEriksson Сделано в Редактировать –

0

Если вы посмотрите на api, у вас есть это.

Если реализация файловой системы не поддерживает временную метку , чтобы указать время последнего доступа, этот метод возвращает определенное значение по умолчанию в реализации, как правило, last-modified-time или FileTime , представляющие эпоху (1970-01 -01T00: 00: 00Z).

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

Например, для windows operating system, опция NtfsDisableLastAccessUpdate была включена по умолчанию в Vista, и Windows 7, но вы можете отключить его, используя следующую командную строку:

fsutil behavior set disablelastaccess 0 

Как я уже сказал в комментарии ваш вопрос я смог решить эту проблему в Windows на реальной машине, но не в виртуальной. Если вы все еще борются с этой проблемой, то эту команду перед ни к чему, чтобы увидеть, что происходит с реестром:

fsutil behavior query disablelastaccess 

На последней ноте, я не должен был перезагружать окна или IntelliJ (где я побежал мой тесты). Результаты были немедленными, и я мог видеть, что для значения 1 временная метка для последнего доступа не изменяется и для значения 0 это делает.