Java リソースの最終変更時刻を取得する信頼できる方法を教えてください。リソースは、ファイルまたは JAR 内のエントリにすることができます。
5 に答える
「リソース」とは、Class#getResource または ClassLoader#getResource を介して到達可能なものを意味する場合、URLConnection を介して最終変更タイム スタンプを取得できます。
URL url = Test.class.getResource("/org/jdom/Attribute.class");
System.out.println(new Date(url.openConnection().getLastModified()));
getLastModified() は、最終更新日が不明な場合は 0 を返すことに注意してください。これは、残念ながら、「1970 年 1 月 1 日 0:00 UTC」を読み取る実際のタイムスタンプと区別することができません。
問題url.openConnection().getLastModified()
はgetLastModified()
、FileURLConnection でそのファイルへの InputStream が作成されることです。urlConnection.getInputStream().close()
そのため、最終更新日を取得した後に電話する必要があります。対照的に、JarURLConnection は、getInputStream() を呼び出すときに入力ストリームを作成します。
Apache Commons VFSは、さまざまなソースからのファイルを操作する一般的な方法を提供します。 FileObject.getContent()は、最終変更時刻を取得するメソッドを持つ FileContent オブジェクトを返します。
VFS Web サイトの変更例を次に示します。
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.FileObject;
...
FileSystemManager fsManager = VFS.getManager();
FileObject jarFile = fsManager.resolveFile( "jar:lib/aJarFile.jar" );
System.out.println( jarFile.getName().getBaseName() + " " + jarFile.getContent().getLastModifiedTime() );
// List the children of the Jar file
FileObject[] children = jarFile.getChildren();
System.out.println( "Children of " + jarFile.getName().getURI() );
for ( int i = 0; i < children.length; i++ )
{
System.out.println( children[ i ].getName().getBaseName() + " " + children[ i ].getContent().getLastModifiedTime());
}
現在、次のソリューションを使用しています。解決策は、最初のステップ、つまりいくつかの getResource() と openConnection() の他のほとんどの解決策と同じです。
しかし、接続があるときは、次のコードを使用しています。
/**
* <p>Retrieve the last modified date of the connection.</p>
*
* @param con The connection.
* @return The last modified date.
* @throws IOException Shit happens.
*/
private static long getLastModified(URLConnection con) throws IOException {
if (con instanceof JarURLConnection) {
return ((JarURLConnection)con).getJarEntry().getTime();
} else {
return con.getLastModified();
}
}
上記のコードは、android と非 android で機能します。リソースがアーカイブ内にある場合は、ZIP 内のエントリの最終更新日を返します。そうでない場合は、接続から取得したものを返します。
さよなら
PS: コードにはまだブラッシングが必要です。getJarEntry() が null である境界ケースがいくつかあります。