使用HTTP读取文件的第一部分

pet*_*ust 4 java http restlet

我想通过阅读文件的第一部分并分析内容来确定文件的类型(通常是UTF-8).(该类型特定于我的社区,但不在我的控制之下,并且不包含在MIME/MediaType中,通常是TEXT_PLAIN).我正在使用客户端上的'org.restlet'库来分析标头

Request request = new Request(Method.HEAD, url);
Run Code Online (Sandbox Code Playgroud)

所以我知道内容长度,并且可以(如果必要和可能)估计我应该为分析下载多少字节

澄清:我无法使用MediaType.从答案1看起来我必须得到内容.因此,修订后的问题是:

"我可以使用Restlet 获取文件的一部分吗?"

答案:以下代码可以满足我的需求.我已经将@BalusC归功于这种方式.如果我错过了任何内容,请评论:

public String readFirstChunk(String urlString, int byteCount) {
    String text = null;
    if (urlString != null) {
        org.restlet.Client restletClient = new org.restlet.Client(Protocol.HTTP);
        Request request = new Request(Method.GET, urlString);
        List<Range> ranges = Collections.singletonList(new Range(0, byteCount));
        request.setRanges(ranges);
        Response response = restletClient.handle(request);
        if (Status.SUCCESS_OK.equals(response.getStatus())) {
            text = processSuccessfulChunkRequest(response);
        } else if (Status.SUCCESS_PARTIAL_CONTENT .equals(response.getStatus())) {
            text = processSuccessfulChunkRequest(response);
        } else {
            System.err.println("FAILED "+response.getStatus());
        }
    }
    return text;
}

private String processSuccessfulChunkRequest(Response response) {
    String text = null;
    try {
        text = response.getEntity().getText();
    } catch (IOException e) {
        throw new RuntimeException("Cannot download chunk", e);
    }
    return text;
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 6

这只是可能的,如果服务器发送Accept-RangesContent-Range头部沿ETagLast-Modified.例如

Accept-Ranges: bytes
Content-Range: bytes 0-1233/1234
ETag: file.ext_1234_1234567890
Run Code Online (Sandbox Code Playgroud)

Accept-Ranges: bytes表示服务器支持返回在指定的字节范围的部分内容的请求.的Content-Range报头通知有关的长度.在ETagLast-Modified指示唯一的文件idenfier或请求URI背后的资源最后一次修改的时间戳.

如果响应中存在这些标头,则可以使用If-RangeRange请求标头分别使用唯一文件标识符或上次修改的时间戳和所需的字节范围来请求资源的一部分.

If-Range: file.ext_1234_1234567890
Range: bytes=0-99
Run Code Online (Sandbox Code Playgroud)

上面的示例返回文件的前100个字节.