2012-09-09 78 views
23

我試圖從互聯網上下載的iamge,這裏的時候,錯誤代碼:FileOutputStream中崩潰,「打開失敗:EISDIR(是一個目錄)」下載圖像

try { 
       String imgURL = c.imgURL; 
       String imgPATH = c.imgPATH; 
       URL url = new URL(imgURL); 
       URLConnection conexion = url.openConnection(); 
       conexion.connect(); 
       int lenghtOfFile = conexion.getContentLength(); 
       try { 
        File f = new File(imgPATH); 
        f.mkdirs(); 

        BufferedInputStream input = new BufferedInputStream(url.openStream()); 
        BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(imgPATH), 8192); // CRASH HERE 

        byte data[] = new byte[8192]; 
        long total = 0; 
        int count = 0; 
        int updateUILimiter = 0; 
        while ((count = input.read(data)) != -1) { 
         total += count; 

         if (updateUILimiter == 20) 
          // publishProgress((int) (total * 100/lenghtOfFile)); 
          updateUILimiter = 0; 
         else 
          updateUILimiter++; 

         output.write(data, 0, count); 

         if (isCancelled()) { 
          output.flush(); 
          output.close(); 
          input.close(); 
          return null; 
         } 

        } 
        output.flush(); 
        output.close(); 
        input.close(); 
       } catch (Exception e) { 
        c.imgPATH = ""; 
        return null; 
       } 


      } catch (Exception e) { 
       c.imgPATH = ""; 
       return null; 
      } 

以下是錯誤信息:

/mnt/sdcard/tmp/3.png:打開失敗:EISDIR(是一個目錄)

這是爲什麼?

「/ mnt/sdcard/tmp /」存在。

+1

因爲3.png是目錄? –

回答

75

3.png是一個目錄,因爲你通過調用f.mkdirs();來完成它。改爲嘗試f.getParentFile().mkdirs()。從documentation

創建此抽象路徑名,包括所有必需但不存在的父目錄命名的目錄。請注意,如果此操作失敗,則可能會成功創建一些必需的父目錄。

(強調我的)。換句話說,包含在File實例f中的整個路徑被視爲目錄名稱,直到幷包括最後一部分(示例輸出中的3.png)。

+7

或'f.createNewFile();' – MrLore

+2

@MrLore:這不等同。特別是,它不能確定目標目標目錄是否存在。另外,可能有意識的是,代碼會覆蓋現有文件(一種情況,其中'createNewFile'會失敗) – Dirk

4

f.createNewFile().

11

問題更換f.mkdirs()是,你正在使用的功能

f.mkdirs(); 

這個函數將創建一個名爲而不是一個名爲「3.png」文件「3.png」文件夾,所以先刪除這個文件夾,

enter image description here

然後更換功能

f.mkdirs(); 

f.createNewFile(); 

希望這有助於。

2

您可以先製作目錄,然後再編寫代碼。

URL downloadURL=null; 
    HttpURLConnection urlConnection=null; 
    InputStream inputStream=null; 
    FileOutputStream fos=null; 
    Uri uri=Uri.parse(url); 
    try { 
     downloadURL=new URL(url); 
     urlConnection= (HttpURLConnection) downloadURL.openConnection(); 
     inputStream=urlConnection.getInputStream(); 
     File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"); 
     if(!file.exists()) 
     { 
      file.mkdirs(); 
     } 
     File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment()); 
     fos=new FileOutputStream(file1); 
     byte[] buffer=new byte[1024]; 

     int read=-1; 
     while((read=inputStream.read(buffer))!=-1) 
     { 
      /* Message.L(""+read);*/ 
      fos.write(buffer,0,read); 
     } 

    } 

這樣你就可以做

File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"); 
     if(!file.exists()) 
     { 
      file.mkdirs(); 
     } 
     File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment()); 
     fos=new FileOutputStream(file1);