1

最近、Eclipse を使用して Java で Web プロジェクトを作成しました。タイマー タスクを含むサーブレットがあります。このタイマー タスクは、私が作成した XML ライティング クラスの「writeList」メソッドを呼び出します。これはすべて正常に動作し、System.out を使用して毎分実行されることを確認しました。

Eclipse 内から XML ライティング クラスをアプリケーションとして実行すると、正常に動作します。ファイルは問題なく「WebContent/test.rdf」に出力されます。

ただし、サーブレットのタイマー タスクによって呼び出されると、次のエラーが発生します。

java.io.FileNotFoundException: WebContent/Test.rdf(No such file or directory)
     at java.io.FileOutputStream.open(Native Method)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
     at com.XMLWriter.writeList(XMLWriter.java:58)
     at com.ServerTimer$1.run(ServerTimer.java:30)
     at java.util.TimerThread.mainLoop(Timer.java:512)
     at java.util.TimerThread.run(Timer.java:462)

XMLWriter の 58 行目のコードは次のとおりです。

fileOut = new FileOutputStream("WebContent/TEST.rdf");
model.write(fileOut);

fileOut は FileOutputStream で、model は Jena モデルのインスタンスです。RDF を使用しているためです。

何か助けていただければ幸いです。私はこれで何日も立ち往生しています! ご不明な点がございましたら、お知らせください。

編集:現在は機能していますが、ファイルを Web プロジェクトの「WebContent」ディレクトリに書き込みたいと考えています。これを自動的に行う方法はありますか?システムにそのディレクトリを動的に見つけさせることができません。

4

2 に答える 2

0

そのように相対パスに依存することは絶対にしないでください。Java IOで相対パスを使用すると、移植性の問題が発生します。は、実行中のWebアプリケーションコンテキストについて何もjava.io.File知りません。実際のパスは、現在の作業ディレクトリに依存します。これ自体はすべての環境で同じではなく、サーバー/アプリケーションの起動方法によって異なります。それは例えば相対的なものになるかもしれません、そしてあなたは明らかにそこにいません。常に絶対パスを使用します。つまり、フルディスクファイルシステムパスを使用します。C:/Tomcat/binTEST.rdf

ServletContext#getRealPath()JSP /サーブレットWebアプリケーションの場合、相対Webパスを絶対ディスクファイルシステムパスに変換するために使用できます。これは、JavaIO関連でさらに使用できます。相対的なWebパスは、パブリックWebコンテンツに基づいています。これがパブリックWebコンテンツのルートにあると仮定すると、サーブレット内の絶対ディスクファイルシステムパスを次の方法で/TEST.rdf取得できます。/TEST.rdf

String relativeWebPath = "/TEST.rdf";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
于 2010-03-03T16:59:07.743 に答える
0

ディレクトリが存在しないためです。ディレクトリを (プログラムまたはオフラインで) 作成するか、基本パスにフォルダーを作成します。

于 2010-03-03T13:59:28.253 に答える