2016-07-14 121 views
0

所以我使用Java SDK解决方案CloudFiles下载到本地主机:hereInputStream为空? openStream的原因是什么?

我能够找到一个测试容器,列出其中的内容和访问/写文件。但是当我写他们时,他们没有来自原始文件的任何数据。他们只是外壳(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不工作...任何帮助非常赞赏ED!

和公正的情况下,以某种方式与我的其他代码的问题,这里要说的是:

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(); 
     } 
+0

什么是你的jclouds版本?您是否尝试用卷曲等不同工具复制失败? – zacksh

回答

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对象。从那里继续。希望这有助于其他人......

相关问题