【问题标题】:generate byte array from StringBuffer.toString从 StringBuffer.toString 生成字节数组
【发布时间】:2013-04-26 12:57:39
【问题描述】:

我要做的是从一个 url 生成一个字节数组。

byte[] data = WebServiceClient.download(url);

url 返回 json

public static byte[] download(String url) {
    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet(url);
    try {
        HttpResponse response = client.execute(get);
        StatusLine status = response.getStatusLine();
        int code = status.getStatusCode();
        switch (code) {
            case 200:
                StringBuffer sb = new StringBuffer();
                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
                is.close();

                sContent = sb.toString();

                break;       
        }
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return sContent.getBytes();
}

这个data被用作String的参数

String json = new String(data, "UTF-8");
JSONObject obj = new JSONObject(json);

由于某种原因,我收到此错误

I/global  (  631): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.

我认为这里sContent = sb.toString(); 或这里return sContent.getBytes(); 一定缺少某些东西,但我不确定。

【问题讨论】:

  • 这是 android (Dalvik VM) 吗?
  • 如果您执行new BufferedReader(new InputStreamReader(is), 8192);,错误会消失吗?
  • 我建议你使用 BufferedInputStream 来读取 4 或 8 KB 的数据块,而不是处理字符数据和弄乱字符集。
  • wrong usage of BufferedReader 的可能重复项
  • 顺便说一句,您可以使用 StringBuilder 代替 StringBuffer:在局部变量中,不需要同步操作

标签: java android


【解决方案1】:

1.考虑使用Apache commons-ioInputStream读取字节

InputStream is = entity.getContent();
try {
    return IOUtils.toByteArray(is);
}finally{
    is.close();
}

目前,您不必要地将字节转换为字符并返回。

2. 避免使用String.getBytes() 而不将字符集作为参数传递。而是使用

String s = ...;
s.getBytes("utf-8")


总的来说,我会重写你的方法是这样的:
public static byte[] download(String url) throws IOException {
    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet(url);
    HttpResponse response = client.execute(get);
    StatusLine status = response.getStatusLine();
    int code = status.getStatusCode();
    if(code != 200) {
        throw new IOException(code+" response received.");
    }
    HttpEntity entity = response.getEntity();
    InputStream is = entity.getContent();
    try {
        return IOUtils.toByteArray(is);
    }finally{
        IOUtils.closeQuietly(is.close());
    }
}

【讨论】:

  • 可能也用IOUtils.closeQuietly()
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2018-06-25
  • 2020-01-04
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多