Можно ли записывать файлы в удаленный каталог с помощью Java?

StackOverflow https://stackoverflow.com/questions/1401826

Вопрос

У меня есть каталог, сопоставленный с моим компьютером, так что я могу просматривать его и писать в него через проводник 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.

Это было полезно?

Решение

Насколько я понимаю, вы пытаетесь написать в 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 для получения более подробной информации.

Следовательно, взаимодействие с сервером WebDAV может осуществляться с использованием классов из java.net .

Или вы можете использовать API более высокого уровня, например Jakarta Commons HttpClient .

Или вы можете использовать клиент Java WebDAV, например, предоставленный проектом Slide . Эта статья показывает, как это сделать, и выглядит просто. Однако, поскольку проект Slide сейчас удален, я бы его не рекомендовал.

К счастью (или нет), проект Apache Jackrabbit является альтернативой Slide ... но AFAIK поддержка WebDAV в Jackrabbit больше ориентирована на реализации на стороне сервера, чем на клиентов. В любом случае вы найдете несколько примеров кода в этой теме в список рассылки пользователей jackrabbit.

Я думаю, что выбрал бы HttpClient и использовал бы учебник или пример кода в качестве отправных точек.

Другие советы

Я не совсем уверен, о чем я здесь говорю (не парень из Java), но хотя вы можете «сопоставить это», вы передаете URL-адрес вместо ожидаемого пути к файловой системе.Если (например) у вас есть подключенный диск в Windows, используйте назначенную букву диска.

Вы пытаетесь передать URI местоположения с помощью протокола.Вам необходимо передать протокол без определения местоположения:

\\dev1\data\xml\myTestFile123.xml

Вместо того чтобы пытаться использовать букву подключенного диска (кажется очень слабой), взгляните на JCIFS

  

JCIFS - это клиентская библиотека с открытым исходным кодом, которая реализует сетевой протокол CIFS / SMB на 100% Java. 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 в другом ответе для большей ясности.

Как вы сопоставили файл в Windows? Я подозреваю, что он не использует протокол HTTP, потому что не существует такого механизма для создания файлов. Так что вы никуда не денетесь, используя " http " как ваш протокол.

Найдите букву подключенного диска, возможно, вы хотите что-то более похожее:

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

Если вы используете Samba, вы можете взглянуть на JCIFS , тогда вы можете использовать:

smb://server/share/

Используйте локальный путь

Если вы видите myTestFile123.xml в проводнике Windows, щелкните его правой кнопкой мыши и скопируйте значение свойства Location: . Затем используйте именно это в качестве нового аргумента File (), но либо удвоите обратную косую черту, либо измените ее на прямую косую черту.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top