Java アプリケーションにファイルをロードするにはどうすればよいですか?
7 に答える
短い答え
次の 2 つの方法のいずれかを使用します。
例えば:
InputStream inputStream = YourClass.class.getResourceAsStream("image.jpg");
--
長い答え
通常、絶対パスを使用してファイルをロードすることは望ましくありません。たとえば、できる場合はこれを行わないでください。
File file = new File("C:\\Users\\Joe\\image.jpg");
この手法は、少なくとも 2 つの理由からお勧めできません。まず、特定のオペレーティング システムへの依存関係が作成され、アプリケーションが別のオペレーティング システムに簡単に移行できなくなります。Java の主な利点の 1 つは、多くの異なるプラットフォームで同じバイトコードを実行できることです。このような絶対パスを使用すると、コードの移植性が大幅に低下します。
第 2 に、ファイルの相対的な場所によっては、この手法によって外部依存関係が作成され、アプリケーションの移動性が制限される可能性があります。ファイルがアプリケーションの現在のディレクトリの外に存在する場合、これにより外部依存関係が作成され、アプリケーションを別のマシンに移動するには、依存関係を認識する必要があります (エラーが発生しやすくなります)。
代わりに、クラスのgetResource()
メソッドを使用してください。Class
これにより、アプリケーションの移植性が大幅に向上します。異なるプラットフォーム、マシン、またはディレクトリに移動しても、正しく機能します。
getResourceは問題ありませんが、作業ディレクトリの場所を制御できる限り(通常は可能です)、相対パスを使用しても同様に機能します。
さらに、区切り文字に関するプラットフォームの依存関係は、File.separator、File.separatorChar、またはSystem.getProperty( "file.separator")を使用して取得できます。
構成またはデータ (入力ファイルなど) またはリソースとして、何のためにファイルをロードしていますか?
- リソースとしての場合は、Will と Justinによる提案と例に従ってください
- 構成の場合は、ResourceBundleまたはSpringを使用できます (構成がより複雑な場合)。
- 内部のデータを処理するためにファイルを読み取る必要がある場合は、このコード スニペットが役立ち、[ファイル を閉じるのを忘れないでください] を
BufferedReader file = new BufferedReader(new FileReader(filename))
使用してファイルの各行を読み取ることができます。file.readLine();
Windowsでも、Unixスタイルのパスセパレータを使用するだけで問題は発生しませんでした(ただし、File.separatorCharを確認することをお勧めします)。
ClassLoader.getResource()を使用する手法は、JARファイルからロードされる読み取り専用リソースに最適です。場合によっては、プログラムでアプリケーションディレクトリを決定できます。これは、管理者が構成可能なファイルやサーバーアプリケーションに役立ちます。(もちろん、ユーザーが編集可能なファイルは、System.getProperty( "user.home")ディレクトリのどこかに保存する必要があります。)
public byte[] loadBinaryFile (String name) {
try {
DataInputStream dis = new DataInputStream(new FileInputStream(name));
byte[] theBytes = new byte[dis.available()];
dis.read(theBytes, 0, dis.available());
dis.close();
return theBytes;
} catch (IOException ex) {
}
return null;
} // ()
public static String loadTextFile(File f) {
try {
BufferedReader r = new BufferedReader(new FileReader(f));
StringWriter w = new StringWriter();
try {
String line = reader.readLine();
while (null != line) {
w.append(line).append("\n");
line = r.readLine();
}
return w.toString();
} finally {
r.close();
w.close();
}
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}