【问题标题】:Android java.lang.IllegalArgumentException: byteCountAndroid java.lang.IllegalArgumentException:字节计数
【发布时间】:2017-01-11 05:05:26
【问题描述】:

我从这段代码中得到随机错误(不是所有连接)java.lang.IllegalArgumentException: byteCount

URL connurl = new URL(newUrl);
conn = (HttpURLConnection) connurl.openConnection();
conn.setRequestProperty("User-Agent", "Android");
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if (finish != 0L)
    conn.setRequestProperty("Range", "bytes=" + finish + "-" + size);
conn.connect();
int getResponseCode = conn.getResponseCode();
String getContenttype = conn.getContentType();
int contentLenght = conn.getContentLength();
if (!StringUtils.startsWith(String.valueOf(getResponseCode), "20")) {
}
else if(StringUtils.startsWithIgnoreCase(getContenttype, "text/html")) {
}
else if(contentLenght < (size-finish)) {
}
else {
    ReadableByteChannel channel = Channels.newChannel(conn.getInputStream()); 
    accessFile = new RandomAccessFile(filePath, "rwd");
    accessFile.seek(finish);
    fileStream = new FileOutputStream(filePath, true);
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    byte[] data;
    int temp;
    while ((temp = channel.read(buffer)) > 0) { <-- error in this line
    }

错误:

java.lang.IllegalArgumentException: byteCount < 0: -1647333
    at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:46)
    at com.android.okhttp.internal.http.HttpConnection$FixedLengthSource.read(HttpConnection.java:418)
    at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:349)
    at java.io.InputStream.read(InputStream.java:162)
    at java.nio.channels.Channels$InputStreamChannel.read(Channels.java:306)

如何解决? 谢谢

【问题讨论】:

  • 您确定收到200 响应吗?
  • 如何初始化conn 变量?
  • 这是随机错误,不是所有连接。在此代码的顶部检查了 conn 和 http 代码 if (!StringUtils.startsWith(String.valueOf(getResponseCode), "20")) {
  • 问题肯定是因为Range 标头。你如何初始化finishsize
  • 嗨@user13,finish 是文件大小已经保存,size 是文件大小,不要担心finishsize,在下载文件之前检查的现有代码。如果我什么都写,会占用很多地方。

标签: java android inputstream httpurlconnection


【解决方案1】:

这可能与该问题有关:https://github.com/square/okhttp/issues/3104

按照建议,考虑使用okhttp-urlconnection,例如:

OkHttpClient okHttpClient = new OkHttpClient();
URL.setURLStreamHandlerFactory(new OkUrlFactory(okHttpClient));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多