У меня есть ZIP-файл, содержащий несколько изображений PNG, которые я пытаюсь загрузить в свое Java-приложение в качестве ресурсов ImageIcon непосредственно из архива. Вот мой код:
import java.io.*;
import java.util.Enumeration;
import java.util.zip.*;
import javax.swing.ImageIcon;
public class Test {
public static void main( String[] args )
{
if( args.length == 0 )
{
System.out.println("usage: java Test.java file.zip");
return;
}
File archive = new File( args[0] );
if( !archive.exists() || !archive.canRead() )
{
System.err.printf("Unable to find/access %s.\n", archive);
return;
}
try {
ZipFile zip = new ZipFile(archive);
Enumeration <? extends ZipEntry>e = zip.entries();
while( e.hasMoreElements() )
{
ZipEntry entry = (ZipEntry) e.nextElement();
int size = (int) entry.getSize();
int count = (size % 1024 == 0) ? size / 1024 : (size / 1024)+1;
int offset = 0;
int nread, toRead;
byte[] buffer = new byte[size];
for( int i = 0; i < count; i++ )
{
offset = 1024*i;
toRead = (size-offset > 1024) ? 1024 : size-offset;
nread = zip.getInputStream(entry).read(buffer, offset, toRead);
}
ImageIcon icon = new ImageIcon(buffer); // boom -- why?
}
zip.close();
} catch( IOException ex ) {
System.err.println(ex.getMessage());
}
}
}
Размеры, указанные в entry.getSize (), соответствуют разархивированным размерам файлов PNG, и я могу читать данные из архива без каких-либо исключений, но создание ImageIcon взрывается. Трассировка стека:
sun.awt.image.PNGImageDecoder$PNGException: crc corruption
at sun.awt.image.PNGImageDecoder.getChunk(PNGImageDecoder.java:699)
at sun.awt.image.PNGImageDecoder.getData(PNGImageDecoder.java:707)
at sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:234)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
sun.awt.image.PNGImageDecoder$PNGException: crc corruption
at sun.awt.image.PNGImageDecoder.getChunk(PNGImageDecoder.java:699)
at sun.awt.image.PNGImageDecoder.getData(PNGImageDecoder.java:707)
at sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:234)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
Может кто-нибудь пролить свет на это? Google не нашел никакой полезной информации.