是否可以使用java将文件写入远程目录?

时间:2009-09-09 20:12:23

标签: java webdav oracle-xml-db-repository

我的目录映射在我的机器上,以便我可以通过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 个答案:

答案 0 :(得分:4)

我的理解是你正试图写信给Oracle XML DB Repository。 Oracle XML DB Repository是Oracle9i Database Release 2为XML存储引入的一项功能,可以通过FTP或HTTP / WebDAV访问。在您的情况下,看起来您正在尝试使用HTTP / WebDAV。

如维基百科上的WedDAV页面所述:

  

WedDAV是一组扩展   允许用户编辑的HTTP顶部   协作管理文件   远程万维网服务器。

换句话说,在WebDAV存储库中添加文件,删除文件,重命名等等都是使用HTTP词语:PUT,DELETE,MOVE等完成的(有关详细信息,请参阅RFC 4918)。

因此,可以使用java.net中的类来完成与WebDAV服务器的交互。

或者您可以使用更高级别的API,例如Jakarta Commons HttpClient

或者您可以使用类似Slide项目提供的Java WebDAV客户端。这个article显示了如何做到这一点,看起来很简单。但是,由于Slide项目现已退役,我不推荐它。

幸运(或不),Apache Jackrabbit项目是Slide的替代项目......但是AFAIK在Jackrabbit中的WebDAV支持更侧重于服务器端实现而不是客户端。无论如何,你会在jackrabbit-users邮件列表的this thread中找到一些代码示例。

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

答案 1 :(得分:3)

我不太确定我在这里谈论的是什么(不是Java人)但是你可能“已经映射”了,你传递的是URL而不是预期的文件系统路径。如果(例如)您在Windows下有映射驱动器,请使用分配的驱动器号。

答案 2 :(得分:3)

您尝试使用协议传递位置URI。您需要传递位置无协议:

  

\\ DEV1 \数据\ XML \ myTestFile123.xml

答案 3 :(得分:3)

不要尝试使用映射的驱动器号(看起来非常弱),而是查看JCIFS

  

JCIFS是一个开源客户端库,它以100%Java实现CIFS / SMB网络协议。 CIFS是Microsoft Windows平台上的标准文件共享协议(例如Map Network Drive ...)。该客户广泛用于大型内联网的生产。

这段代码展示了如何使用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主题。

答案 4 :(得分:1)

您是如何在Windows中映射文件的?我怀疑它没有使用HTTP协议,因为没有这样的机制来创建文件。所以你不会使用“http”作为你的协议。

找到映射的驱动器号,您可能需要更多类似的内容:

File f = new File("F:\\dir\\file.ext");

如果您使用Samba,可能需要查看JCIFS,然后您可以使用:

smb://server/share/

答案 5 :(得分:0)

使用本地路径

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