6

Webサーバーに保存されているファイルからオブジェクトをダウンロードしてロードしようとしています。私が使用するコードは、AsyncTask の try-catch ブロック内にあります。

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

コードの最初の部分でオブジェクトを読み取ろうとすると、UTF データ形式が UTF-8 と一致しないという IOExecption が表示されます。ファイルを数回再構築しようとしましたが、常に同じエラーが発生します。このようなオブジェクトをダウンロードできますか?

4

3 に答える 3

1

これはエンコードの問題のようです。kichik は正しく、サーバーが間違ったコンテンツ タイプを使用してデータを送信している可能性が高いと思いますが、application/x-java-serialized-object代わりに設定する必要があると思います。URLConnection を開いた直後に次の行を追加してみてください。

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

それが機能しない場合 (サーバーがその型を使用して送信できない可能性があります)、UrlConnection の代わりに Socket を使用するか、XML または JSON を使用してオブジェクトをシリアル化し、HttpUrlConnection を介して取得します。

于 2012-05-18T13:19:30.850 に答える
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();
    }
于 2012-05-24T21:49:01.283 に答える
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();
于 2012-05-21T18:58:39.480 に答える