我正在从jar文件运行java应用程序。 如何获得该文件的大小?
另外,如何在不实际下载的情况下从互联网上获取文件的大小?
最后,如果文件尺寸不同,我只会下载文件,即创建自动更新。
此外,在没有jar文件的IDE中如何工作?
编辑:由于其他原因,我还是需要阅读远程文件的大小,所以即使不是最好的方式也很高兴知道。
答案 0 :(得分:3)
打开连接后你可以read out the content length(对不起,代码在Scala中,但你应该明白这一点):
scala> import java.net._
import java.net._
scala> val url = new URL("http://repo1.maven.org/maven2/com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.jar")
url: java.net.URL = http://repo1.maven.org/maven2/com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.jar
scala> val httpConnection = url.openConnection()
httpConnection: java.net.URLConnection = sun.net.www.protocol.http.HttpURLConnection:http://repo1.maven.org/maven2/com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.jar
scala> httpConnection.getContentLengthLong
res0: Long = 2514991
答案 1 :(得分:1)
您的真正目标似乎是创建自动更新应用程序。每个Java SE安装都附带Java Web Start,它会自动处理此问题,包括检查应用程序.jar文件的日期并在必要时下载。
将应用程序转换为Java Web Start应用程序非常简单。您的代码根本不需要更改。托管.jar文件的Web服务器还应该托管一个扩展名为.jnlp
的简短XML文件。该文件告诉Java .jar文件的位置,应用程序的全名以及运行应用程序所需的Java的最低版本。它可以执行许多其他操作,包括将自身安装到用户的“开始”菜单(或Linux和OS X中的等效菜单)中。当用户选择运行您的应用程序时,所有这些都会自动处理,只需单击指向.jnlp文件的超链接即可。
Java Web Start教程是here。
基本的.jnlp文件可能如下所示:
<?xml version="1.0"?>
<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Descriptor 6.0.10//EN" "http://java.sun.com/dtd/JNLP-6.0.10.dtd">
<jnlp version="1.6"
codebase="http://www.example.com/myapp/"
href="MyApp.jnlp">
<information>
<title>MyApp</title>
<vendor>ExampleCo Inc.</vendor>
<homepage href="http://www.example.com/myapp/index.html"/>
<description>The greatest application ever.</description>
<icon kind="default" href="myapp48x48.gif"/>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.7+"/>
<jar href="MyApp.jar" main="true"/>
</resources>
<application-desc/>
</jnlp>
要解决您的原始问题:Java Web Start似乎决定是否根据文件的服务器时间戳更新文件,就像Web浏览器一样,所以如果我打算手动执行(我不会这样做,因为Java Web Start做得更好),我使用HTTP HEAD请求来读取头文件而不下载文件:
boolean isDownloadNeeded(URL url,
Path cachedFile)
throws IOException {
if (Files.notExists(cachedFile)) {
return true;
}
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
long serverTimestamp = conn.getLastModified();
long fileTimestamp = Files.getLastModifiedTime(cachedFile).toMillis();
return (serverTimestamp == 0 || fileTimestamp < serverTimestamp);
}
答案 2 :(得分:1)
我正在从jar文件运行java应用程序。如何获得该文件的大小?
我认为你不能......可靠 1 。你最接近的是:
按照此处所述查找并解析程序的类路径:https://stackoverflow.com/a/17541055/139985
标识作为JAR文件的类路径组件。
在该文件上使用File.length()
。
问题是您可能无法从列表中识别JAR文件,并且该文件可能不再存在...取决于您启动JVM的方式。此外,如果您动态运行应用程序,该技术不起作用;即使用启动器在同一JVM中的Java代码中即时创建的类加载器。
另外,如何在不实际下载的情况下从互联网上获取文件的大小?
再一次, 1 没有完全可靠的方法来做到这一点。您可以尝试提取&#34;内容长度&#34;来自HTTP响应的标头...在您开始阅读响应内容之前。问题是&#34;内容长度&#34;是可选的,有些情况下HTTP服务器不会(甚至不能)提供它。
如果您知道服务器可以为您提供内容长度,那么发送HEAD请求而不是GET请求将为您提供 响应标头。
此外,在没有jar文件的IDE中如何工作?
我认为这不实用。
最后,如果文件尺寸不同,我只会下载文件,即创建自动更新。
正如其他人所说,Java Web Start是可行的方法。不要试图推出自己的计划。首先,Java Web Start处理一大堆重要的安全相关问题,这些问题对您来说很难......正确。
1 - 我的意思是Java应用程序必须对其他事情做出假设。例如,关于应用程序启动器和提供JAR文件的服务器的假设。