4

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データベースが作成している仮想ディレクトリです。

4

6 に答える 6

4

私の理解では、あなたはOracle XML DB Repositoryに書き込もうとしているということです。Oracle XML DB リポジトリは、Oracle9i データベース リリース 2 で XML ストレージ用に導入された機能で、FTP または HTTP/WebDAV を介してアクセスできます。あなたの場合、HTTP/WebDAV を使用しようとしているようです。

ウィキペディアのWedDAVページで説明されているように:

WedDAV は、ユーザーがリモートの World Wide Web サーバー上でファイルを共同で編集および管理できるようにする、HTTP 上の一連の拡張機能です。

つまり、WebDAV リポジトリでのファイルの追加、削除、名前の変更などは、PUT、DELETE、MOVE などの HTTP ワードを使用して行われます (詳細については、RFC 4918を参照してください)。

したがって、WebDAV サーバーとの対話は、 のクラスを使用して行うことができますjava.net

または、 Jakarta Commons HttpClientのような高レベル API を使用することもできます。

または、 Slideプロジェクトで提供されているような Java WebDAV クライアントを使用することもできます。この記事はその方法を示しており、簡単に見えます。ただし、Slide プロジェクトは現在廃止されているため、お勧めしません。

幸いなことに (またはそうではない)、Apache Jackrabbitプロジェクトは Slide の代替手段です... しかし、私の知る限り、Jackrabbit の WebDAV サポートは、クライアントよりもサーバー側の実装に重点を置いています。いずれにせよ、 jackrabbit-users メーリング リストのこのスレッドにいくつかのコード サンプルがあります。

HttpClient を選択し、チュートリアルまたはサンプル コードを出発点として使用すると思います。

于 2009-09-10T10:23:27.267 に答える
3

プロトコルを使用してロケーションURIを渡そうとしています。あなたは場所sansプロトコルを渡す必要があります:

\\ dev1 \ data \ xml \ myTestFile123.xml

于 2009-09-09T20:21:32.143 に答える
3

マップされたドライブ文字(非常に弱いようです)を使用する代わりに、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トピックについて説明します。

于 2009-09-09T20:28:59.160 に答える
3

私がここで何について話しているのかよくわかりません (Java の専門家ではありません) が、「マップされている」かもしれませんが、予想されるファイル システム パスの代わりに URL を渡しています。(たとえば) Windows でマップされたドライブがある場合は、割り当てられたドライブ文字を使用します。

于 2009-09-09T20:14:40.440 に答える
1

Windowsでファイルをどのようにマッピングしましたか?ファイルを作成するためのそのようなメカニズムが存在しないため、HTTPプロトコルを使用していないと思われます。したがって、プロトコルとして「http」を使用してもどこにも到達しません。

マップされたドライブ文字を見つけます。おそらく、次のようなものが必要です。

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

Sambaを使用している場合は、JCIFSを確認することをお勧めします。次に、以下を使用できます。

smb://server/share/
于 2009-09-09T20:22:30.113 に答える
0

ローカルパスを使用する

Windowsエクスプローラーに表示されている場合はmyTestFile123.xml、それを右クリックしてLocation:プロパティ値をコピーします。次に、これを新しいFile()引数として正確に使用しますが、円記号を2倍にするか、スラッシュに変更します。

于 2009-09-09T20:23:51.647 に答える