我正在使用URLConnection,DataInputStream和FileOutputStream下載文件。我正在用在線文件的大小(使用getContentLength())創建一個巨大的字節[]。事情是,當我嘗試下載大文件時,我得到了一個OutOfMemoryError:Java堆空間,這是一種正常行爲。在不知道大小的情況下下載文件
下面是代碼:
URLConnection con;
DataInputStream dis;
FileOutputStream fos;
byte[] fileData = null;
URL url = new URL(from);
con = url.openConnection();
con.setUseCaches(false);
con.setDefaultUseCaches(false);
con.setRequestProperty("Cache-Control", "no-store,max-age=0,no-cache");
con.setRequestProperty("Expires", "0");
con.setRequestProperty("Pragma", "no-cache");
con.setConnectTimeout(5000);
con.setReadTimeout(30000);
dis = new DataInputStream(con.getInputStream());
int contentLength = con.getContentLength();
//Taille connue
if (contentLength != -1)
{
fileData = new byte[con.getContentLength()];
for (int x = 0; x < fileData.length; x++)
{
fileData[x] = dis.readByte();
if (listener != null)
{
listener.onFileProgressChanged(x, fileData.length);
}
}
}
//Taille inconnue
else
{
System.out.println("Attention : taille du fichier inconnue !");
if (undefinedListener != null)
{
undefinedListener.onUndefinedFile();
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
while (true)
{
try
{
stream.write(dis.readByte());
}
catch (EOFException ex)
{
//Fin
fileData = stream.toByteArray();
stream.close();
}
}
}
dis.close();
//Ecriture
fos = new FileOutputStream(file);
fos.write(fileData);
fos.close();
我聽說過,我應該將文件分割成塊,以避免它。我知道如何做到這一點,這很容易,但是......如果文件的ContentLength不能從服務器中獲取(getContentLength()== -1),我該怎麼做?如果我不知道它的大小,我應該如何將文件分成塊?
謝謝!
爲什麼你使用'DataInputStream'? – fge
顯示您現在使用的代碼。幾乎肯定有一個簡單的解決方案,它可能涉及Apache Commons'IOUtils'。 – kdgregory
我添加了代碼 – natinusala