Можно ли записывать файлы в удаленный каталог с помощью Java?
-
05-07-2019 - |
Вопрос
У меня есть каталог, сопоставленный с моим компьютером, так что я могу просматривать его и писать в него через проводник 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 (), но либо удвоите обратную косую черту, либо измените ее на прямую косую черту.