如何从泽西响应中保存文件?

我试图从Web资源使用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时,没有任何事情发生(也没有错误),这表明我的文件不是从响应中创建的。

我终于得到了它的工作。

我想通过读取Jersey API,我可以直接使用getEntity来检索response的InputStream(假设它尚未被读取)。

使用getEntity检索InputStreamIOUtils#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函数。

从Java 7开始,您还可以使用新的NIO API将输入流写入文件:

 InputStream is = response.readEntity(InputStream.class) Files.copy(is, new File(...).toPath()); 

我想你根本不应该经历一个字符串。

如果响应确实是SWF文件(二进制数据),那么这里:

 String binarySWF = response.readEntity(String.class); 

而不是这个代码(读取字符串),只是尝试阅读
一个字节数组。 看看它是否有帮助。 字符串与编码有关
并且可能会让事情变得混乱。