当前位置: 首页 > 面试题库 >

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

徐弘图
2023-03-14
问题内容

我想通过读取文件的第一部分并分析内容来确定文件的类型(通常为UTF-8)。(该类型特定于我的社区,但不受我的控制,并且不受MIME /
MediaType覆盖,通常为TEXT_PLAIN)。我正在客户端上使用’org.restlet’库来分析标头

Request request = new Request(Method.HEAD, url);

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

澄清:我无法使用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;
}

问题答案:

仅当服务器已将Accept- RangesContent- Range标头与ETagor
一起发送时,才有可能Last- Modified。例如

Accept-Ranges: bytes
Content-Range: bytes 0-1233/1234
ETag: file.ext_1234_1234567890

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

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

If-Range: file.ext_1234_1234567890
Range: bytes=0-99

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



 类似资料:
  • 问题内容: 我只想读取文本文件的第一行并将该第一行放在字符串数组中。 这就是我所拥有的,但是它读取了整个文件。 myTextFile中的ex文本: 问题答案: 如果我了解你,那

  • 我使用OpenCSV进行CSV文件的读写。在I hsd安装早期版本的Java(即Java 6)之前,它工作得很好。安装完之后,我的代码就停止工作了: 线程“main”java.lang.UnsupportedClassVersionError:COM/OpenCSV/CSVReader:不支持Major.Minor版本51.0在java.lang.ClassLoader.DefineClass1(

  • 导语 XML(ExtensibleMarkup Language,可扩展标记语言),是一种类似于HTML的标记语言,但它的设计目的是用来传输数据,而不是显示数据。XML的标签没有被预定义,用户需要在使用时自行进行定义。XML是W3C(万维网联盟)的推荐标准。相对于数据库表格的二维表示,XML使用的树形结构更能表现出数据的包含关系,作为一种文本文件格式,XML简单明了的特性使得它在信息存储和描述领域

  • 因此,我一直在使用Python3.2和OpenPyXL的iterable工作簿,如这里的“优化阅读器”示例所示。 当我尝试使用此策略读取从简单文档中提取的一个或多个文件时,就会出现问题。zip存档(手动和通过python zipfile包)。当我调用我得到“A”和我得到1,当要求打印每个单元格的值时,如下所示: 它打印A1、A2、A3、A4、A5、A6和A7中的值,而不管文件实际有多大。文件本身没

  • 问题内容: 我如何阅读像android app中的文本文件: 所以我可以返回一个字符串,如: 我想到的是(伪代码): 问题答案: 试试这个

  • 问题内容: 我在使用BufferedReader时遇到问题 我想打印一个文本文件的6行: 现在,从每次调用readLine()方法可以收集到的信息开始,它都会自动前进到下一行。 所以我不能使用条件br.readLine()!= null,因为它已经将其前进了一行,并且我得到了输出: 我使用什么条件来检查文本字段中是否还有新行。 提前致谢! 问题答案: 这就是问题: 您有两次调用-第一个 仅 检查是