あなたがするとき
new File("helloWorldIndia.xml").createNewFile()
プログラムを実行している場所に、ファイル「helloWorldIndia.xml」が作成されます。この場合、プログラムは Web サーバーによって実行されています。したがって、ファイルは、war ファイルを配置した場所ではなく、 Web サーバーがWeb アプリをデプロイしたパスに作成されます。
今のところ、Web サーバーが jetty であると仮定しましょう。デフォルトの構成では、jetty は Windows では %TEMP%、Linux では /tmp にあるシステムの一時フォルダーに war を展開します。この場合、一時フォルダーで「helloWorldIndia.xml」を検索すると、コードを実行した後にファイルが見つかるはずです。
これにより、一部のサーバーは、サーバーをシャットダウンすると、展開されたファイルを削除します。FS スキャンを実行してもファイルが見つからない理由は、サーバーをシャットダウンしたときに展開されたフォルダー自体が削除された可能性があります。
コードがファイルを書き込んでいる場所を見つけるには、スニペットの最後にこの行を追加します。
System.out.println(f.getAbsolutePath());
これにより、現在のコードでファイルが作成された場所の完全なパスが記録されます。
Web アプリの場合、ファイル システムの絶対パスにファイルを書き込む必要があります。相対パスでの書き込みは安全ではありません。サーバーを別の場所に展開するように構成すると、構成/コードを変更しない限り、以前に書き込まれたファイルが見つからない可能性があるためです。
最善の方法は、コードで構成可能なファイルを書きたいフォルダーの絶対パスを作成することです。ファイルを書き込む必要があるフォルダーのパスを渡すことができます-
- 環境変数として (サーバー起動時の -D プロパティ)。
- このような web.xml からのサーブレット構成プロパティとして
- データベースの構成エントリとして。実行時に DB クエリを実行して、フォルダーのパスを取得します。
- などなど..
ただし、Web アプリを介してファイルを書き込むことは、やむを得ない場合までお勧めしません。その理由の 1 つは、トランザクションである可能性があります。トランザクションは、ファイル IO を自動的に処理できません。トランザクションが失敗してロールバックが必要になった場合は、ファイル書き込みシナリオを手動で処理する必要があります。