¿Puede alguien decirme una forma confiable de obtener la última modificación de un recurso de Java? El recurso puede ser un archivo o una entrada en un JAR.¿Cómo obtengo la última modificación de un recurso de Java?
Respuesta
Si con "recurso" decir algo alcanzable a través de la clase nº getResource o cargador de clases # getResource, se puede obtener la última marca de tiempo modificado a través de la URLConnection:
URL url = Test.class.getResource("/org/jdom/Attribute.class");
System.out.println(new Date(url.openConnection().getLastModified()));
Sé consciente de que getlastmodified() devuelve 0 si se desconoce la última modificación, que desafortunadamente es imposible de distinguir de una lectura de marca de tiempo real "1 de enero de 1970, 0:00 UTC".
Consulte la respuesta de cornz para ver un error en el código anterior. –
Funciona en Swing, pero no en Android. En Android siempre obtengo 0, aunque el archivo jar accesible tiene una fecha de modificación distinta de cero. –
@ j4nbur53: ¿El archivo JAR contra el que está compilando? Ese no está disponible en tiempo de ejecución. No tengo idea de si la marca de tiempo se conserva en el archivo APK de Android. Incluso si el lenguaje es similar, el tiempo de ejecución de Android es muy diferente del tiempo de ejecución de Java. – jarnbjo
Apache Commons VFS proporciona un genérico forma de interactuar con los archivos from different sources. FileObject.getContent() devuelve un objeto FileContent que tiene un método para retreiving the last modified time.
Aquí es un ejemplo modificado de la 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());
}
El problema es que url.openConnection().getLastModified()
getLastModified()
en un FileURLConnection crea un InputStream a ese archivo. Entonces debe llamar al urlConnection.getInputStream().close()
después de obtener la fecha de la última modificación. Por el contrario, JarURLConnection crea la secuencia de entrada al llamar a getInputStream().
Actualmente estoy usando la siguiente solución. La solución es la igual que la mayoría de las otras soluciones en sus pasos iniciales, es decir, algunos getResource() y luego openConnection().
Pero cuando tengo la conexión que estoy usando el siguiente código:
/**
* <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();
}
}
El código anterior funciona en Android y no androide, que devuelve el última fecha de modificación de la entrada dentro de la postal si el recursos es encontrado dentro de un archivo, de lo contrario devuelve lo que obtiene de la conexión.
adiós
P.S .: El código todavía necesita un poco de cepillado, hay algunos casos en los que la frontera getJarEntry() es nulo.
Aquí está mi código para obtener la última modificación de tiempo de su archivo JAR
o clase compilada (cuando se usa un 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);
}
}
- 1. Última modificación de un directorio en OSX
- 2. ¿Cómo obtengo la última hora de modificación de un archivo en Perl?
- 3. Última modificación de carpetas
- 4. Directorio última fecha de modificación
- 5. Obtener la última fecha de modificación de un archivo remoto
- 6. Obtener la fecha de la última modificación de una URL
- 7. Conseguir un archivo de fecha de última modificación
- 8. ¿Cómo obtengo la fecha de modificación del archivo en C#?
- 9. play-marco conseguir la fecha de última modificación de archivo
- 10. ¿Cómo obtengo los directorios de salida de la última compilación?
- 11. Cache Expire de control con la última modificación
- 12. git: ¿Cómo obtengo la última versión de mi código?
- 13. Django: modelos última fecha de modificación y número de mod
- 14. ¿Cómo obtener la última fecha de modificación del archivo en la línea de comandos de Windows?
- 15. ¿Cómo recursivo los archivos de la lista con el tamaño y la última hora de modificación?
- 16. Cómo mostrar la hora de la última modificación de archivos en linux
- 17. Obtener la última fecha de modificación de un archivo en VB6
- 18. Buscar la fecha de última modificación de un archivo en Cocoa
- 19. ¿Cómo ordenar la salida de "grep -l" cronológicamente por la última fecha de modificación?
- 20. Cómo obtener el directorio más reciente (última modificación) [C#]
- 21. ¿Cómo puedo obtener la fecha de la última modificación del conjunto?
- 22. ¿Cómo obtengo la semilla de un Random en Java?
- 23. ¿Es posible recuperar la última fecha de modificación de un archivo utilizando Javascript?
- 24. Obtener la última fecha de modificación de un archivo en C
- 25. Obtener archivo Última modificación de tiempo y comparar
- 26. ¿Cómo obtener las fechas de creación/última modificación de un archivo en Delphi?
- 27. ¿Recibe los archivos en un directorio ordenado por la última modificación?
- 28. ¿Recibe la última fecha de modificación del archivo de los archivos de datos de la aplicación?
- 29. ¿Cómo puedo obtener la fecha de última modificación de los objetos S3 con boto?
- 30. ¿Cómo obtengo la ruta absoluta de un recurso en Rails 3?
Ni siquiera sabía que los JAR podrían tener marcas de tiempo en ellos, pero dado que es como un ZIP, no estoy del todo sorprendido. Interesante. –
@Amigable Clark Kant: solo una nota, pero el formato JAR recibirá una actualización con Java 7, por lo que las suposiciones de que se trata de un archivo ZIP pueden no ser válidas. – McDowell
Aún se conservan en Java 8 :) –