Можно ли записывать файлы в удаленный каталог с помощью Java? - PullRequest
4 голосов
/ 10 сентября 2009

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

4 голосов
/ 10 сентября 2009

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

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

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

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

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

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

3 голосов
/ 10 сентября 2009

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

3 голосов
/ 10 сентября 2009

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

\\ dev1 \ Data \ XML \ myTestFile123.xml

3 голосов
/ 10 сентября 2009

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

1 голос
/ 10 сентября 2009

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

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

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

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

smb://server/share/
0 голосов
/ 10 сентября 2009

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

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

...