InputStream为空? openStream的原因?

时间:2016-07-14 17:21:47

标签: java io jclouds rackspace-cloudfiles

所以我使用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();
        }

1 个答案:

答案 0 :(得分:0)

好的,对于有这个问题的人来说,解决方案就是当我制作代码时:

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

这并不能获得实际的对象,只是一个对象列表,然后你得到了这个名字。要解决我的问题并使用其名称获取对象,请保留上面的代码,但添加:

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

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