【问题标题】:InputStream empty? openStream the cause?输入流为空? openStream 的原因?
【发布时间】:2016-07-14 17:21:47
【问题描述】:

所以我使用 Java SDK 解决方案将 CloudFiles 下载到本地主机:here

我能够找到一个测试容器,列出其中的内容并访问/写入文件。但是当我写它们时,它们没有原始文件中的任何数据。它们只是外壳(0KB)。它们不是大文件,当我调用方法openStream() 来创建InputStream 时,我似乎遇到了问题...我在其上调用read(),它立即返回-1,表明它已经到来到文件末尾...不知道为什么。这里有一些代码可以帮助解释:

ObjectList object = objectApi.list();
    for (int x = 0; x < testContainer.getObjectCount(); x++){
        SwiftObject object2 = object.get(x);

        InputStream inputStream = object2.getPayload().openStream();
        System.out.println(inputStream.read()); <-- giving me -1
        System.out.println(inputStream.available()); <-- giving me 0
        String objectName = object2.getName();
        System.out.println(objectName);
}

这只是错误检查。一切似乎都可以与我的 TestContainer 一起使用......它会显示我创建时以及其中的所有文件夹/文件:

Payload pl = object2.getPayload();

System.out.println(pl.getMetaData());

它告诉我 contentLength 匹配(几乎匹配)文件的大小...所以我认为我的 SwiftObject 使用object.get(x)...构建得很好。

不知道为什么我在调用 read() 时返回零字节,但是......似乎 .openStream 不起作用......非常感谢任何帮助!

以防万一我的其他代码有问题,这里是:

InputStream inputStream = object2.getPayload().openStream();
        String objectName = object2.getName();
        System.out.println(objectName);
        if (objectName.contains(".")){
            File newFile = new File("C:\\Users\\-----\\temp\\" + objectName);
            newFile.getParentFile().mkdirs();
            FileOutputStream outputStream = new FileOutputStream(newFile);
            byte[] aByte = IOUtils.toByteArray(inputStream);
            IOUtils.write(aByte, outputStream); //also tried IOUtils.copy(inputStream, outputStream);
            inputStream.close();
            outputStream.close();
        }

【问题讨论】:

  • 你的 jclouds 版本是多少?您是否尝试过使用 curl 等其他工具来复制失败?

标签: java io jclouds rackspace-cloudfiles


【解决方案1】:

好的,所以对于遇到此问题的任何人,解决方案是在我编写代码时:

ObjectList object = objectApi.list();
for (int x = 0; x <testContainer.getObjectCount(); x++){
SwiftObject object2 = object.get(x);

这并没有得到实际的对象,只是一个对象列表,从中你可以得到名称。要解决我的问题并获取具有名称的对象,请保留上面的代码但添加:

SwiftObject realObject = object.get(Object2.getName())

这将为您提供 ACTUAL 对象。从那里继续。希望这对其他人有所帮助....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2017-10-04
    • 2019-06-27
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多