ByteArrayOutputStream報OutOfMemoryError錯誤實際是分情況的
先貼代碼,再來講述
一、主要測試代碼
public static byte[] mapToBytes(HashMap map){
try{
MyByteArrayOutputStream mem_out = new MyByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(mem_out);
out.writeObject(map);//位置1 danielinbiti
out.close();
mem_out.close();
System.out.println("here");
System.out.println("count="+mem_out.getCount());
System.out.println("length="+mem_out.getBuf().length);
byte[] bytes = mem_out.toByteArray();//位置2 danielinbiti
return bytes;
}catch(IOException ioe){
System.out.println(ioe.getMessage());
}catch(Exception ex){
System.out.println(ex.getMessage());
}
return null;
}
public static void main(String[] args) {
HashMap map=new HashMap();
for(int i=0;i<3000000;i++){//調整該數字測試
map.put(i+"","abcdefghijklmnopqrstuvwx23sdfasdfsadfad撒的發生的法定danielinbitifasfqwefqwerqljelfq"+i);
}
byte[] bytes = mapToBytes(map);
}
MyByteArrayOutputStream.java文件
public class MyByteArrayOutputStream extends ByteArrayOutputStream{
public byte[] getBuf(){//danielinbiti 因為我這測試在2個package中
return this.buf;
}
public int getCount(){
return this.count;
}
}
報出錯誤的位置有兩個地方,分別是注釋中的位置1,位置2
1、位置1的錯誤是因為ByteArrayOutputStream到了臨界,無法再擴大數組了,因為定義的時候count是int,超出int最大范圍就報錯
2、位置2的錯誤是因為內存空間不夠,無法再生成數組toByteArray,但可以直接從mem_out.getBuf()獲取,當然這個數組比實際要大,因此還得看mem_out.getCount(),這個值就是數組有內容的最大下標。