2009-09-10 14 views
42

Chcę zmienić sygnaturę modyfikacji pliku binarnego. Jaki jest najlepszy sposób na zrobienie tego?Symuluj polecenie dotykowe za pomocą Javy

Czy otwieranie i zamykanie pliku byłoby dobrym rozwiązaniem? (Potrzebuję rozwiązania, w którym modyfikacja znacznika czasu zostanie zmieniona na każdej platformie i JVM).

+0

Ktoś powinien złożyć ten wniosek jako akcesorium do unix4j: https://github.com/tools4j/unix4j –

+0

I nie rozumieją zależność między tytułem a pytaniem tutaj? – Lealo

Odpowiedz

41

Klasa File ma metodę setLastModified. Tak właśnie działa ANT.

+2

Poza tym, że znany jest błąd Androida, a File.setLastModified nie robi nic na większości urządzeń z Androidem. –

+2

I oprócz powłoki 'touch' tworzy plik, a to nie robi. –

8

Wiem, że Apache Ant ma Task, który właśnie to robi.
Zobacz source code of Touch (które można pokazać, jak oni to robią)

Używają FILE_UTILS.setFileLastModified(file, modTime);, która wykorzystuje ResourceUtils.setLastModified(new FileResource(file), time);, który wykorzystuje org.apache.tools.ant.types.resources.Touchable realizowany przez org.apache.tools.ant.types.resources.FileResource ...

Zasadniczo, jest to wezwanie do File.setLastModified(modTime) .

8

Oto prosty fragment:

void touch(File file, long timestamp) 
{ 
    try 
    { 
     if (!file.exists()) 
      new FileOutputStream(file).close(); 
     file.setLastModified(timestamp); 
    } 
    catch (IOException e) 
    { 
    } 
} 
+5

Dlaczego nie 'file.createNewFile()' zamiast 'new FileOutputStream (file) .close()'? – Harvey

5

Pytanie tylko wspomina aktualizację datownika, ale myślałem, że to umieścić tu tak czy inaczej. Szukałem dotyku jak w systemie Unix, który również utworzy plik, jeśli nie istnieje.

Dla każdego, kto używa Apache Commons, jest to właśnie FileUtils.touch(File file).

Oto source z (inlined openInputStream(File f)):

public static void touch(final File file) throws IOException { 
    if (file.exists()) { 
     if (file.isDirectory()) { 
      throw new IOException("File '" + file + "' exists but is a directory"); 
     } 
     if (file.canWrite() == false) { 
      throw new IOException("File '" + file + "' cannot be written to"); 
     } 
    } else { 
     final File parent = file.getParentFile(); 
     if (parent != null) { 
      if (!parent.mkdirs() && !parent.isDirectory()) { 
       throw new IOException("Directory '" + parent + "' could not be created"); 
      } 
     } 
     final OutputStream out = new FileOutputStream(file); 
     IOUtils.closeQuietly(out); 
    } 
    final boolean success = file.setLastModified(System.currentTimeMillis()); 
    if (!success) { 
     throw new IOException("Unable to set the last modification time for " + file); 
    } 
} 
17

Moje 2 centów, oparte na @Joe.M answer

public static void touch(File file) throws IOException{ 
    long timestamp = System.currentTimeMillis(); 
    touch(file, timestamp); 
} 

public static void touch(File file, long timestamp) throws IOException{ 
    if (!file.exists()) { 
     new FileOutputStream(file).close(); 
    } 

    file.setLastModified(timestamp); 
} 
4

Jeśli już używasz Guava:

com.google.common.io.Files.touch(file)

1

Od File jest a bad abstraction, lepiej jest użyć Files i Path:

public static void touch(final Path path) throws IOException { 
    Objects.requireNotNull(path, "path is null"); 
    if (Files.exists(path)) { 
     Files.setLastModifiedTime(path, FileTime.from(Instant.now())); 
    } else { 
     Files.createFile(path); 
    } 
} 
Powiązane problemy