我正在尝试使用网络资源中的Jersey下载SWF文件。
我编写了以下代码,但无法正确保存文件:
Response response = webResource.request(MediaType.APPLICATION_OCTET_STREAM)
.cookie(cookie)
.post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE));
String binarySWF = response.readEntity(String.class);
byte[] SWFByteArray = binarySWF.getBytes();
FileOutputStream fos = new FileOutputStream(new File("myfile.swf"));
fos.write(SWFByteArray);
fos.flush();
fos.close();
保存以假设响应确实返回SWF文件,因为response.getMediaType
返回application/x-shockwave-flash
。
然而,当我尝试打开SWF时,没有任何事情发生(也没有错误),这表明我的文件不是从响应中创建的。
答案 0 :(得分:6)
我终于开始工作了。
我想通过阅读Jersey API,我可以直接使用getEntity
来检索response
的InputStream(假设它尚未被读取)。
使用getEntity
检索从InputStream
创建字节数组的IOUtils#toByteArray
和InputStream
,我设法让它工作:
Response response = webResource.request(MediaType.APPLICATION_OCTET_STREAM)
.cookie(cookie)
.post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE));
InputStream input = (InputStream)response.getEntity();
byte[] SWFByteArray = IOUtils.toByteArray(input);
FileOutputStream fos = new FileOutputStream(new File("myfile.swf"));
fos.write(SWFByteArray);
fos.flush();
fos.close();
请注意IOUtils是一个常见的Apache函数。
答案 1 :(得分:6)
从Java 7开始,您还可以使用新的NIO API将输入流写入文件:
InputStream is = response.readEntity(InputStream.class)
Files.copy(is, new File(...).toPath());
答案 2 :(得分:1)
我认为你根本不应该通过一个字符串。
如果响应确实是SWF文件(二进制数据),那么这里:
String binarySWF = response.readEntity(String.class);
代替此代码(读取字符串),只需尝试阅读
一个字节数组。看看它是否有帮助。字符串与编码有关
可能会让事情变得混乱。