有人可以告诉我一个可靠的方法来获取Java资源的最后修改时间吗?资源可以是文件或JAR中的条目。
答案 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);
}
}