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 数据库正在创建的虚拟目录。

4

6 回答 6

4

我的理解是您正在尝试写入Oracle XML DB Repository。Oracle XML DB Repository 是 Oracle9i Database Release 2 为 XML 存储引入的一个特性,可以通过 FTP 或 HTTP/WebDAV 访问。在您的情况下,您似乎正在尝试使用 HTTP/WebDAV。

正如 Wikipedia 上的WedDAV页面所述:

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

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

因此,与 WebDAV 服务器的交互可以使用java.net.

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

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

幸运的是(或不是),Apache Jackrabbit项目是 Slide 的替代品......但 AFAIK Jackrabbit 中的 WebDAV 支持更侧重于服务器端实现而不是客户端。不管怎样,你会在 jackrabbit-users 邮件列表的这个线程中找到一些代码示例。

我想我会选择 HttpClient 并使用教程示例代码作为起点。

于 2009-09-10T10:23:27.267 回答
3

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

于 2009-09-09T20:14:40.440 回答
3

您尝试使用协议传递位置 URI。您需要通过 location sans 协议:

\\dev1\data\xml\myTestFile123.xml

于 2009-09-09T20:21:32.143 回答
3

与其尝试使用映射的驱动器号(似乎很弱),不如看看JCIFS

JCIFS 是一个开源客户端库,它以 100% 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 主题。

于 2009-09-09T20:28:59.160 回答
1

你是如何在 Windows 中映射文件的?我怀疑它没有使用 HTTP 协议,因为不存在用于创建文件的这种机制。因此,使用“http”作为协议,您将无处可去。

找到映射的驱动器号,您可能想要更多类似的东西:

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

如果您使用的是 Samba,您可能想看看JCIFS ,那么您可以使用:

smb://server/share/
于 2009-09-09T20:22:30.113 回答
0

使用本地路径

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

于 2009-09-09T20:23:51.647 回答