我的Java应用程序需要访问保存在远程共享文件夹中的大型excel文件(大小为1GB +).我正在使用SmbFile来获取带有身份验证的文件.
注意:下载文件不是主要用于大小原因的选项.
问题是我需要excel文件是Java IO文件而不是SmbFile,因为我用来解析excel 的其他库只接受Java IO文件.
查看库的实现细节:
该库将采用提供的InputStream并将其输出到文件系统.(...)创建文件后,它将从文件系统流入内存.
需要以这种方式输出流的原因与ZIP文件的工作方式有关.由于XLSX文件格式基本上是ZIP文件,因此无法在不读取整个InputStream的情况下找到所有条目.
(...)此库通过将流读出到临时文件中来工作.作为自动关闭操作的一部分,将删除临时文件.
如果您需要更多地控制文件的创建/处理方式,可以选择使用a初始化库
java.io.File.此文件不会被写入或删除
因此,如果您使用File或InputStreamAPI 无关紧要- 无论如何都需要下载整个文件.
最简单的解决方案是传递SmbFile.getInputStream()给
StreamingReader.builder().read(smbFile.getInputStream())
Run Code Online (Sandbox Code Playgroud)
但也可以先下载文件,例如.通过IOUtils.copy()或Files.copy()
File file = new File("...");
try (
in = smbFile.getInputStream();
out = new FileOutputStream(file)
) {
IOUtils.copy(in, out);
}
Run Code Online (Sandbox Code Playgroud)
要么
try (in = smbFile.getInputStream()) {
Files.copy(smbFile.getInputStream(), file.toPath());
}
Run Code Online (Sandbox Code Playgroud)
并传递file给
StreamingReader.builder().read(file)
Run Code Online (Sandbox Code Playgroud)