如何在受用户名和密码保护的远程位置创建和写入 CSV 文件?

How can I create and write to a CSV file in a remote, username and password protected location?

我必须创建一个 CSV 文件并用一些数据填充,然后将其放入客户端计算机上受用户名和密码保护的远程位置。我正在使用 apache-commons CSVPrinter 来写入文件。一个预定的作业写入文件,但我似乎无法通过身份验证过程。

UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password);
FileSystemOptions opts = new FileSystemOptions();

DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo = VFS.getManager().resolveFile(exportLocation + fileName, opts);

BufferedWriter writer = Files.newBufferedWriter(Paths.get(fo.getURL().getPath()), StandardCharsets.UTF_8);

CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withDelimiter(';'));

我得到一个 java.nio.file.AccessDeniedException 上面的代码。谁能告诉我如何处理这个问题,并告诉我我做错了什么?

************************************************ ******* 编辑 ********************************* ************************

我已将代码更新为:

UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password);
FileSystemOptions opts = new FileSystemOptions();

DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo = VFS.getManager().resolveFile(exportLocation + fileName, opts);
FileContent fileContent = fo.getContent();

CSVPrinter csvPrinter = new CSVPrinter((Appendable) fileContent.getOutputStream(),
                    CSVFormat.DEFAULT.withDelimiter(';'));

我去掉了 BufferedWriter 并将其替换为 FileContent 实例。现在我得到 org.apache.commons.vfs2.FileSystemException: Could not write to "file:////*PATH*/*TO*/*CSV_FILE*.csv".

现在,我的 .csv 文件路径包含开头的两个反斜杠,因为如果我删除它们,行 FileObject fo = VFS.getManager().resolveFile(exportLocation + fileName, opts); 将产生以下异常:org.apache.commons.vfs2.FileSystemException: Could not find file with URI "*PATH*\*TO*\*CSV_FILE*.csv" because it is a relative path, and no base URI was provided. 自然地,发生这种情况是因为两个反斜杠指向文件夹中的文件而不是 URI。

我现在的问题是:如何保留所需行的反斜杠,并在写入此行中的文件时将其删除:CSVPrinter csvPrinter = new CSVPrinter((Appendable) fileContent.getOutputStream(), CSVFormat.DEFAULT.withDelimiter(';'));?

另外,我现在可以看出最后一个异常是由以下原因引起的:java.io.FileNotFoundException: *PATH*\*TO*\*CSV_FILE*.csv (Access is denied) 也就是说我还是没能通过认证

好吧,我已经放弃了这种方法,所以我尝试使用 jcifs,并且成功了。

CIFSContext base = SingletonContext.getInstance();
CIFSContext authed1 = base.withCredentials(new NtlmPasswordAuthenticator(domain, userName, password));

SmbFile sFile = new SmbFile("smb://" + exportLocation + fileName, authed1);
SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
OutputStreamWriter out = new OutputStreamWriter(sfos);

CSVPrinter csvPrinter = new CSVPrinter(out, CSVFormat.DEFAULT.withDelimiter(';'));

抱歉,我无法弄清楚我的 apache-commons-vfs 代码有什么问题。