使用Java写文件到远程目录是否可行?

4

我已经将该目录映射到我的计算机上,因此可以通过Windows资源管理器浏览和写入它。我想通过Java编写文件。

File f = new File("http://dev1:8080/data/xml/myTestFile123.xml");

f.createNewFile();

我遇到了以下错误:
Exception in thread "main" java.io.IOException: The filename, directory name, or volume label syntax is incorrect
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(Unknown Source)
    at MainTest.createTestFile(MainTest.java:156)
    at MainTest.main(MainTest.java:72)

有没有办法将文件写入带有http://前缀的映射目录中?因为这是提供给我的目录方式。这是一个由Oracle数据库创建的虚拟目录。

6
你不能将HTTP链接强行塞入文件对象中,它们是两个完全不同的东西。 - skaffman
@joe,你的文件位于dev1:8080/data/lo/xml,这强烈暗示你是通过网站查看目录列表。你无法通过http写入文件。你可以上传它们,但另一端需要配置以接收和保存它们,它不仅仅是一个开放的文件存储,就像你硬盘上的目录一样。 - Yishai
这是一个Oracle数据库提供的虚拟目录。 - joe
Windows Explorer是否了解WebDAV?也许他指的是“Internet Explorer”?这样会突然少了很多混淆... - DigitalRoss
@digitalross:实际上,微软Windows的WebDAV客户端实现甚至有一个名字:Web Folders。在Windows上,使用Windows资源管理器来访问WebDAV(虽然这是一个糟糕的客户端)。您可以查看“Oracle XML DB Repository”链接的截图,以了解它的外观。 - Pascal Thivent
显示剩余3条评论
6个回答

4
我的理解是您正在尝试写入Oracle XML DB Repository。Oracle XML DB存储库是由Oracle9i Database Release 2引入的用于XML存储的功能,可以通过FTP或HTTP / WebDAV访问。在您的情况下,看起来您正在尝试使用HTTP / WebDAV。
正如维基百科上WebDAV页面所解释的那样:

WebDAV是HTTP的一组扩展,允许用户在远程万维网服务器上协作编辑和管理文件。

换句话说,在WebDAV存储库中添加文件、删除文件、重命名文件等操作都是使用HTTP命令完成的:PUT、DELETE、MOVE等(有关更多详细信息,请参见RFC 4918)。
因此,可以使用java.net类与WebDAV服务器进行交互。

或者您可以使用像Jakarta Commons HttpClient这样的高级API。

或者您可以使用Java WebDAV客户端,例如由Slide项目提供的客户端。这篇文章展示了如何操作,看起来很简单。然而,由于Slide项目已经停止维护,我不建议使用它。

幸运的是(或不幸的是),Apache Jackrabbit项目是Slide的替代品... 但据我所知,Jackrabbit中WebDAV支持更多地集中在服务器端实现而非客户端。无论如何,在jackrabbit-users邮件列表的此线程中您将找到一些代码示例。

我会选择HttpClient,并使用TutorialSample Code作为起点。

3

不要尝试使用映射的驱动器号(看起来很弱),请查看JCIFS

JCIFS是一个开源客户端库,完全用Java实现了CIFS/SMB网络协议。 CIFS是Microsoft Windows平台上的标准文件共享协议(例如Map Network Drive…)。该客户端在大型Intranet上被广泛应用于生产中。

此代码片段展示了如何登录远程计算机并使用jCifs编写文件(由Muneeb Ahmad提供):

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

public class Logon {
    public static void main( String argv[] ) throws Exception {
        String user = "user:password";
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
        String path = "smb://my_machine_name/D/MyDev/test.txt";
        SmbFile sFile = new SmbFile(path, auth);
        SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
        sfos.write("Muneeb Ahmad".getBytes());
        System.out.println("Done");
    }
}

编辑:如原问题中的评论所述,我现在了解到您正在尝试写入WebDAV目录。为了更清晰地讲解WebDAV主题,我将在另一个答案中涵盖它。


谢谢,这可能有所帮助,尽管我仍然需要找到一种使用http://的方法。那么,smb是什么:我是否必须映射驱动器? - joe
1
不需要在其中添加http://。HTTP不是用于处理远程文件系统的协议。SMB是一种不同的协议,专门用于处理远程文件系统,并且Pascal正在告诉您如何使用它。 - jprete
我的远程目录是由 Oracle 数据库创建的虚拟目录,它并不存在。 - joe

3

我不太确定自己在说什么(不是Java专家),但是尽管你可能已经“映射”了它,但你传递的是一个URL而不是期望的文件系统路径。如果(例如)在Windows下有一个映射的驱动器,请使用分配的驱动器字母。


我无法通过一个字母驱动器访问它,我必须使用dev1:8080/data/lo/xml。 - joe

3
您尝试通过协议传递位置URI。您需要传递没有协议的位置:

\\dev1\data\xml\myTestFile123.xml


我只能将其映射为dev1:8080/data/lo/xml。 - joe
如果你在获取URI的正确字符串方面遇到问题,那么我建议你导航到资源管理器中的文件,然后复制地址栏中的目录。 - Greg Buehler

1
你是如何在Windows中映射文件的?我怀疑它不是使用HTTP协议,因为没有这样的机制来创建文件。所以,如果你使用“http”作为协议,你将无法得到任何结果。
找到映射的驱动器号,你可能需要像下面这样做:
File f = new File("F:\\dir\\file.ext");

如果您正在使用Samba,您可能想看一下JCIFS,然后可以使用:

smb://server/share/

0

使用本地路径

如果您可以在Windows资源管理器中看到myTestFile123.xml,请右键单击它并复制位置:属性值。然后将其完全作为新的File()参数使用,但要么加倍反斜杠,要么将其更改为正斜杠。


哦...你说的“Windows资源管理器”实际上是指“Internet Explorer”? - DigitalRoss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接