我正试图从我的.jar中的资源加载一些GZIP-ed数据,但我得到java.io.IOException: Not in GZIP
格式消息。
当我从一个文件加载相同的数据时,我没有得到任何错误。为什么?(这是我用NetBeans编译的maven项目)
下面是生成问题的测试代码:
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 );
}
编辑
两个'文件'具有相同的内容。
编辑2
我只是试着用下面的代码计算两种方法得到的字节数:
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);
}
得到:
Total file: 9132744
Total resource: 16399085
很奇怪!!
编辑3
我刚刚注意到.jar中的资源大小是16399085(未压缩)而不是9132744。似乎是在编译过程中出现了问题。
可能是我在我的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>
我的问题在于资源的过滤。这里有一个解决方案。
我编译了你的代码,无法重现你的情况。下面是我的代码片段。
尝试断言通过getresourcesstream获得正确的数据-例如,将其转储到一个文件中,而不使用un-gzip并使用file方法重新加载它。可能你有/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);
}
}
我很确定InputStream ins = CompareTest2.class.getResourceAsStream("/net/cv/convert1900.data");
行返回null。检查这个。如果是这样,请检查您的通过/net/cv/convert1900.data
,检查您的jar,在从maven运行时验证类路径:可能资源不在那里。
顺便说一句,这是可能的!maven中的所有资源必须在资源目录下。它适合你的项目吗?例如,如果资源文件在main/java目录下,它们将不会被复制到目标目录。