Java.io パッケージには、入出力の操作に必要なほぼすべてのクラスが含まれています。これらのストリーム クラスはすべて、入力ソースと出力先を表します。
Java.io パッケージのストリームは、基本タイプ、オブジェクト、ローカライズされた文字セットなど、多くの形式をサポートしています。
ストリームはデータのシーケンスとして理解できます。入力ストリームはソースからのデータの読み取りを表し、出力ストリームは宛先へのデータの書き込みを表します。
Java は I/O に対する強力かつ柔軟なサポートを提供するため、ファイル転送やネットワーク プログラミングでより広く使用されています。
ただし、このセクションでは、ストリームと I/O に関連する最も基本的な機能について説明します。これらの関数を例を通して 1 つずつ学習していきます。
Java のコンソール入力は System.in によって行われます。
コンソールにバインドされた文字ストリームを取得するには、System.in を BufferedReader オブジェクトでラップして文字ストリームを作成します。
以下は、BufferedReader を作成するための基本的な構文です。
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
BufferedReader オブジェクトが作成された後、read() メソッドを使用してコンソールから文字を読み取るか、readLine() メソッドを使用して文字列を読み取ることができます。
BufferedReader オブジェクトから文字を読み取るには、read() メソッドを使用します。その構文は次のとおりです。
intread()throwsIOException
read() メソッドが呼び出されるたびに、入力ストリームから文字を読み取り、その文字を整数値として返します。 ストリームが終了すると -1 を返します。このメソッドは IOException をスローします。
次のプログラムは、read() メソッドを使用して、ユーザーが「q」を入力するまでコンソールから文字を継続的に読み取る方法を示しています。
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRRead{ publicstaticvoidmain(Stringargs[])throwsIOException { charc; //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下'q' 键退出."); //读取字符do{ c=(char)br.read(); System.out.println(c); }while(c!='q'); } }
上記の例のコンパイルと実行結果は次のとおりです。
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
標準入力から文字列を読み取るには、BufferedReader の readLine() メソッドを使用する必要があります。
その一般的な形式は次のとおりです。
StringreadLine()throwsIOException
次のプログラムは、「end」という単語が入力されるまで文字行を読み取って表示します。
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRReadLines{ publicstaticvoidmain(Stringargs[])throwsIOException { //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); Stringstr; System.out.println("Enterlinesoftext."); System.out.println("Enter'end'toquit."); do{ str=br.readLine(); System.out.println(str); }while(!str.equals("end")); } }
上記の例のコンパイルと実行結果は次のとおりです。
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
前述したように、コンソール出力は print() と println() によって完了します。これらのメソッドは PrintStream クラスによって定義され、System.out はこのクラスのオブジェクトへの参照です。
PrintStream は OutputStream クラスを継承し、メソッド write() を実装します。このように、write() を使用してコンソールに操作を書き込むこともできます。
PrintStream は、次のように最も単純な形式で write() を定義します。
voidwrite(intbyteval)
このメソッドは、byteval の下位オクテットをストリームに書き込みます。
次の例では、write() を使用して、文字「A」に続いて改行文字を画面に出力します。
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
上記の例を実行して、出力ウィンドウに「A」文字を出力します。
A
注: print() メソッドと println() メソッドを使用する方が便利であるため、write() メソッドはあまり使用されません。
前述したように、ストリームは一連のデータとして定義されます。入力ストリームはソースからデータを読み取るために使用され、出力ストリームはターゲットにデータを書き込むために使用されます。
次の図は、入力ストリームと出力ストリームを説明するクラス階層図です。
以下で説明する 2 つの重要なストリームは、FileInputStream と FileOutputStream です。
このストリームはファイルからデータを読み取るために使用され、そのオブジェクトはキーワード new を使用して作成できます。
オブジェクトの作成にはさまざまなコンストラクター メソッドが使用されます。
文字列ファイル名を使用して、ファイルを読み取るための入力ストリーム オブジェクトを作成できます。
InputStreamf=newFileInputStream("C:/java/hello");
ファイル オブジェクトを使用して、ファイルを読み取るための入力ストリーム オブジェクトを作成することもできます。まず、File() メソッドを使用してファイル オブジェクトを作成する必要があります。
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
InputStream オブジェクトを作成した後、次のメソッドを使用してストリームを読み取ったり、他のストリーム操作を実行したりできます。
シリアルナンバー | 方法と説明 |
---|---|
1 | public void close() throws IOException{}このファイル入力ストリームを閉じ、このストリームに関連するすべてのシステム リソースを解放します。 IOExceptionをスローします。 |
2 | protected void Finalize()throws IOException {}このメソッドはファイルへの接続をクリアします。ファイル入力ストリームが参照されなくなったら、必ずその close メソッドを呼び出してください。 IOExceptionをスローします。 |
3 | public int read(int r)throws IOException{}このメソッドは、InputStream オブジェクトから指定されたバイトのデータを読み取ります。整数値として返されます。データの次のバイトを返すか、終わりに達した場合は -1 を返します。 |
4 | public int read(byte[] r) throws IOException{}このメソッドは、入力ストリームから r.length バイトを読み取ります。読み取られたバイト数を返します。ファイルの終わりの場合は、-1 が返されます。 |
5 | public int available() throws IOException{}この入力ストリームの次のメソッド呼び出しによってブロックされずに、この入力ストリームから読み取ることができるバイト数を返します。整数値を返します。 |
InputStream 以外にもいくつかの入力ストリームがあります。詳細については、以下のリンクを参照してください。
ByteArrayInputStream
データ入力ストリーム
このクラスは、ファイルを作成し、ファイルにデータを書き込むために使用されます。
ストリームが出力用にファイルを開く前にターゲット ファイルが存在しない場合、ストリームはファイルを作成します。
FileOutputStream オブジェクトの作成に使用できるコンストラクターが 2 つあります。
文字列ファイル名を使用して出力ストリーム オブジェクトを作成します。
OutputStreamf=newFileOutputStream("C:/java/hello")
ファイル オブジェクトを使用して、ファイルに書き込む出力ストリームを作成することもできます。まず、File() メソッドを使用してファイル オブジェクトを作成する必要があります。
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
OutputStream オブジェクトを作成した後、次のメソッドを使用してストリームに書き込んだり、他のストリーム操作を実行したりできます。
シリアルナンバー | 方法と説明 |
---|---|
1 | public void close() throws IOException{}このファイル入力ストリームを閉じ、このストリームに関連するすべてのシステム リソースを解放します。 IOExceptionをスローします。 |
2 | protected void Finalize()throws IOException {}このメソッドはファイルへの接続をクリアします。ファイル入力ストリームが参照されなくなったら、必ずその close メソッドを呼び出してください。 IOExceptionをスローします。 |
3 | public void write(int w)throws IOException{}このメソッドは、指定されたバイトを出力ストリームに書き込みます。 |
4 | public void write(byte[] w) は、指定された配列内の長さ w.length のバイトを OutputStream に書き込みます。 |
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 を作成し、指定された数値をバイナリ形式でファイルに書き込み、コンソールに出力します。
上記のコードはバイナリで記述されているため、文字化けが発生する可能性があります。次のコード例を使用してコード文字化けの問題を解決できます。
//文件名:fileStreamTest2.java importjava.io.*; publicclassfileStreamTest2{ publicstaticvoidmain(String[]args)throwsIOException{ Filef=newFile("a.txt"); FileOutputStreamfop=newFileOutputStream(f); //构建FileOutputStream对象,文件不存在会自动新建OutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8"); //构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); //写入到缓冲区writer.append("rn"); //换行writer.append("English"); //刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉fop.close(); //关闭输出流,释放系统资源 FileInputStreamfip=newFileInputStream(f); //构建FileInputStream对象InputStreamReaderreader=newInputStreamReader(fip,"UTF-8"); //构建InputStreamReader对象,编码与写入相同 StringBuffersb=newStringBuffer(); while(reader.ready()){ sb.append((char)reader.read()); //转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); //关闭读取流fip.close(); //关闭输入流,释放系统资源 } }
ファイルと I/O に関するいくつかのクラスも知っておく必要があります。
ファイルクラス(クラス)
FileReaderクラス(クラス)
FileWriterクラス(クラス)
File クラスには、フォルダーの作成に使用できるメソッドが 2 つあります。
mkdir()メソッドはフォルダーを作成し、成功した場合は true を返し、失敗した場合は false を返します。失敗は、File オブジェクトで指定されたパスがすでに存在するか、パス全体がまだ存在しないためにフォルダーを作成できないことを示します。
mkdirs()メソッドは、フォルダーとそのすべての親フォルダーを作成します。
次の例では、「/tmp/user/java/bin」フォルダーを作成します。
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
上記のコードをコンパイルして実行し、ディレクトリ「/tmp/user/java/bin」を作成します。
注: Java は、UNIX および Windows 上の規則に従ってファイル パス区切り文字を自動的に解決します。 Windows バージョンの Java で区切り文字 (/) を使用しても、パスは正しく解析されます。
ディレクトリは実際には、他のファイルやフォルダーを含む File オブジェクトです。
File オブジェクトを作成し、それがディレクトリである場合、isDirectory() メソッドを呼び出すと true が返されます。
オブジェクトの list() メソッドを呼び出すことで、それに含まれるファイルとフォルダーのリストを抽出できます。
以下に示す例は、list() メソッドを使用してフォルダーの内容を確認する方法を示しています。
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
上記の例のコンパイルと実行結果は次のとおりです。
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
ファイルを削除するには、java.io.File.delete() メソッドを使用します。
次のコードは、ディレクトリ /tmp/java/ を削除します。特定のディレクトリを削除する場合、それを正しく削除するには、ディレクトリ内に他のファイルがないことを確認する必要があります。そうしないと、削除は失敗します。
テストディレクトリ構造:
/tmp/java/ |-- 1.log |-- テスト
import java.io.File; public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } }