Java - ファイルと I/O
java.io パッケージには、Java で入出力 (I/O) を実行するために必要になる可能性があるほぼすべてのクラスが含まれています。これらすべてのストリームは、入力ソースと出力先を表します。 java.io パッケージのストリームは、プリミティブ、オブジェクト、ローカライズされた文字など、多くのデータをサポートしています。
ストリーム
ストリームは一連のデータとして定義できます。ストリームには 2 種類あります −
- <リ>
入力ストリーム − InputStream は、ソースからデータを読み取るために使用されます。
<リ>アウトプットストリーム − OutputStream は、宛先にデータを書き込むために使用されます。
Java は、ファイルとネットワークに関連する I/O に対して強力かつ柔軟なサポートを提供しますが、このチュートリアルでは、ストリームと I/O に関連する非常に基本的な機能について説明します。最も一般的に使用される例を 1 つずつ見ていきます −
バイト ストリーム
Java バイト ストリームは、8 ビット バイトの入出力を実行するために使用されます。バイト ストリームに関連するクラスは多数ありますが、最も頻繁に使用されるクラスは FileInputStream です。 および FileOutputStream .以下は、これら2つのクラスを利用して入力ファイルを出力ファイルにコピーする例です-
例
import java.io.*; public class CopyFile { public static void main(String args[]) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("input.txt"); out = new FileOutputStream("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
input.txt ファイルを用意しましょう 次の内容で −
This is test for copy file.
次のステップとして、上記のプログラムをコンパイルして実行すると、input.txt と同じ内容の output.txt ファイルが作成されます。それでは、上記のコードを CopyFile.java ファイルに入れて、次のことを行いましょう −
$javac CopyFile.java $java CopyFile
キャラクター ストリーム
Java バイト ストリームは 8 ビット バイトの入出力を実行するために使用されますが、Java CharacterFileReader です。 と FileWriter .内部的には FileReader は FileInputStream を使用し、FileWriter は FileOutputStream を使用しますが、ここでの主な違いは、FileReader が一度に 2 バイトを読み取り、FileWriter が一度に 2 バイトを書き込むことです。
上記の例を書き直すと、これら 2 つのクラスを使用して入力ファイル (Unicode 文字を含む) を出力ファイルにコピーできます −
例
import java.io.*; public class CopyFile { public static void main(String args[]) throws IOException { FileReader in = null; FileWriter out = null; try { in = new FileReader("input.txt"); out = new FileWriter("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
input.txt ファイルを用意しましょう 次の内容で −
This is test for copy file.
次のステップとして、上記のプログラムをコンパイルして実行すると、input.txt と同じ内容の output.txt ファイルが作成されます。それでは、上記のコードを CopyFile.java ファイルに入れて、次のことを行いましょう −
$javac CopyFile.java $java CopyFile
標準ストリーム
すべてのプログラミング言語は、ユーザーのプログラムがキーボードから入力を受け取り、コンピューター画面に出力を生成できる標準 I/O をサポートしています。 CまたはC++を知っている場合プログラミング言語の場合、STDIN、STDOUT、および STDERR の 3 つの標準デバイスに注意する必要があります。同様に、Java は次の 3 つの標準ストリームを提供します −
- <リ>
標準入力 − これはユーザーのプログラムにデータを供給するために使用され、通常はキーボードが標準入力ストリームとして使用され、System.in として表されます。 .
<リ>標準出力 − これは、ユーザーのプログラムによって生成されたデータを出力するために使用されます。通常、コンピュータ画面は標準出力ストリームに使用され、System.out として表されます。 .
<リ>標準誤差 − これは、ユーザーのプログラムによって生成されたエラー データを出力するために使用されます。通常、コンピュータ画面は標準エラー ストリームに使用され、System.err として表されます。 .
以下は、InputStreamReader を作成する簡単なプログラムです。 ユーザーが「q」を入力するまで標準入力ストリームを読み取る −
例
ライブデモimport java.io.*; public class ReadConsole { public static void main(String args[]) throws IOException { InputStreamReader cin = null; try { cin = new InputStreamReader(System.in); System.out.println("Enter characters, 'q' to quit."); char c; do { c = (char) cin.read(); System.out.print(c); } while(c != 'q'); }finally { if (cin != null) { cin.close(); } } } }
上記のコードを ReadConsole.java ファイルに保持し、次のプログラムに示すようにコンパイルして実行してみましょう。このプログラムは、'q' を押すまで同じ文字を読み込んで出力し続けます −
$javac ReadConsole.java $java ReadConsole Enter characters, 'q' to quit. 1 1 e e q q
ファイルの読み取りと書き込み
前述のように、ストリームは一連のデータとして定義できます。 インプットストリーム ソースと OutputStream からデータを読み取るために使用されます 宛先にデータを書き込むために使用されます。
入力ストリームと出力ストリームを処理するクラスの階層を次に示します。
2 つの重要なストリームは FileInputStream です および FileOutputStream 、このチュートリアルで説明します。
FileInputStream
このストリームは、ファイルからデータを読み取るために使用されます。オブジェクトは、キーワード new を使用して作成できます コンストラクタにはいくつかの種類があります。
次のコンストラクターは、ファイル名を文字列として受け取り、ファイルを読み取る入力ストリームオブジェクトを作成します-
InputStream f = new FileInputStream("C:/java/hello");
次のコンストラクターは、ファイル オブジェクトを受け取り、ファイルを読み取るための入力ストリーム オブジェクトを作成します。まず、次のように File() メソッドを使用してファイル オブジェクトを作成します −
File f = new File("C:/java/hello"); InputStream f = new FileInputStream(f);
InputStream を取得したら オブジェクトを手に持っている場合、ストリームを読み取ったり、ストリームで他の操作を実行したりするために使用できるヘルパー メソッドのリストがあります。
Sr.No. | 方法と説明 |
---|---|
1 | public void close() が IOException をスローする{} このメソッドは、ファイル出力ストリームを閉じます。ファイルに関連付けられているすべてのシステム リソースを解放します。 IOException をスローします。 |
2 | 保護された void finalize() が IOException をスロー{} このメソッドは、ファイルへの接続をクリーンアップします。このストリームへの参照がなくなったときに、このファイル出力ストリームの close メソッドが呼び出されるようにします。 IOException をスローします。 |
3 | public int read(int r) が IOException をスローする{} このメソッドは、指定されたバイトのデータを InputStream から読み取ります。 int を返します。データの次のバイトを返し、それがファイルの終わりの場合は -1 が返されます。 |
4 | public int read(byte[] r) が IOException をスローする{} このメソッドは、r.length バイトを入力ストリームから配列に読み取ります。読み取られた合計バイト数を返します。ファイルの最後である場合、-1 が返されます。 |
5 | public int available() が IOException をスローする{} このファイル入力ストリームから読み取ることができるバイト数を示します。 int を返します。 |
他にも利用可能な重要な入力ストリームがあります。詳細については、次のリンクを参照してください −
- <リ>
ByteArrayInputStream
<リ>データ入力ストリーム
FileOutputStream
FileOutputStream は、ファイルを作成し、そこにデータを書き込むために使用されます。ストリームは、ファイルが存在しない場合は、出力用に開く前にファイルを作成します。
FileOutputStream オブジェクトの作成に使用できる 2 つのコンストラクターを次に示します。
次のコンストラクターは、ファイル名を文字列として取り、ファイルを書き込むための入力ストリーム オブジェクトを作成します −
OutputStream f = new FileOutputStream("C:/java/hello")
次のコンストラクターは、ファイル オブジェクトを取得して出力ストリーム オブジェクトを作成し、ファイルを書き込みます。まず、次のように File() メソッドを使用してファイル オブジェクトを作成します −
File f = new File("C:/java/hello"); OutputStream f = new FileOutputStream(f);
OutputStream を取得したら オブジェクトが手元にある場合、ヘルパー メソッドのリストがあり、ストリームへの書き込みやストリームでの他の操作に使用できます。
Sr.No. | 方法と説明 |
---|---|
1 | public void close() が IOException をスローする{} このメソッドは、ファイル出力ストリームを閉じます。ファイルに関連付けられているすべてのシステム リソースを解放します。 IOException をスローします。 |
2 | 保護された void finalize() が IOException をスロー{} このメソッドは、ファイルへの接続をクリーンアップします。このストリームへの参照がなくなったときに、このファイル出力ストリームの close メソッドが呼び出されるようにします。 IOException をスローします。 |
3 | public void write(int w) が IOException をスローする{} このメソッドは、指定されたバイトを出力ストリームに書き込みます。 |
4 | public void write(byte[] w) 上記のバイト配列から w.length バイトを OutputStream に書き込みます。 |
他にも重要な出力ストリームが利用可能です。詳細については、次のリンクを参照してください −
- <リ>
ByteArrayOutputStream
<リ>データ出力ストリーム
例
以下は、InputStream と OutputStream を示す例です −
import java.io.*; public class fileStreamTest { public static void main(String args[]) { try { byte bWrite [] = {11,21,3,40,5}; OutputStream os = new FileOutputStream("test.txt"); for(int x = 0; x < bWrite.length ; x++) { os.write( bWrite[x] ); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for(int i = 0; i < size; i++) { System.out.print((char)is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } } }
上記のコードはファイル test.txt を作成し、指定された数値をバイナリ形式で書き込みます。標準出力画面の出力も同じです。
ファイル ナビゲーションと I/O
ファイル ナビゲーションと I/O の基本を理解するために、他にもいくつかのクラスがあります。
- <リ>
ファイル クラス
<リ>FileReader クラス
<リ>FileWriter クラス
Java のディレクトリ
ディレクトリは、他のファイルとディレクトリのリストを含むことができるファイルです。 ファイルを使用しています オブジェクトを使用してディレクトリを作成し、ディレクトリで使用可能なファイルを一覧表示します。完全な詳細については、File オブジェクトで呼び出すことができるすべてのメソッドのリストと、ディレクトリに関連するものを確認してください。
ディレクトリの作成
2 つの便利な ファイル があります ディレクトリの作成に使用できるユーティリティメソッド −
- <リ>
mkdir( ) メソッドはディレクトリを作成し、成功すると true を返し、失敗すると false を返します。失敗は、File オブジェクトで指定されたパスが既に存在するか、パス全体がまだ存在しないためにディレクトリを作成できないことを示します。
<リ>mkdirs() メソッドは、ディレクトリとディレクトリのすべての親の両方を作成します。
次の例では、「/tmp/user/java/bin」ディレクトリを作成します −
例
import java.io.File; public class CreateDir { public static void main(String args[]) { String dirname = "/tmp/user/java/bin"; File d = new File(dirname); // Create directory now. d.mkdirs(); } }
上記のコードをコンパイルして実行し、「/tmp/user/java/bin」を作成します。
注意 − Java は、慣例に従って、UNIX および Windows のパス区切り記号を自動的に処理します。 Windows バージョンの Java でスラッシュ (/) を使用しても、パスは正しく解決されます。
ディレクトリのリスト
list( ) を使用できます File が提供するメソッド 次のように、ディレクトリで利用可能なすべてのファイルとディレクトリをリストするオブジェクト-
例
import java.io.File; public class ReadDir { public static void main(String[] args) { File file = null; String[] paths; try { // create new file object file = new File("/tmp"); // array of files and directory paths = file.list(); // for each name in the path array for(String path:paths) { // prints filename and directory name System.out.println(path); } } catch (Exception e) { // if any error occurs e.printStackTrace(); } } }
/tmp で利用可能なディレクトリとファイルに基づいて、次の結果が生成されます。 ディレクトリ−
出力
test1.txt test2.txt ReadDir.java ReadDir.class
Java