移除`getDownloadTask(String url)`、`getGroupTask(List<String>urls)`、`getFtpDirTask(String path)`等获取任务的api 修复使用`Content-Disposition`的文件名时,第一次下载无法重命名文件的问题 修复使用`Content-Disposition`的文件名时,多次重命名文件的问题v3.6.6
parent
0a447787ea
commit
8c0ef0f879
@ -0,0 +1,101 @@ |
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one |
||||
* or more contributor license agreements. See the NOTICE file |
||||
* distributed with this work for additional information |
||||
* regarding copyright ownership. The ASF licenses this file |
||||
* to you under the Apache License, Version 2.0 (the |
||||
* "License"); you may not use this file except in compliance |
||||
* with the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package com.arialyy.aria.core.download.downloader; |
||||
|
||||
import com.arialyy.aria.util.ALog; |
||||
import java.io.DataInputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
|
||||
// Data is expected to be a series of data chunks in the form <chunk size><chunk bytes><chunk size><chunk bytes>
|
||||
// The final data chunk should be a 0-length chunk which will indicate end of input.
|
||||
@Deprecated |
||||
public class ChunkedInputStream extends InputStream { |
||||
private static final String TAG = "ChunkedInputStream"; |
||||
|
||||
private DataInputStream din; |
||||
private int unreadBytes = 0; // Bytes remaining in the current chunk of data
|
||||
private byte[] singleByte = new byte[1]; |
||||
private boolean endOfData = false; |
||||
private String id; |
||||
|
||||
public ChunkedInputStream(InputStream in, String id) { |
||||
din = new DataInputStream(in); |
||||
this.id = id; |
||||
ALog.d(TAG, String.format("Creating chunked input for %s", id)); |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws IOException { |
||||
ALog.d(TAG, String.format("%s: Closing chunked input.", id)); |
||||
din.close(); |
||||
} |
||||
|
||||
@Override |
||||
public int read() throws IOException { |
||||
int bytesRead = read(singleByte, 0, 1); |
||||
return (bytesRead == -1) ? -1 : (int) singleByte[0]; |
||||
} |
||||
|
||||
@Override |
||||
public int read(byte[] b, int off, int len) throws IOException { |
||||
int bytesRead = 0; |
||||
|
||||
if (len < 0) { |
||||
throw new IllegalArgumentException(id + ": Negative read length"); |
||||
} else if (len == 0) { |
||||
return 0; |
||||
} |
||||
|
||||
// If there is a current unread chunk, read from that, or else get the next chunk.
|
||||
if (unreadBytes == 0) { |
||||
try { |
||||
// Find the next chunk size
|
||||
unreadBytes = din.readInt(); |
||||
if (ALog.DEBUG) { |
||||
ALog.d(TAG, String.format("%s: Chunk size %s", id, unreadBytes)); |
||||
} |
||||
if (unreadBytes == 0) { |
||||
ALog.d(TAG, String.format("%s: Hit end of data", id)); |
||||
endOfData = true; |
||||
return -1; |
||||
} |
||||
} catch (IOException err) { |
||||
throw new IOException(id + ": Error while attempting to read chunk length", err); |
||||
} |
||||
} |
||||
|
||||
int bytesToRead = Math.min(len, unreadBytes); |
||||
try { |
||||
din.readFully(b, off, bytesToRead); |
||||
} catch (IOException err) { |
||||
throw new IOException( |
||||
id + ": Error while attempting to read " + bytesToRead + " bytes from current chunk", |
||||
err); |
||||
} |
||||
unreadBytes -= bytesToRead; |
||||
bytesRead += bytesToRead; |
||||
|
||||
return bytesRead; |
||||
} |
||||
|
||||
public boolean isEndOfData() { |
||||
return endOfData; |
||||
} |
||||
} |
Loading…
Reference in new issue