使用OkHTTP Client下载二进制文件已损坏

时间:2018-08-14 17:04:40

标签: java inputstream okhttp3 fileoutputstream okhttp

我正在尝试使用 disableDateList: Array<any> = [ '2018-08-01', '2018-08-02', '2018-08-03', '2018-08-04', '2018-08-05', '2018-08-06', '2018-08-15', '2018-08-15', '2018-10-15', '2018-11-15', '2018-12-15', '2019-02-15', '2019-11-05', '2019-12-15' ]; myFilter = (d: Date): boolean => { d = new Date(d); let date: any; let month: any; if (d.getDate().toString().length < 2) { date = '0' + d.getDate().toString() } else { date = d.getDate().toString() } if ((d.getMonth() + 1).toString().length < 2) { month = '0' + (d.getMonth() + 1).toString() } else { month = (d.getMonth() + 1).toString() } const day = d.getFullYear().toString() + "-" + month + "-" + date; return !this.disableDateList.includes(day); } 进行下载二进制文件。
 当OkHttpBUFFER_SIZE时,文件将正确下载。
 但是,当我将1设置为BUFFER_SIZE时文件被损坏。
1024设置为BUFFER_SIZE时,文件下载需要很长时间

下面是代码段:

1

2 个答案:

答案 0 :(得分:1)

如果您的BUFFER_SIZE在上次读取时未满,那么您将在文件中写入错误的数据:

你有

fileOutputStream.write(BUFFER_SIZE);

您应该拥有:

fileOutputStream.write(BUFFER_SIZE, 0, byteRead);

EDIT1:我也很乐意替换这部分代码:

while (true) {
  int byteRead = inputStream.read(BUFFER_SIZE);
  if (byteRead == -1) {
    break;
  }

采用更好的方法:

int byteRead;
while ( (byteRead = inputStream.read(BUFFER_SIZE)) > 0 ) {

答案 1 :(得分:0)

您的代码有点混乱,因为BUFFER_SIZE看起来像一个数字常量。除此之外,我认为您的问题在于fileOutputStream.write(BUFFER_SIZE)。在最后一次写入时,当byte []未“满”时,您仍将写入数组的全部内容。使用指定偏移量(0)和要写入的字节(byteRead。)的重载