15

Java リソースの最終変更時刻を取得する信頼できる方法を教えてください。リソースは、ファイルまたは JAR 内のエントリにすることができます。

4

5 に答える 5

20

「リソース」とは、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」を読み取る実際のタイムスタンプと区別することができません。

于 2010-01-13T14:44:32.563 に答える
6

問題url.openConnection().getLastModified()getLastModified()、FileURLConnection でそのファイルへの InputStream が作成されることです。urlConnection.getInputStream().close()そのため、最終更新日を取得した後に電話する必要があります。対照的に、JarURLConnection は、getInputStream() を呼び出すときに入力ストリームを作成します。

于 2010-06-10T13:36:03.000 に答える
5

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());
}
于 2010-01-13T14:49:32.103 に答える
2

現在、次のソリューションを使用しています。解決策は、最初のステップ、つまりいくつかの 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 である境界ケースがいくつかあります。

于 2014-10-26T18:36:07.083 に答える