2012-10-24 40 views
1

我使用AsyncTask從URL下載文件。該文件已保存,我可以在我的SD卡上看到它。在我的應用我想打開此文件在下載後,但有以下錯誤:當使用AsyncTask嘗試打開從URL下載的文件時,ENOENT(沒有這樣的文件或目錄)

java.io.FileNotFoundException: /mnt/sdcard/XML/zurt.xml: open failed: ENOENT (No such file or directory) 

我必須等待下載和打開文件之間的指定時間?問題是什麼?

我有這兩種權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > 
</uses-permission> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" > 
</uses-permission> 

我的AsyncTask:

/** 
    * Download XML from URL async 
    */ 
    // usually, subclasses of AsyncTask are declared inside the activity class. 
    // that way, you can easily modify the UI thread from here 
    private class DownloadFile extends AsyncTask<String, Integer, String> { 
    @Override 
    protected String doInBackground(String... sUrl) { 
     try { 
      URL url = new URL(sUrl[0]); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 
      // this will be useful so that you can show a typical 0-100% progress bar 
      int fileLength = connection.getContentLength(); 

      // create a File object for the parent directory 
      File xmlDirectory = new File(Environment.getExternalStorageDirectory()+ FileSeperator+"XML" 
        +FileSeperator); 
      // have the object build the directory structure, if needed. 
      xmlDirectory.mkdirs(); 

      // create a File object for the output file 
      File outputFile = new File(xmlDirectory, Name+FileExtension); 
      // download the file 
      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(outputFile); 

      byte data[] = new byte[1024]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
     return null; 
    } 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mProgressDialog.show(); 
    } 

    protected void onPostExecute() { 
     mProgressDialog.dismiss(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     super.onProgressUpdate(progress); 
     mProgressDialog.setProgress(progress[0]); 
    } 
} 

該代碼試圖打開保存文件:

/** 
* XML Parser 
* */ 
private ArrayList<Datapoint> parseXML() { 

try {   
    Log.w("AndroidParseXMLActivity", "Start"); 
    /** Handling XML */ 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    SAXParser sp = spf.newSAXParser(); 
    XMLReader xr = sp.getXMLReader(); 

    File file = new File(Environment.getExternalStorageDirectory()+ FileSeperator+"XML" 
    +FileSeperator+ Name + FileExtension); 

    XMLContentHandler myXMLHandler = new XMLContentHandler(); 
    xr.setContentHandler(myXMLHandler); 

     xr.parse(new InputSource(new InputStreamReader(new FileInputStream(file)))); 

    itemsList = myXMLHandler.getItemsList(); 

    Log.w("AndroidParseXMLActivity", "Done"); 
} 
catch (Exception e) { 
    Log.w("AndroidParseXMLActivity",e); 
} 
return itemsList ; 

}

+0

顯示下載後從中訪問文件的代碼。 –

+1

創建文件後,添加此打印語句,以確保您正在寫入的文件是預期的文件:'Log.i(「FILE」,outputFile.getName());' – Phil

+0

@Raghav我已將代碼添加到我的主要職位。 –

回答

3

我改變下面的lin e和它的工作原理:

protected void onPostExecute() { 
     parseXML(); 
     mProgressDialog.dismiss(); 
    } 
相關問題