我有一个函数,可以从文件列表中创建一个Zip文件。是否可以在不保存在磁盘上的情况下返回Zip文件?我需要这个文件,因为我必须使用zip文件作为另一个函数的参数。我不确定ByteStream是否适合我。
public File compressFileList(List<File> fileList,String fileName) {
FileOutputStream fileOutputStream=null;
ZipOutputStream zipOutputStream=null;
FileInputStream fileInputStream=null;
String compressedFileName=fileName +".zip";
if(fileList.isEmpty())
return null;
try
{
fileOutputStream = new FileOutputStream(compressedFileName);
zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream));
for (File file: fileList) {
fileInputStream = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
byte[] tmp = new byte[4*1024];
int size = 0;
while((size = fileInputStream.read(tmp)) != -1){
zipOutputStream.write(tmp, 0, size);
}
zipOutputStream.flush();
fileInputStream.close();
}
zipOutputStream.close();
return compressedFile; //This is what I am missing
}
catch (FileNotFoundException e)
{
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
编辑:添加用例
其想法是创建一个zip文件,并使用Watson的VisualRecognition服务的CreateClassifications方法。
classifierOptions = new CreateClassifierOptions.Builder()
.classifierName("Santa")
.addClass("Santa", new File("C:\\app\\GitRepo\\images\\beagle.zip"))
.negativeExamples(new File("C:\\app\\GitRepo\\images\\nosport.zip"))
.build();
构建器接受zip文件作为参数。
理解
根据Alexandre Dupriez的解释,我认为最好将文件存储在硬盘上的某个位置。
public void compressFileList(List<File> fileList, OutputStream outputStream)
throws IOException {
try (ZipOutputStream zipOutputStream =
new ZipOutputStream(new BufferedOutputStream(outputStream));
for (File file: fileList) {
try (FileInputStream fileInputStream = new FileInputStream(file)) {
ZipEntry zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
byte[] tmp = new byte[4*1024];
int size = 0;
while((size = fileInputStream.read(tmp)) != -1){
zipOutputStream.write(tmp, 0, size);
}
zipOutputStream.flush();
} catch (FileNotFoundException e) { // Maybe skip not found files.
Logger.log(Level.INFO, "File not found {}", file.getPath());
}
}
}
}
使用方法:
if (fileList.isEmpty()) {
...
return;
}
try {
compressFileList(fileList, servletRequest.getOutputStream())) {
} catch (FileNotFoundException e) {
...
} catch (IOException e) {
...
}
您应该能够使用ByteArrayOutputStream
而不是FileOutputStream
:
zipOutputStream = new ZipOutputStream(new ByteArrayOutputStream());
这里的困难是向使用zip文件的方法提供File
。java.io.File
不提供允许您操作内存中文件的抽象。
java。伊奥。文件
abstraction和java。伊奥。FileInputStream
实现
为了简化,如果我们必须将文件
抽象化,我们会将其视为URI
。因此,为了能够构建内存中的文件
,或者至少模拟它,我们需要提供一个URI
,然后文件
的使用者将使用它来读取其内容。
如果我们查看消费者可能使用的FileInputStream
,我们可以看到它总是以一个本机调用结束,这使我们能够为内存中的文件抽象出文件系统
:
// class java.io.FileInputStream
/**
* Opens the specified file for reading.
* @param name the name of the file
*/
private native void open0(String name) throws FileNotFoundException;
如果有可能让消费者接受输入流
,这会更容易,但从你的问题陈述来看,我想这是不可能的。
API调用
您的要求是向Watson Visual API提供一个文件
。你能提供你需要调用的API方法吗?
我使用Springboot,我想生成zip文件,然后返回前端。
问题内容: 我正在尝试创建一个简单的Java程序,该程序从zip文件中的文件读取和提取内容。压缩文件包含3个文件(txt,pdf,docx)。我需要阅读所有这些文件的内容,并且为此使用了Apache Tika。 有人可以帮我实现此功能。到目前为止,我已经尝试过了,但是没有成功 代码段 问题答案: 如果你想知道如何从每个文件中获取文件内容,ZipEntry那实际上很简单。这是一个示例代码: 一旦拥有
问题内容: 近我很惊讶地发现,在Java的finally块中可能有一个return语句。 似乎很多人都认为这是一件坏事,如“ 不要在finally子句中返回”中所述。更深入地研究,我还发现“ Java的回报并不总是 ”,这在finally块中显示了其他类型的流控制的一些非常可怕的示例。 因此,我的问题是,谁能给我一个示例,其中finally块中的return语句(或其他流控制)产生更好/更具可读性
问题内容: 我试图将一些for-each循环更改为lambda- 方法,以发现lambda表达式的可能性。以下似乎是可能的: 带lambda 但是下一个无效: 带lambda 最后一行的语法是否有问题,或者不可能从方法中返回? 问题答案: 在那里,从λ表达式,而不是从包含方法返回。而不需要流: 这里将流限制为与谓词匹配的那些项,然后返回带有第一个匹配条目的。 这看起来不如for循环方法有效,但实际
我有一个API,它使用archiver模块创建一个zip文件,我想在其中将zip作为响应传递回客户端并下载它。 这就是我创建zip的API的样子: 这里还有另一个API供参考,它展示了我是如何习惯于将数据发送回客户端的: 如何将zip作为响应发送回并在客户端将其下载到磁盘?
我试图在ZIP文件内创建一个ZIP文件,以重新构建以前在内存中的zip结构,我在Java。 我失败了,因为我得到了一个错误的内部ZIP内创建的初始ZIP文件。文件已损坏。当试图打开它时,我得到一个“文件的意外结局”。 我得到了这个结构: -input.zip--InnerInput.zip 代码使用java Stack和Map在内存中解压。然后它创建input2.zip,内部nput.zip。 总