概要
このチュートリアルでは、Javaでファイルを読み取るさまざまな方法について説明します。 。
最初に、クラスパス、URL、または標準のJavaクラスを使用してJARファイルからファイルをロードする方法を学習します。
次に、その方法を確認します。 BufferedReader、Scanner、StreamTokenizer、DataInputStream、SequenceInputStream、FileChannelを使用してコンテンツを読み取るには、UTF-8でエンコードされたファイルを読み取る方法についても説明します。
最後に、ロードする新しい手法について説明します。 Java7およびJava8でファイルを読み取ります。
この記事は、Baeldungの「Java– BacktoBasic」シリーズの一部です。
さらに読む:
Java –ファイルの作成
Java –ファイルへの書き込み
セットアップ
2.1入力ファイル
この記事全体のほとんどの例では、次の1行を含むファイル名fileTest.txtのテキストファイルを読み取ります。
いくつかの例では、別のファイルを使用します。このような場合、「ファイルとその内容について明示的に言及します。
2.2ヘルパーメソッド
コアを使用した一連のテスト例を使用します。 Javaクラスのみで、テストでは、Hamcrestマッチャーでアサーションを使用します。
テストは、結果のアサーションを容易にするために、InputStreamをStringに変換する共通のreadFromInputStreamメソッドを共有します。
これと同じ結果を達成する方法は他にもあることに注意してください。いくつかの代替方法については、この記事を参照してください。
クラスパスからのファイルの読み取り
3.1 。標準Javaの使用
このセクションでは、クラスパスで使用可能なファイルを読み取る方法について説明します。src/ main / resourcesで使用できる「fileTest.txt」を読みます。 :
上記のコードスニペットでは、現在のクラスを使用してgetResourceAsStreamメソッドを使用してファイルをロードし、ロードするファイルの絶対パスを渡しました。
同じメソッドをで使用できます。 ClassLoaderインスタンスも同様です:
classLoaを取得しますgetClass()。getClassLoader()を使用した現在のクラスのder。
主な違いは、ClassLoaderインスタンスでgetResourceAsStreamを使用する場合、パスはクラスパスのルートから始まる絶対パスとして扱われることです。
Classインスタンスに対して使用する場合、パスはパッケージからの相対パス、または先頭のスラッシュで示される絶対パスにすることができます。
もちろん、実際には注意してください。 、この例のInputStreamのように、開いているストリームは常に閉じる必要があります。
3.2。 commons-ioライブラリの使用
もう1つの一般的なオプションは、commons-ioパッケージのFileUtilsクラスを使用することです。
ここで、Fileオブジェクトをに渡します。 FileUtilsクラスのメソッドreadFileToString()。このユーティリティクラスは、InputStreamインスタンスを作成してデータを読み取るための定型コードを記述する必要なしにコンテンツをロードすることができます。
同じライブラリがIOUtilsクラスも提供します。
ここにFileInputStreamオブジェクトをIOUtilsクラスのメソッドtoString()に渡します。このユーティリティクラスは、InputStreamインスタンスを作成してデータを読み取るために、前のユーティリティクラスと同じように機能します。
BufferedReaderを使用した読み取り
Now let ” sファイルのコンテンツを解析するさまざまな方法に焦点を当てます。
BufferedReaderを使用してファイルから読み取る簡単な方法から始めます。
readLine()はファイルの終わりに達するとnullになります。
JavaNIOを使用したファイルからの読み取り
JDK7では、NIOパッケージが大幅に更新されました。
FilesクラスとreadAllLinesメソッドを使用した例を見てみましょう。 readAllLinesメソッドはパスを受け入れます。
パスクラスは、いくつかの追加操作が行われたjava.io.Fileのアップグレードと見なすことができます。
5.1。小さなファイルの読み取り
次のコードは、新しいFilesクラスを使用して小さなファイルを読み取る方法を示しています。
readAllBytes()を使用できることに注意してください。バイナリデータが必要な場合も同様です。
5.2。大きなファイルの読み取り
Filesクラスで大きなファイルを読み取りたい場合は、BufferedReaderを使用できます。
次のコードは、を使用してファイルを読み取ります。新しいFilesクラスとBufferedReader:
5.3。 Files.lines()を使用したファイルの読み取り
JDK8は、Filesクラス内にlines()メソッドを提供します。文字列要素のストリームを返します。
データをバイトに読み取り、UTF-8文字セットを使用してデコードする方法の例を見てみましょう。
次のコードは、を使用してファイルを読み取ります。新しいFiles.lines():
ファイル操作のようにIOチャネルでStreamを使用するには、close()メソッドを使用してストリームを明示的に閉じる必要があります。
ご覧のとおり、Files APIは、ファイルの内容を文字列に読み込む別の簡単な方法を提供します。
次のセクションでは、他のあまり一般的ではない方法について説明します。状況によっては適切なファイルを読み取る。
スキャナーで読み取る
次に、スキャナーを使用してファイルから読み取る。ここでは、区切り文字として空白を使用します。
デフォルトの区切り文字は空白ですが、スキャナーでは複数の区切り文字を使用できます。
Scannerクラスは、読み取り時に役立ちます。コンソールからのコンテンツ、またはコンテンツに既知の区切り文字を含むプリミティブ値が含まれている場合(例:スペースで区切られた整数のリスト)。
StreamTokenizerによる読み取り
次に、StreamTokenizerを使用してテキストファイルをトークンに読み込みます。
トークナイザーは、最初に次のトークンが何であるか、文字列または数値を把握することによって機能します。これを行うには、tokenizer.ttypeフィールドを確認します。
次に、このタイプに基づいて実際のトークンを読み取ります。
- tokenizer.nval –タイプが数値
- tokenizer.sval –型が文字列の場合
この例では、以下を含む別の入力ファイルを使用します。
次のコードは、文字列と数値の両方をファイルから読み取ります。
ファイルの終わりトークンが最後にどのように使用されているかに注意してください。
このアプローチは、入力ストリームをトークンに解析するのに役立ちます。
DataInputStreamを使用した読み取り
DataInputStreamを使用して、バイナリまたはファイルからのプリミティブデータ型。
次のテストでは、DataInputStreamを使用してファイルを読み取ります。
FileChannelを使用した読み取り
大きなファイルを読み取る場合、FileChannelは標準IOよりも高速になる可能性があります。
次のコードは、FileChannelとRandomAccessFileを使用してファイルからデータバイトを読み取ります。
UTF-8Encodの読み取りed File
次に、BufferedReaderを使用してUTF-8でエンコードされたファイルを読み取る方法を見てみましょう。この例では、漢字を含むファイルを読み取ります。
URLからコンテンツを読み取る
URLからコンテンツを読み取るには、次を使用します。この例の「/」URL:
URLに接続する別の方法もあります。ここでは、標準SDKで使用可能なURLおよびURLConnectionクラスを使用しました。
JARからのファイルの読み取り
内部にあるファイルを読み取るにはJARファイル。ファイルが含まれているJARが必要です。この例では、「hamcrest-library-1.3.jar」ファイルから「LICENSE.txt」を読み取ります。
ここでは、HamcrestライブラリにあるLICENSE.txtをロードするため、次を使用します。リソースの取得に役立つMatcherのクラス。クラスローダーを使用して同じファイルをロードすることもできます。
結論
ご覧のとおり、プレーンJavaを使用してファイルをロードし、そこからデータを読み取るには、多くの可能性があります。
クラスパス、URL、jarファイルなどのさまざまな場所からファイルをロードできます。
次に、 BufferedReaderを使用して行ごとに読み取る、Scannerを使用して異なる区切り文字を使用して読み取る、StreamTokenizerを使用してファイルをトークンに読み取る、DataInputStreamを使用してバイナリデータとプリミティブデータタイプを読み取る、SequenceInput Streamを使用して複数のファイルを1つのストリームにリンクする、FileChannelを使用して大規模から高速に読み取るファイルなど