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リポジトリ。 Oracle XML DBリポジトリは、XMLストレージ用にOracle9i Databaseリリース2で導入された機能であり、FTPまたはHTTP / WebDAVを介してアクセスできます。あなたの場合、HTTP / WebDAVを使用しようとしているようです。
Wikipediaの WedDAV ページで説明されているとおり:
WedDAVは、拡張機能のセットです ユーザーが編集できるHTTPのトップ ファイルを共同で管理します リモートWorld Wide Webサーバー。
つまり、WebDAVリポジトリ内のファイルの追加、削除、名前の変更などは、HTTPワードを使用して行われます:PUT、DELETE、MOVEなど( RFC 4918 をご覧ください)。
その結果、WebDAVサーバーとの対話は、 java.net
のクラスを使用して実行できます。
または Jakarta Commons HttpClient のような高レベルAPIを使用できます。
または Slide プロジェクトで提供されているようなJava WebDAVクライアントを使用できます。この記事は、その方法と外観を示していますシンプル。ただし、Slideプロジェクトは現在廃止されているため、お勧めしません。
幸い(またはそうでない)、 Apache Jackrabbit プロジェクトはSlide ...の代替案ですが、 JackrabbitでのWebDAVサポートは、クライアントよりもサーバー側の実装により重点を置いています。とにかく、このスレッドにいくつかのコードサンプルがありますjackrabbit-usersメーリングリスト。
HttpClientを選択し、チュートリアルを使用すると思いますまたは
他のヒント
ここで何を話しているのか(Javaの男ではありません)確かではありませんが、「マップしてもらう」ことができますが予想されるファイルシステムパスの代わりにURLを渡します。 (たとえば)Windowsでマップされたドライブがある場合、割り当てられたドライブ文字を使用します。
プロトコルでロケーションURIを渡そうとしています。あなたは場所sansプロトコルを渡す必要があります:
\\ dev1 \ data \ xml \ myTestFile123.xml
マップされたドライブ文字(非常に弱いようです)を使用する代わりに、 JCIFS をご覧ください。 :
JCIFSは、100%JavaでCIFS / SMBネットワークプロトコルを実装するオープンソースクライアントライブラリです。 CIFSは、Microsoft Windowsプラットフォームでの標準のファイル共有プロトコルです(例:ネットワークドライブのマッピング...)。このクライアントは、大規模なイントラネットの運用環境で広く使用されています。
このコードは、リモートマシンにログオンし、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/
ローカルパスを使用する
Windowsエクスプローラーで myTestFile123.xml
が表示される場合は、それを右クリックして Location:
プロパティ値をコピーします。次に、これを新しいFile()引数として使用しますが、バックスラッシュを2つ重ねるか、スラッシュに変更します。