来自HttpURLConnection的对象的InputStream未获取所有数据

时间:2016-03-18 02:57:10

标签: java networking httpresponse

所以我有一个HttpURLConnection连接到某些URL上的某些图像。我正在使用Range属性下载此图像(在单独的并行连接中下载一个文件)。抓住所有零件后,我将它们拼接在一起。除非我尝试用更大的文件做一个InputStream(这意味着我可以在200个并行连接中获得文件,但不是5个),一切都很有效。

例如:

假设我想只下载1个部分中的对象:http://stuorgs.uga.edu/images/spotlight/spotlight_button.png。所以我的范围是从bytes = 0-max。我的程序创建一个大小为max的字节数组,并将来自HttpURLConnection的InputStream读入数组。但是,在某个点之后,InputStream要么只发送超过0000,要么过早关闭。

这是我的代码:

try {
    HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
    String bytesToGrab = "bytes=" + startingByte + "-" + endingByte;
    urlConnection.setRequestProperty("Range", bytesToGrab);

    int sizeOfData = endingByte - startingByte;
    byte[] storeData = new byte[sizeOfData];

    InputStream inputStream = urlConnection.getInputStream();
    inputStream.read(storeData);
    inputStream.close();

    createFile(storeData); // this takes the byte array and creates a file with it
} catch (IOException e) {
    System.out.println("Cannot open url connection: " + e);
} 

那么,我的InputStream是否提前结束?如果是这样,我该如何防止这种情况发生?否则,出了什么问题?

1 个答案:

答案 0 :(得分:1)

Javadoc中没有任何地方声明import React, {Component, PropTypes} from 'react'; import ReactDOM from 'react-dom'; function getFormInputs() { const {queryParams} = this.props; if (queryParams === undefined) { return null; } return Object.keys(queryParams).map((name, index) => { return ( <input key={index} name={name} type="hidden" value={queryParams[name]} /> ); }); } export default class FileDownload extends Component { static propTypes = { actionPath: PropTypes.string.isRequired, method: PropTypes.string, onDownloadComplete: PropTypes.func.isRequired, queryParams: PropTypes.object }; static defaultProps = { method: 'GET' }; componentDidMount() { ReactDOM.findDOMNode(this).submit(); this.props.onDownloadComplete(); } render() { const {actionPath, method} = this.props; return ( <form action={actionPath} className="hidden" method={method} > {getFormInputs.call(this)} </form> ); } } 填充缓冲区。  它会阻塞,直到至少有一个字节的数据可用,然后传输任何可用的数据,并返回传输的字节数。

你必须循环。或者使用InputStreamread(byte[])

注意:不要在课后为变量命名,也不要用大写字母开头。对于课程而言。