如何检查jar文件的大小?

时间:2014-06-14 21:48:15

标签: java launcher

我正在从jar文件运行java应用程序。 如何获得该文件的大小?

另外,如何在不实际下载的情况下从互联网上获取文件的大小?

最后,如果文件尺寸不同,我只会下载文件,即创建自动更新。

此外,在没有jar文件的IDE中如何工作?

编辑:由于其他原因,我还是需要阅读远程文件的大小,所以即使不是最好的方式也很高兴知道。

3 个答案:

答案 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 。你最接近的是:

  1. 按照此处所述查找并解析程序的类路径:https://stackoverflow.com/a/17541055/139985

  2. 标识作为JAR文件的类路径组件。

  3. 在该文件上使用File.length()

  4. 问题是您可能无法从列表中识别JAR文件,并且该文件可能不再存在...取决于您启动JVM的方式。此外,如果您动态运行应用程序,该技术不起作用;即使用启动器在同一JVM中的Java代码中即时创建的类加载器。

      

    另外,如何在不实际下载的情况下从互联网上获取文件的大小?

    再一次, 1 没有完全可靠的方法来做到这一点。您可以尝试提取&#34;内容长度&#34;来自HTTP响应的标头...在您开始阅读响应内容之前。问题是&#34;内容长度&#34;是可选的,有些情况下HTTP服务器不会(甚至不能)提供它。

    如果您知道服务器可以为您提供内容长度,那么发送HEAD请求而不是GET请求将为您提供 响应标头。

      

    此外,在没有jar文件的IDE中如何工作?

    我认为这不实用。

      

    最后,如果文件尺寸不同,我只会下载文件,即创建自动更新。

    正如其他人所说,Java Web Start是可行的方法。不要试图推出自己的计划。首先,Java Web Start处理一大堆重要的安全相关问题,这些问题对您来说很难......正确。


    1 - 我的意思是Java应用程序必须对其他事情做出假设。例如,关于应用程序启动器和提供JAR文件的服务器的假设。