Я работаю над игрой, и мне нужно загрузить несколько файлов изображений (png, gif и т. Д.), Которые я в конечном итоге захочу преобразовать в объекты BufferedImage.В моей настройке я хотел бы загрузить все эти изображения из одного zip-файла "Resources.zip".Этот файл ресурсов будет содержать изображения, файлы карт и аудиофайлы - все они содержатся в различных аккуратно упорядоченных подкаталогах.Я хочу сделать это, потому что (надеюсь) упростит загрузку ресурсов в версиях моей программы и в апплете, и в приложении.Я также надеюсь, что для версии апплета этот метод позволит мне с легкостью показать прогресс загрузки zip-файла игровых ресурсов (который может в конечном итоге составить 10 МБ в зависимости от сложности этой игры, хотя я надеюсь,чтобы сохранить его в таком размере, чтобы он был удобен для браузера).
Я включил свой класс обработки почтовых индексов ниже.Идея в том, что у меня есть отдельный класс обработки ресурсов, и он создает объект ZipFileHandler, который он использует для извлечения определенных ресурсов из файла Resources.zip.
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class ZipFileHandler
{
private ZipFile zipFile;
public ZipFileHandler(String zipFileLocation)
{
try
{
zipFile = new ZipFile(zipFileLocation);
}
catch (IOException e) {System.err.println("Unable to load zip file at location: " + zipFileLocation);}
}
public byte[] getEntry(String filePath)
{
ZipEntry entry = zipFile.getEntry(filePath);
int entrySize = (int)entry.getSize();
try
{
BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
byte[] finalByteArray = new byte[entrySize];
int bufferSize = 2048;
byte[] buffer = new byte[2048];
int chunkSize = 0;
int bytesRead = 0;
while(true)
{
//Read chunk to buffer
chunkSize = bis.read(buffer, 0, bufferSize); //read() returns the number of bytes read
if(chunkSize == -1)
{
//read() returns -1 if the end of the stream has been reached
break;
}
//Write that chunk to the finalByteArray
//System.arraycopy(src, srcPos, dest, destPos, length)
System.arraycopy(buffer, 0, finalByteArray, bytesRead, chunkSize);
bytesRead += chunkSize;
}
bis.close(); //close BufferedInputStream
System.err.println("Entry size: " + finalByteArray.length);
return finalByteArray;
}
catch (IOException e)
{
System.err.println("No zip entry found at: " + filePath);
return null;
}
}
}
И я использую класс ZipFileHandler, как этот:
ZipFileHandler zfh = new ZipFileHandler(the_resourceRootPath + "Resources.zip");
InputStream in = new ByteArrayInputStream(zfh.getEntry("Resources/images/bg_tiles.png"));
try
{
BufferedImage bgTileSprite = ImageIO.read(in);
}
catch (IOException e)
{
System.err.println("Could not convert zipped image bytearray to a BufferedImage.");
}
И хорошая новость в том, что это работает!
Но я чувствую, что мог бы быть лучший способ сделать то, что я делаю (и я довольно плохо знаком сработа с BufferedInputStreams).
В конце мой вопрос таков:
Это даже хорошая идея?
Есть ли лучший способ загрузить целую кучуФайлы игровых ресурсов в одной загрузке / потоке, в виде апплетов и приложений?
Я приветствую все мысли и предложения!
Спасибо!