バイナリファイルの変更タイムスタンプを変更したい。これを行うための最良の方法は何ですか?Javaでtouchコマンドをシミュレートする
ファイルの開閉は良い選択でしょうか? (タイムスタンプの変更がすべてのプラットフォームとJVMで変更されるソリューションが必要です)。
バイナリファイルの変更タイムスタンプを変更したい。これを行うための最良の方法は何ですか?Javaでtouchコマンドをシミュレートする
ファイルの開閉は良い選択でしょうか? (タイムスタンプの変更がすべてのプラットフォームとJVMで変更されるソリューションが必要です)。
FileクラスにはsetLastModifiedメソッドがあります。それがANTの行いです。
既知のAndroidのバグがあることを除いて、File.setLastModifiedはほとんどのAndroidデバイスで何もしません。 –
そして、シェル 'touch'がファイルを作成することを除いて、これはしません。 –
私はApache AntがTaskを持っていることを知っています。
基本的に、それはFile.setLastModified(modTime)
の呼び出しです... org.apache.tools.ant.types.resources.FileResource
によって実装org.apache.tools.ant.types.resources.Touchable
を、使用している、彼らはResourceUtils.setLastModified(new FileResource(file), time);
を使用FILE_UTILS.setFileLastModified(file, modTime);
を、使用(彼らはそれを行う方法をお見せすることができます)source code of Touchが
を参照してください。 。
ここでは簡単な抜粋です:
void touch(File file, long timestamp)
{
try
{
if (!file.exists())
new FileOutputStream(file).close();
file.setLastModified(timestamp);
}
catch (IOException e)
{
}
}
なぜ、 'new FileOutputStream(file).close()'の代わりに 'file.createNewFile()'を使うのですか? – Harvey
は、この質問はタイムスタンプを更新言及が、私はとにかくここでこれを置くだろうと思っていました。私はUnixのようなタッチを探していましたが、存在しなければファイルを作成します。
Apache Commonsを使用している場合は、FileUtils.touch(File file)
があります。ここで
は(openInputStream(File f)
をインライン化)からsourceです:
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);
}
}
すでにGuavaを使用している場合@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);
}
に基づいて私の2セント、:
com.google.common.io.Files.touch(file)
File
がa bad abstractionあるので、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);
}
}
誰かがunix4jする拡張要求としてこれを提出する必要があります。https://github.com/tools4j/unix4j –
私は関係を理解していませんタイトルとここの質問の間に? – Lealo