简体   繁体   English

java.io.IOException:不是带有 class.getResourceAsStream() 的 GZIP 格式

[英]java.io.IOException: Not in GZIP format with class.getResourceAsStream()

I am trying to load some GZIP-ed data from a resource in my.jar, but I get a java.io.IOException: Not in GZIP format message.我正在尝试从 my.jar 中的资源加载一些 GZIP 数据,但我收到java.io.IOException: Not in GZIP格式消息。

When I load the same data from a file, I don't get any error.当我从文件加载相同的数据时,我没有收到任何错误。 Why?为什么? (It is a maven project I compile with NetBeans) (是我用NetBeans编译的maven项目)

Here is the test code generating the issue:这是生成问题的测试代码:

public static void main(String[] args) throws IOException {

    byte[] dummy = new byte[10];

    // Reading data from file
    File f = new File("C:\\Temp\\422\\convert1900.data");
    DataInputStream is = new DataInputStream(
            new GZIPInputStream(new FileInputStream(f)));

    while ( is.read(dummy) != -1 );

    // Reading data from resource
    InputStream ins = CompareTest2.class.getResourceAsStream(
            "/net/cv/convert1900.data");

    is = new DataInputStream(
        new GZIPInputStream(ins)); // Issue happens here

    while ( is.read(dummy) != -1 );

}

EDIT编辑

Both 'files' have the same content.两个“文件”具有相同的内容。

EDIT 2编辑 2

I just tried to count the number of bytes I get with both methods using the following code:我只是尝试使用以下代码计算两种方法获得的字节数:

public static void main(String[] args) throws IOException {

    int total = 0;
    int retr = 0;

    byte[] dummy = new byte[10];

    // Reading data from file
    File f = new File("C:\\Temp\\422\\convert1900.data");
    InputStream is = new FileInputStream(f);

    do {
        retr = is.read(dummy);
        if ( retr != -1 )
            total += retr;
    } while ( retr != -1 );

    System.out.println("Total file: " + total);

    // Reading data from resource
    InputStream ins = CompareTest2.class.getResourceAsStream(
            "/net/cv/convert1900.data");

    total = 0;
    retr = 0;

    do {
        retr = ins.read(dummy);
        if ( retr != -1 )
            total += retr;
    } while ( retr != -1 );

    System.out.println("Total resource: " + total);

}

and I get:我得到:

Total file: 9132744
Total resource: 16399085

Very strange !!很奇怪 !!

EDIT 3编辑 3

I have just noticed the size of the resource in the.jar is 16399085 (uncompressed) instead of 9132744. It seems that the issue is in the compilation process.刚刚注意到.jar中的资源大小是16399085(未压缩)而不是9132744。看来问题出在编译过程中。

May be I have an issue with the following in my pom.xml:可能是我的 pom.xml 中有以下问题:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <encoding>${project.build.sourceEncoding}</encoding> // UTF8
            </configuration>
        </plugin>

My issue lied in the filtering of my resources.我的问题在于过滤我的资源。 A solution is available here . 此处提供了一个解决方案。

I compiled your code and can't reproduce your situation.我编译了您的代码,无法重现您的情况。 My code snippet follows.我的代码片段如下。

Try to assert that you get proper data thru getResourceAsStream - for example dump it to a file without un-gzip and reload it using the File approach.尝试断言您通过 getResourceAsStream 获得了正确的数据 - 例如,将其转储到没有 un-gzip 的文件并使用 File 方法重新加载它。 Might be you have the /net/cv/convert... visible twice in your classpath and the runtime gets the wrong one?可能你的 /net/cv/convert... 在你的类路径中可见两次并且运行时得到了错误的?

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)

javac A.java 
java -cp mega.jar:. A

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.IllegalStateException;
import java.util.zip.GZIPInputStream;

public class A {
public static void main(String[] args) throws IOException {
    final byte[] dummy = new byte[10];

    // Reading data from file
    final File f = new File("/tmp/mine.data");
    DataInputStream is = new DataInputStream(new GZIPInputStream(new FileInputStream(f)));

    int count = 0;
    while (is.read(dummy) != -1) count++;
    System.out.println("count = " + count);

    // Reading data from resource
    InputStream ins = A.class.getResourceAsStream("/do/do/mine.data");
    if (ins == null)
        throw new IllegalStateException("Failed to locate data.");

    is = new DataInputStream(new GZIPInputStream(ins)); // Issue happens here
    count = 0;
    while (is.read(dummy) != -1) count++;

    System.out.println("count = " + count);
}
}

I am pretty sure that line InputStream ins = CompareTest2.class.getResourceAsStream("/net/cv/convert1900.data");我很确定InputStream ins = CompareTest2.class.getResourceAsStream("/net/cv/convert1900.data"); returns null.返回 null。 Check this.检查这个。 If so check your pass /net/cv/convert1900.data , check your jar, verify the classpath when running from maven: probably the resource is not there.如果是这样,请检查您的通行证/net/cv/convert1900.data ,检查您的 jar,从 maven 运行时验证类路径:可能资源不存在。

BTW it is possible.顺便说一句,这是可能的。 All resources in maven must be under directory resources? maven中的所有资源都必须在目录资源下吗? Is it correct for your project.它是否适合您的项目。 If for example resource files are under main/java they will not be copied to target directory.例如,如果资源文件位于 main/java 下,它们将不会被复制到目标目录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM