3

非常に散発的にファイルを作成しているプロセスがありますが、まだ理解できない理由で、「java.io.FileNotFoundException:ファイルは通常のファイルではありません」というメッセージが表示されます。ファイルが(ファイルマネージャーとテキストエディターで)完全に正常であるように見えても、例外です。したがって、このエラーを再現して対処方法を確認しようとしていますが、そのためには、この例外を発生させるファイルを手動で作成する必要があり、ファイルに対して手動で何ができるかわかりません。このようにして突然「壊れた」状態になります。

私がファイルに対して行うことは、例外をスローしているファイルで間違っていることと同じではないことを理解していますが、テスト可能なコードを記述して、保護コードが機能することを確認するために、それは問題ではありません。 。壊れたファイルが必要です。ランダムなサイクルで手動で例外をスローすることもできると思いますが、これをより「現実的」にすることができると期待していました。

すべての助けに感謝します。

4

3 に答える 3

2

破損したファイルはファイルのままです。たとえば、破損した Word 文書はファイルのままですが、内容が読み取れないため、ワード プロセッサを使用して開くことはできません。

ここで例外がスローされます:

public FilePartSource(File file) throws FileNotFoundException {
66          this.file = file;
67          if (file != null) {
68              if (!file.isFile()) {
69                  throw new FileNotFoundException("File is not a normal file.");
70              }
71              if (!file.canRead()) {
72                  throw new FileNotFoundException("File is not readable.");
73              }
74              this.fileName = file.getName();       
75          }
76      }

ファイルがファイルではなく、何か他のもの (ディレクトリ? 存在しないファイルへのリンク?) である場合に発生します。

于 2012-09-07T21:02:59.583 に答える
2

特に、テキスト エディタによると、ファイルが実際に破損していない場合は、間違った方法で探している可能性があると思います。
スタック トレース全体を投稿する必要があります。問題はファイルではなく、パス名にあると思われます。例外が発生した時点でFile#isfile()
の結果を試しましたか? javadoc から (強調)

public boolean isFile()

この抽象パス名が示す ファイルが通常のファイルかどうかをテストします。ファイルがディレクトリではなく、さらにシステムに依存するその他の基準を満たしている場合、そのファイルは正常です。Java アプリケーションによって作成されたディレクトリ以外のファイルは、通常のファイルであることが保証されています。

File#isfile()例外の前に返されると思われるfalseため、ファイルを破損しようとするのではなく、この API を調べる必要があります。

于 2012-09-07T20:59:25.530 に答える
1

既存のファイルを破損したい場合は、ファイルを開いてバイトをスクランブルする関数を書くだけです。これは、16 進エディタでも実行できます。ガベージ ファイルを生成したい場合は、新しいファイルを作成し、そこに random.nextBytes() を書き込むだけです。

于 2012-09-07T20:56:20.160 に答える