2012-05-11 25 views
6

Próbuję pobrać i załadować obiekt z pliku przechowywanego na serwerze internetowym. Kod używam jest wewnątrz bloku try-catch w AsyncTask:Android: Pobierz obiekt

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(); 

I zbudować plik z tym kodem:

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

Gdy próbuję i odczytać obiekt w pierwszym kawałku kodu Otrzymuję IOExecption, że format danych UTF nie pasuje do UTF-8. Próbowałem ponownie zbudować plik kilka razy i zawsze daje mi ten sam błąd. Czy mogę pobrać obiekt taki jak ten?

+0

Jaki jest kod po stronie serwera? Jak generujesz 'thefileIwant'? – kichik

+0

Jest obsługiwany tylko przez http i jest publicznie dostępny. Właśnie dodałem kod, którego używam, make plik – Flynn

+0

Wygląda na to, że twój serwer wysyła niewłaściwy typ zawartości. Upewnij się, że jest to 'application/octet-stream'. – kichik

Odpowiedz

1

To wygląda na problem z kodowaniem. Myślę, że kichik ma rację i najprawdopodobniej twój serwer wysyła dane za pomocą niewłaściwego typu zawartości, ale myślę, że musisz ustawić go na application/x-java-serialized-object. Spróbuj dodać następujące linie tuż po otwarciu URLConnection:

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

Jeśli to nie działa (serwer może nie być w stanie go wysyłana przy użyciu tego typu), można też spróbować użyć zamiast Socket URLConnection, lub serializować obiekt za pomocą XML lub JSON i uzyskać to za pośrednictwem HttpUrlConnection

0

Spróbuj tego. Jest podobny do kodu, ale z kilkoma różnicami. Sekwencyjny odczyt/zapis może być trochę przestarzały, ale działa dobrze dla mnie.

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

Działa to dla nas Korzystanie jakieś biblioteki 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(); 
    } 
Powiązane problemy