java.io.IOException: не в формате GZIP с помощью class.getResourceAsStream () - PullRequest
3 голосов
/ 17 июля 2011

Я пытаюсь загрузить некоторые данные в формате GZIP из ресурса в моем .jar, но я получаю сообщение в формате java.io.IOException: Not in GZIP.

Когда я загружаю те же данные из файла, я нене получаю никакой ошибки.Зачем?(Это проект maven, который я компилирую с NetBeans)

Вот тестовый код, генерирующий проблему:

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

Оба 'файлы имеют одинаковое содержимое.

РЕДАКТИРОВАТЬ 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);

}

и Iget:

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>

Ответы [ 3 ]

5 голосов
/ 17 июля 2011

Моя проблема заключалась в фильтрации моих ресурсов.Решение доступно здесь .

2 голосов
/ 17 июля 2011

Я скомпилировал ваш код и не могу воспроизвести вашу ситуацию.Мой фрагмент кода следует.

Попытайтесь утверждать, что вы получаете правильные данные через getResourceAsStream - например, сбросьте их в файл без распаковки и перезагрузите его, используя подход 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);
}
}
1 голос
/ 17 июля 2011

Я почти уверен, что строка InputStream ins = CompareTest2.class.getResourceAsStream("/net/cv/convert1900.data"); возвращает ноль. Проверь это. Если это так, проверьте ваш пароль /net/cv/convert1900.data, проверьте свой jar-файл, проверьте путь к классу при запуске из maven: вероятно, ресурс отсутствует

Кстати, это возможно! Все ресурсы в Maven должны находиться в ресурсах каталога. Это правильно для вашего проекта? Например, если файлы ресурсов находятся в main / java, они не будут скопированы в целевой каталог.

...