手里有些图片,几万张,想要对这些图片生成预览图,但是总是报错,麻烦各位大大帮我看下我代码里面问题出在何处,谢谢了!
package liuc.test;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
 * @author Liuc
 * @date 2013-4-17
 */
public class CreateBrevImg {
public static void main(String[] args)  {
String filePath = "C:\\Users\\Administrator\\Desktop\\testP";
String brevFilePath = "C:\\Users\\Administrator\\Desktop\\Brev";
CreateBrevImg c = new CreateBrevImg();
c.getBrev(filePath, brevFilePath);
}


public void getBrev(String filePath, String brevFilePath){
File file = new File(filePath);
File[] files = file.listFiles();
InputStream is = null ;
String tmpBrevPicPath = "";
File tmpFile;
int i = 0;
int new_w=150;
int new_h=100; 
Image src;
BufferedImage tag;
FileOutputStream newimage;
JPEGImageEncoder encoder;
try {
for (File file2 : files) {
if("Brev".equals(file2.getName())){
continue;
}
// System.out.println(file2.getAbsolutePath());
tmpBrevPicPath = brevFilePath + "\\" + file2.getName();
if(file2.getName().indexOf('.')==-1){
continue;
}
tmpFile = file2;
is = new FileInputStream(tmpFile);
// ImgUtil.brvePic(tmpBrevPicPath, is);

src = javax.imageio.ImageIO.read(is);                     
    tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
    tag.getGraphics().drawImage(src,0,0,new_w,new_h,null);      
    newimage=new FileOutputStream(tmpBrevPicPath);          
    encoder = JPEGCodec.createJPEGEncoder(newimage);       
    encoder.encode(tag);                                               
    newimage.close();
i++;
}
} catch (Exception e) {
e.printStackTrace();
} finally{
System.out.println("已转换" + i + "张图片");
is = null ;
files = null;
file = null;
src = null;
tag = null;
newimage = null;
tmpFile = null;
encoder = null;
}

}
}内存溢出

解决方案 »

  1.   

    另外补充一下,图片大小为不足1MB到30+MB不等,最大的图片在单独测试的时候是可以正常生成预览图的没有人吗?
      

  2.   

    根据报错的内容,就是虚拟机内存堆溢出了,调大JVM的内存上限吧
      

  3.   

    for循环一次就关闭流,因为你每次for循环进去后是重新打开流的,或者中间flush以下。
      

  4.   

    你的newimage都知道在循环里面close()。
    为啥你的is和tag不调用close()呢
      

  5.   

    我做过读取几十个文本文件,每个文件从几十M到几百M不等,如果单个文件会引起内存溢出就要定期处理一次,而你的文件最大为:30M,应没问题,只是你应该在每个for循环后关闭流,我看到你并未没关闭输入流,你也可以在catch中打印下该文件的信息及总共读取了多少M的文件了,以作定位之用,希望能帮到你。
      

  6.   

    在循环结束时关闭输入流并将循环外面声明的变量置为空,还是不行package liuc.test;import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    /**
     * @author Liuc
     * @date 2013-4-17
     */
    public class CreateBrevImg {
    public static void main(String[] args)  {
    String filePath = "C:\\Users\\Administrator\\Desktop\\testP";
    String brevFilePath = "C:\\Users\\Administrator\\Desktop\\Brev";
    CreateBrevImg c = new CreateBrevImg();
    c.getBrev(filePath, brevFilePath);
    }


    public void getBrev(String filePath, String brevFilePath){
    File file = new File(filePath);
    File[] files = file.listFiles();
    InputStream is = null ;
    String tmpBrevPicPath = "";
    File tmpFile;
    int i = 0;
    int new_w=150;
    int new_h=100; 
    Image src;
    BufferedImage tag;
    FileOutputStream newimage;
    JPEGImageEncoder encoder;
    try {
    for (File file2 : files) {
    if("Brev".equals(file2.getName())){
    continue;
    }
    // System.out.println(file2.getAbsolutePath());
    tmpBrevPicPath = brevFilePath + "\\" + file2.getName();
    if(file2.getName().indexOf('.')==-1){
    continue;
    }
    tmpFile = file2;
    is = new FileInputStream(tmpFile);
    src = javax.imageio.ImageIO.read(is);                    
        tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
        tag.getGraphics().drawImage(src,0,0,new_w,new_h,null);      
        newimage=new FileOutputStream(tmpBrevPicPath);         
        encoder = JPEGCodec.createJPEGEncoder(newimage);       
        encoder.encode(tag);                                              
        newimage.flush();
        newimage.close();
        is.close();
        
    i++;
    file2 = null;
    tmpFile = null;
    is = null;
    src = null;
    tag = null;
    newimage = null;
    encoder = null;
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally{
    System.out.println("已转换" + i + "张图片");
    is = null ;
    files = null;
    file = null;
    src = null;
    tag = null;
    newimage = null;
    tmpFile = null;
    encoder = null;
    }

    }
    }
      

  7.   

    src.close()没调,src是图片操作,最关键的要关闭。
      

  8.   

    src 是这个类型   java.awt.Image     
    tag是这个类型   BufferedImage我没明白你的意思,可以说详细些吗
      

  9.   

    图片操作特别耗内存,所以Image用完一定要关闭。