4

次のように、ファイルに何かを書き込もうとしています。

FileWriter fw = new FileWriter("somefile.txt", true);

単一のプロセスによって開始された場合、正しく機能します。このような:

java -jar XXXXXXX.jar

ただし、別のプロセスから呼び出すと、IOException がスローされます。例:

java.io.FileNotFoundException: 'somefile.txt' (No such file or directory)
    at java.io.FileOutputStream.openAppend(Native Method)                      
    at java.io.FileOutputStream.<init>(FileOutputStream.java:192)              
    at java.io.FileOutputStream.<init>(FileOutputStream.java:116)             
    at java.io.FileWriter.<init>(FileWriter.java:61)                       
4

6 に答える 6

9

多くの回答が、ファイルが存在しないために例外が発生していることを誤って示唆しています。それは理由ではありません。コンストラクターのドキュメントには、次のように明確に記載されています。

スロー:
IOException - 指定されたファイルが存在するが、通常のファイルではなくディレクトリである場合、存在しないが作成できない場合、またはその他の理由で開くことができない場合

相対ファイル名 ('/' または '\' を含まない文字列) を渡す場合、現在のディレクトリ内のファイルを参照します。を使用して実行するとjava -jar、現在のディレクトリは書き込み権限のあるディレクトリになりますが、他のプロセスが実行すると、現在のディレクトリは書き込み可能ではなくなります。

以前は、古い Java バージョンでは、書き込み不可のディレクトリに書き込もうとすると FileNotFoundException をスローする習慣がありました。ただし、最新の Java ではそれができないようです。そのため、それが問題なのかどうかはわかりません。代わりに java.nio.file パッケージを使用すると、より明確な例外を取得できます。

Path path = Paths.get("somefile.txt");
Writer writer = Files.newBufferedWriter(path, Charset.defaultCharset(),
    StandardOpenOption.APPEND, StandardOpenOption.CREATE);
于 2013-03-26T10:06:32.967 に答える
2

例外が示すように、ファイルsomefile.txtは存在しません。これは問題ありませんが、コンストラクターの 2 番目の引数がFileWriter、既存のファイルに追加すること、つまりファイルが存在する必要があることを示していることを除きます。File.exists()を使用してファイルの存在を確認し、存在する場合は を使用しnew FileWriter("somefile.txt", true);、そうでない場合は を使用new FileWriter("somefile.txt", false);して初めてファイルを作成することをお勧めします。

于 2013-03-26T09:43:15.300 に答える
1

考えられる説明はいくつかあります。

  1. somefile.txtプロセスには、現在のディレクトリに作成する権限がありません。
  2. 一部のオペレーティング システムでは、ファイルが既に存在し、別のプロセスで使用されている場合、ファイルを作成/上書きできない場合があります。
于 2013-03-26T09:42:04.090 に答える
1

process2 を開始する場合:

  1. 現在のディレクトリでsomefile.txtを見つけようとします。

  2. 指定された名前のファイルが現在のディレクトリに見つからない場合、新しいファイルを作成しようとしますが、ユーザー権限により、指定された名前の新しいファイルを作成できません。

手動で確認してください。現在のディレクトリにファイルが存在するかどうか。

于 2013-03-26T09:56:38.267 に答える
0

JavaDoc

この例外は、指定されたパス名を持つファイルが存在しない場合に、FileInputStream、FileOutputStream、および RandomAccessFile コンストラクターによってスローされます。ファイルが存在するが何らかの理由でアクセスできない場合にも、これらのコンストラクターによってスローされます。たとえば、書き込みのために読み取り専用ファイルを開こうとした場合などです。

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/FileNotFoundException.html

おそらく、プロセスでファイルを開き、ファイルを閉じていない可能性があります。そのため、ファイルを再度開こうとすると、ファイルを 2 回開くことができないため、これらの例外がスローされます。

于 2013-03-26T09:47:01.960 に答える
0

FileNotFoundException を考慮すると、ファイルが存在しないことは明らかです。

2 番目のプロセスは、ファイルが存在しないルート フォルダーから開始されると思います。ファイルの絶対パスを使用して、これが問題であることを確認してください。または、単純なチェックを使用するだけです

 if (yourFile.exists())

アクセスする前に、そうでない場合は、プログラムが使用しているパスを表示します。

于 2013-03-26T09:44:12.383 に答える