なぜならケースの感性のLinux上でJavaを実行するときにFileNotFound例外を避けるためにどのように?
-
20-09-2019 - |
質問
私のWebアプリケーションは、Windows上で実行されます。私はまた、Linux上で私のアプリを実行したいと思います。私は、このような等のパス区切り、
などの問題のほとんどを克服しているように見えます本当の問題は、今、私はJavaコードがファイルを開こうとするとFileNotFoundException
を取得するだけAbc.txt
が存在するときabc.txt
を言っています。 :(
私は、小文字または大文字にすべてのファイル名を変更するには行くことはできません。多くのコードを変更することなく、任意の可能な方法は、これを避けるために、ということでしょうか?
解決
java.io.File
APIはシステム依存であるとしてこれを回避する方法はありません。あなたは、Linux / Unix上のファイルを操作するとき、右ケースを使用する必要があります。実は、私のアドバイス/ソリューションは、Windows上で開発中の厳格かつポータブル規則に従うことであろう(例えば、下ケースを使用するのプログラムでそれをアクセスするときの正確なファイル名を使用して、ファイル名のみや、より良いです)。あなたはファイル名がAbc.txt
ときabc.txt
をロードしようとしている理由を正直に言うと、私は理解していません。これは、(Windows上であまりにも多くの時間をかけて教えて)悪い癖ではなく、Linuxの/ Unixの問題です。
他のヒント
それを修正する!
任意の方式では、あなたはそれが長期的に悪くなります固定回避するために工夫しています。
さて、まず第一に、私はは一貫性のある命名スキームへの移行を検討すべきではなく、いくつかの回避策を使用するためには、を考えます。
とにかく、何についてのすべてのファイル名に読み込み、マップにそれらを置くことがキーと小文字の名前が含まれているの?あなたは、その後の のマップから正しいファイル名を検索することができます。
これは、例えば、あなたが衝突を検出することもできるようになりますあなたが知っている必要がありますので、あなたが(完全に異なる方法で問題に取り組むために持っていることを知った場合には、同じ小文字の表現を持って、同じディレクトリ内の2つのファイル「FileA.txt」と「FILEA.TXT」、これ1あなたが開いているにしたい、それが曖昧だし、そのような問題を回避するには)それを行うことはありません。
ファイルはLinux上で大文字と小文字が混在していると仮定すると、簡単な答えがこれにありません。
私は考えることができる最善のは、アプリケーションのリストに該当するディレクトリを持っており、実際のLinuxのファイル名のメモリ内のデータ構造を作成することです。そして、オープン大文字と小文字を区別しないファイルを実行するために、あなたは、開いているファイルを行うには、実際の(大文字と小文字を区別)パス名と使用をbulid、大文字と小文字を区別しない検索を使用して、メモリ内のツリーを検索する部品へのパス名を分割します。
これに伴う問題は、それ(そして実際にあなたのアプリケーション)を使用すると、同じLinuxディレクトリに(たとえば)、「foo.txtの」AND「foo.txtの」を持っている場合には対応できないということです。
しかし、最善の解決策は、それが大文字と小文字を区別パス名で動作するようにアプリケーションを変更することです。
なぜ、あなたはたくさんのファイルを変更することはできませんか?ファイルの量が本当にあなたを戻って保持している唯一のものである場合には、単純に小文字にそれらすべての名前を変更小さなスクリプトを記述します。
これはあなたのファイルの場合の変更を引き起こしているものをあなたの質問から明らかではありません。すべてのファイルは、Linuxに小文字であれば、彼らはWindows上で混在する場合であるが、あなただけそうのように、小文字にファイル名を変換することができます:
new File(filename.toLowerCase())
恐ろしいランタイム・パフォーマンスを持っていますが、実装するのは非常に簡単です解決策があります:
タグのようなもので
new FileReader(name)
を交換してください
openFile(name);
public FileReader openFile(String name) throws FileNotFoundException {
File dir = (new File(name)).getParentFile();
for (File f : dir.listFiles()) {
if (f.getName().equalsIgnoreCase(name)) {
return new FileReader(f);
}
throw new FileNotFoundException("File not found: " + name);
}
私はこのコードをコンパイルしていない、それはタイプミスやバグを持っていることがあります。私は修正するためにあなたにそれらを残しています。