在一个文件上传的方法中,使用ImageIO.read( );方法,程序就停止,try catch也不报错,求大神~求解决思路,,,代码如下:@RequestMapping("/shareUpload.do")
@ResponseBody
public String shareUpload(String content,Long uid,MultipartHttpServletRequest request){
try {
content = URLDecoder.decode(content, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
MultipartFile file = request.getFile("file1");
if (!file.isEmpty()){
            try {
             String path = request.getSession().getServletContext().getRealPath("share");
             String fileName = file.getOriginalFilename();
             String suffix = fileName.substring(fileName.lastIndexOf("."), fileName.length());
             String fn = UUID.randomUUID().toString();
             fileName = fn+suffix;
             //FileUploadUtils.copyFile(file.getInputStream(), fileName,path);
             saveFile(file, path+File.separator+fileName);
             Share s = new Share();
             s.setUsImg(fileName);
             s.setUsContent(content);
             s.setUsUid(uid);
             shareService.save(s);
             User u = userService.findById(uid);
             u.setUShareNum(u.getUShareNum()+1);
             userService.update(u);
} catch (Exception e) {
e.printStackTrace();
}
       }
return null;
}
protected boolean saveFile(MultipartFile file,String path){
InputStream fileIS=null;
FileOutputStream fileOS=null;
try{
fileIS=file.getInputStream();
fileOS=new FileOutputStream(path);
//fileOS.write(file.getBytes());
//1024*4=4096  上传文件最小可能有几K,最大有几M,根据情况考虑用4K缓冲区
byte[] bytes = new byte[4096];
int c;
while ((c = fileIS.read(bytes)) != -1) {
fileOS.write(bytes, 0, c);
}
ImageIO.read(fileIS);//<---------程序执行到这里时,debug就停止,不执行下一行
System.out.println(1);
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try{
if(null!=fileIS)fileIS.close();
if(null!=fileOS)fileOS.close();
}catch(Exception e){
e.printStackTrace();
return false;
}
}
return true;
}
读取的这个文件大小只有100多K,格式为.jpg

解决方案 »

  1.   

    听你这么说像是阻塞了。
    但是我发现一个问题 ,不知道是不是引起阻塞的原因。 你按照下面的方法试试。
    在 ImageIO.read(fileIS); 这句代码之前,你已经将fileIS的内容全部读完了。 你这里再用ImageIO.read去读取,肯定是取不到数据的。你已经将所有的内容都写入到new FileOutputStream(path);这个输入流了。所以,你的ImageIO可以从文件读 。
    将ImageIO.read(fileIS); 替换成 ImageIO.read(new File(path));试试
      

  2.   

    ImageIO.read(fileIS);//<---------程序执行到这里时,debug就停止,不执行下一行
    流里面的数据已经被你全部读完了,也写入文件了
    就连标志位你都读了,那个流里已经没有数据了,当然阻塞!
    你已经读完文件再用ImageIO.read(fileIS)属于画蛇添足,多此一举!
      

  3.   

    我之前就是用的 File f = new File(path);
    if(f.exists()){
    ImageIO.read(f);
    System.out.println(1);
    } ,结果是一样的,都是无响应。
      

  4.   


    文件是存在的,代码里面判断了文件是否存在,图片是.jpg的格式
      

  5.   

    有没没在ImageIO的read方法里面打断点,看看到底卡在哪一步了
      

  6.   

    你确定你的图片读完了么,4K大小的图片是不是太小了?
    while ((c = fileIS.read(bytes)) != -1) {                
    fileOS.write(bytes, 0, c);           
     }      
    会不会一直在这循环呢?       
      

  7.   


    在ImageIO.read()方法里的,1325行 
    ImageInputStream stream = createImageInputStream(input);
    这里卡住了~~
      

  8.   


    然后再进去到最终停止的那行代码,是在FileCacheImageInputStream.class的88行:
    Disposer.addRecord(disposerReferent, disposerRecord);方法。这个方法就不能再进去了。
      

  9.   

    Disposer.addRecord调用了一个很简单的同步方法add(Object paramObject, DisposerRecord paramDisposerRecord),add方法内又调用了hashtable的put方法。有同步锁出问题的可能,但我觉得应该不是这个的问题。
    到底是死在88行还是94行?Disposer.addRecord(disposerReferent, disposerRecord);在我这是94行。
      

  10.   


    我这边是88行,我的94行是一排注解。我这边DEBUG显示disposerReferent里面什么都没有:然后用step into就进不去了。
      

  11.   

    反编译一下那个Disposer就可以看到里面的内容了
      

  12.   

    imageIo.read(File),你在这里放一个文件而不要去放个流