使用Java模拟触摸命令
我想更改二进制文件的修改时间戳。 这样做的最好方法是什么?
打开和closures文件是一个不错的select? (我需要在每个平台和JVM上修改时间戳的解决scheme)。
File类有一个setLastModified方法。 这就是ANT所做的。
我的2美分,基于@ Joe.M的答案
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); }
我知道Apache Ant有一个任务就是这么做的。
看看Touch的源代码 (可以告诉你他们是怎么做的)
他们使用FILE_UTILS.setFileLastModified(file, modTime);
,它使用ResourceUtils.setLastModified(new FileResource(file), time);
,它使用org.apache.tools.ant.types.resources.Touchable
,由org.apache.tools.ant.types.resources.FileResource
实现…
基本上,这是对File.setLastModified(modTime)
的调用。
这是一个简单的片段:
void touch(File file, long timestamp) { try { if (!file.exists()) new FileOutputStream(file).close(); file.setLastModified(timestamp); } catch (IOException e) { } }
这个问题只提到更新时间戳,但我想我会把它放在这里。 我正在寻找像在Unix中的触摸,如果它不存在,也将创build一个文件。
对于使用Apache Commons的人来说, FileUtils.touch(File file)
就是这样做的。
这是来自(内联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); } }
如果您已经使用番石榴 :
com.google.common.io.Files.touch(file)
由于File
是一个糟糕的抽象 ,最好使用Files
和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); } }