如何获取Java资源的上次修改时间?

时间:2010-01-13 14:36:24

标签: java resources last-modified

有人可以告诉我一个可靠的方法来获取Java资源的最后修改时间吗?资源可以是文件或JAR中的条目。

5 个答案:

答案 0 :(得分:16)

如果您使用“资源”表示可以通过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”的实时时间戳。

答案 1 :(得分:5)

Apache Commons VFS提供了与文件from different sources进行交互的通用方式。 FileObject.getContent()返回一个FileContent对象,该对象具有retreiving the last modified time的方法。

以下是VFS website

的修改示例
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());
}

答案 2 :(得分:5)

url.openConnection().getLastModified()的问题是FileURLConnection上的getLastModified()会为该文件创建一个InputStream。因此,您必须在获得最后修改日期后致电urlConnection.getInputStream().close()。相反,JarURLConnection在调用getInputStream()时创建输入流。

答案 3 :(得分: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,则在ZIP中的条目的最后修改日期 在存档中找到,否则它返回它从中获取的内容 连接。

再见

P.S。:代码仍然需要刷一些,有一些边框 getJarEntry()为null的情况。

答案 4 :(得分:1)

以下是获取JAR文件或已编译类的最后修改时间的代码(使用IDE时)。

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.attribute.FileTime;
import java.text.DateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Locale;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;

public class ProgramBuildTime
{
    private static String getJarName()
    {
        Class<?> currentClass = getCurrentClass();
        return new File(currentClass.getProtectionDomain()
                .getCodeSource()
                .getLocation()
                .getPath())
                .getName();
    }

    private static Class<?> getCurrentClass()
    {
        return new Object() {}.getClass().getEnclosingClass();
    }

    private static boolean runningFromJAR()
    {
        String jarName = getJarName();
        return jarName.endsWith(".jar");
    }

    public static String getLastModifiedDate() throws IOException, URISyntaxException
    {
        Date date;

        if (runningFromJAR())
        {
            String jarFilePath = getJarName();
            try (JarFile jarFile = new JarFile(jarFilePath))
            {
                long lastModifiedDate = 0;

                for (Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); )
                {
                    String element = entries.nextElement().toString();
                    ZipEntry entry = jarFile.getEntry(element);
                    FileTime fileTime = entry.getLastModifiedTime();
                    long time = fileTime.toMillis();

                    if (time > lastModifiedDate)
                    {
                        lastModifiedDate = time;
                    }
                }

                date = new Date(lastModifiedDate);
            }
        } else
        {
            Class<?> currentClass = getCurrentClass();
            URL resource = currentClass.getResource(currentClass.getSimpleName() + ".class");

            switch (resource.getProtocol())
            {
                case "file":
                    date = new Date(new File(resource.toURI()).lastModified());
                    break;

                default:
                    throw new IllegalStateException("No matching protocol found!");
            }
        }

        DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
        return dateFormat.format(date);
    }
}