【问题标题】:Is it possible to write files to a remote directory using java?是否可以使用 java 将文件写入远程目录?
【发布时间】:2009-09-09 20:12:22
【问题描述】:

我在我的机器上映射了目录,以便我可以通过 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 数据库正在创建的虚拟目录。

【问题讨论】:

  • 您不能将 HTTP URL 硬塞到 File 对象中。它们是完全不同的两件事。
  • 那么我如何将文件正确地放到这个驱动器上呢?
  • @joe,您的文件位于 dev1:8080/data/lo/xml 的事实强烈表明您正在通过网站查看目录列表。您不能通过 http 写入文件。您可以上传它们,但需要配置另一端的东西来接收和保存它们,它不仅仅是一个打开的文件存储,就像您硬盘上的一个目录。
  • @joe:您是要写入网络共享​​>还是webdav服务器?我开始认为您正在尝试写入 webdav 目录...
  • oracle数据库提供的虚拟目录

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


【解决方案1】:

我的理解是您正在尝试写信给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 客户端。这个article 展示了如何做到这一点,它看起来很简单。但是,由于 Slide 项目现已退役,我不推荐它。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我无法通过盘符访问它我必须使用 dev1:8080/data/lo/xml
    【解决方案3】:

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

    \\dev1\data\xml\myTestFile123.xml

    【讨论】:

    • 我只能映射它,所以它说 dev1:8080/data/lo/xml
    • 如果您在获取正确的 URI 字符串时遇到问题,那么我将导航到资源管理器中的文件,然后将目录复制到地址栏中。
    【解决方案4】:

    不要尝试使用映射的驱动器号(似乎很弱),看看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 主题。

    【讨论】:

    • 谢谢,这可能会有所帮助,尽管我仍然需要找到一种使用 http:// 的方法无论如何.. smb 是什么:我必须映射驱动器吗?
    • 您不必在其中包含 http://。 HTTP 不是用于处理远程文件系统的协议。 SMB 是一种不同的协议,专为处理远程文件系统而设计,也是 Pascal 告诉您如何使用的协议。
    • 嗯,我的远程目录是一个由oracle数据库创建的虚拟目录,它实际上并不存在。
    【解决方案5】:

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

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

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

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

    smb://server/share/
    

    【讨论】:

      【解决方案6】:

      使用本地路径

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

      【讨论】:

      • 哦……当你说“windows explorer”时,你真的是指“internet explorer”吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2020-10-12
      • 2014-01-27
      • 1970-01-01
      相关资源
      最近更新 更多