如何在受用户名和密码保护的远程位置创建和写入 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
代码有什么问题。
我必须创建一个 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
代码有什么问题。