2012-05-11 32 views
6

所以我試圖從存儲在網絡服務器上的文件中下載和加載一個對象。我使用的代碼是一個try-catch塊內在的AsyncTask:Android:下載對象

URL url = new URL("http://www.mydomain.com/thefileIwant"); 
URLConnection urlConn = url.openConnection(); 
ObjectInputStream ois = new ObjectInputStream(urlConn.getInputStream()); 
foo = (Foo) ois.readObject(); 
ois.close(); 

我建立與該代碼的文件:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("thefileIwant")); 
oos.writeObject(foo); 
oos.close(); 

當我嘗試和在第一片的代碼讀取的對象我得到一個IOExecption,UTF數據格式與UTF-8不匹配。我曾嘗試重新構建該文件幾次,它總是給我同樣的錯誤。我可以像這樣下載一個對象嗎?

+0

什麼是服務器端的代碼?你如何生成'thefileIwant'? – kichik

+0

它只是通過http託管並完全公開訪問。我剛添加了我使用make的文件的代碼 – Flynn

+0

聽起來像你的服務器發送了錯誤的內容類型。確保它是'application/octet-stream'。 – kichik

回答

1

這看起來像一個編碼問題。我認爲kichik是正確的,並且很可能您的服務器使用錯誤的內容類型發送數據,但我認爲您需要將其設置爲application/x-java-serialized-object。 嘗試添加以下行打開的URLConnection之後:

urlConn.setUseCaches(false); 
urlConn.setRequestProperty("Content-Type", "application/x-java-serialized-object"); 

如果不工作(你的服務器可能無法使用該類型來發送它),你可以嘗試使用套接字而不是URLConnection的,或者使用XML或JSON序列化您的對象並通過HttpUrlConnection獲取該對象

0

試試這個。它與你的代碼很相似,但有一些不同之處。順序讀/寫可能有點陳舊,但適合我。

URL url = new URL("your URL"); 
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
    urlConn.setRequestMethod("GET"); 
    urlConn.setRequestProperty("Content-Type", "text/plain; charset=utf-8"); 
    urlConn.connect(); 
    InputStream is = urlConn.getInputStream(); 
    byte[] buffer = new byte[1024]; 
    int numRead = 0; 
    FileOutputStream fos = new FileOutputStream("Your File"); 
    while ((numRead = is.read(buffer)) > 0) { 
    fos.write(buffer, 0, numRead); 
    } 
    fos.close(); 
0

這爲我們工作,使用一些Apache庫

 FileOutputStream fos = new FileOutputStream("Your File"); 
     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 
     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

     HttpClient client = new DefaultHttpClient(ccm, params); 


     HttpGet httpGet = new HttpGet(downloadURL); 
     try { 
     HttpResponse response = client.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 
     Log.d(LOG_TAG, "code is " + statusCode); 
     if (statusCode == 200) { 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 

      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      while ((len1 = content.read(buffer)) > 0) { 
       fos.write(buffer,0, len1); 
     }        

     success = true; 
     } else { 
      Log.e(LOG_TAG_JSON, "Failed to download file " + downloadURL); 
     } 
     if (null != response.getEntity()) 
     { 
      response.getEntity().consumeContent(); 
     } 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "downloadVersion " + e.toString()); 
     e.printStackTrace(); 
    }