Javaストリーム、ファイル、IO


Java.io パッケージには、入出力の操作に必要なほぼすべてのクラスが含まれています。これらすべてのストリーム クラスは、入力ソースと出力先を表します。

Java.io パッケージのストリームは、基本型、オブジェクト、ローカライズされた文字セットなど、多くの形式をサポートしています。

ストリームは、一連のデータとして理解できます。入力ストリームはソースからのデータの読み取りを表し、出力ストリームは宛先へのデータの書き込みを表します。

Java は I/O に対する強力かつ柔軟なサポートを提供し、ファイル転送やネットワーク プログラミングでより広く使用されています。

ただし、このセクションでは、ストリームと I/O に関連する最も基本的な関数について説明します。これらの関数を例を通して 1 つずつ学習していきます。


コンソール入力の読み取り

Java のコンソール入力は System.in によって行われます。

コンソールにバインドされた文字ストリームを取得するには、System.in を BufferedReader オブジェクトでラップして文字ストリームを作成します。

以下は、BufferedReader を作成するための基本的な構文です:

BufferedReader br = new BufferedReader(new 
                      InputStreamReader(System.in));

BufferedReader オブジェクトが作成された後、read() メソッドを使用してコンソールから文字を読み取るか、readLine() メソッドを使用して文字列を読み取ることができます。 。


コンソールから複数文字入力を読み取ります

BufferedReader オブジェクトから文字を読み取るには、read() メソッドを使用します。その構文は次のとおりです:

int read( ) throws IOException

read() メソッドが呼び出されるたびに、1 つずつ読み取ります入力ストリーム文字から文字を取得し、その文字を整数値として返します。 ストリームが終了すると -1 を返します。このメソッドは IOException をスローします。

次のプログラムは、read() メソッドを使用して、ユーザーが「q」を入力するまでコンソールから文字を継続的に読み取る方法を示しています。

// 使用 BufferedReader 在控制台读取字符

import java.io.*;

public class BRRead {
   public static void main(String args[]) throws IOException
   {
      char c;
      // 使用 System.in 创建 BufferedReader 
      BufferedReader br = new BufferedReader(new 
                         InputStreamReader(System.in));
      System.out.println("Enter characters, 'q' to quit.");
      // 读取字符
      do {
         c = (char) br.read();
         System.out.println(c);
      } while(c != 'q');
   }
}

上記の例のコンパイルと実行結果は次のとおりです:

Enter characters, 'q' to quit.
123abcq
1
2
3
a
b
c
q

コンソールから文字列を読み取る

標準入力から文字列を読み取るには、BufferedReader の readLine() メソッドを使用する必要があります。

その一般的な形式は次のとおりです:

String readLine( ) throws IOException

以下のプログラムは、「end」という単語が入力されるまで文字の行を読み取って表示します。

// 使用 BufferedReader 在控制台读取字符
import java.io.*;
public class BRReadLines {
   public static void main(String args[]) throws IOException
   {
      // 使用 System.in 创建 BufferedReader 
      BufferedReader br = new BufferedReader(new
                              InputStreamReader(System.in));
      String str;
      System.out.println("Enter lines of text.");
      System.out.println("Enter 'end' to quit.");
      do {
         str = br.readLine();
         System.out.println(str);
      } while(!str.equals("end"));
   }
}

上記の例のコンパイル結果と実行結果は次のとおりです:

Enter lines of text.
Enter 'end' to quit.
This is line one
This is line one
This is line two
This is line two
end
end

JDK 5 以降のバージョンでは、Java Scanner クラスを使用してコンソール入力を取得することもできます。

コンソール出力

前述したように、コンソール出力はprint()とprintln()によって完了します。これらのメソッドは PrintStream クラスによって定義され、System.out はこのクラスのオブジェクトへの参照です。

PrintStream は OutputStream クラスを継承し、メソッド write() を実装します。このように、write() を使用してコンソールに操作を書き込むこともできます。

PrintStream write() を定義する最も単純な形式は次のとおりです:

void write(int byteval)

このメソッドは、byteval の下位オクテットをストリームに書き込みます。

次の例では、write() を使用して文字「A」と次の改行文字を画面に出力します:

import java.io.*;

// 演示 System.out.write().
public class WriteDemo {
   public static void main(String args[]) {
      int b; 
      b = 'A';
      System.out.write(b);
      System.out.write('\n');
   }
}

上記の例を実行して、出力ウィンドウに文字「A」を出力します

A

注: write print() メソッドと println() メソッドを使用する方が便利なので、() メソッドはあまり使用されません。


ファイルの読み取りと書き込み

前に述べたように、ストリームはデータのシーケンスとして定義されます。入力ストリームはソースからデータを読み取るために使用され、出力ストリームはターゲットにデータを書き込むために使用されます。

次の図は、入力ストリームと出力ストリームを説明するクラス階層図です。

12-130Q122402I57.jpg

以下で説明する 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 オブジェクトを作成した後、次のメソッドを使用してストリームを読み取ったり、他のストリーム操作を実行したりできます。

シリアル番号メソッドと説明
1public void close() throws IOException{}
このファイル入力ストリームを閉じ、このストリームに関連するすべてのシステム リソースを解放します。 IOExceptionをスローします。
2protected void Finalize()throws IOException {}
このメソッドはファイルへの接続をクリアします。ファイル入力ストリームが参照されなくなったら、必ずファイル入力ストリームの close メソッドを呼び出してください。 IOExceptionをスローします。
3public int read(int r)throws IOException{}
このメソッドは、InputStream オブジェクトから指定されたバイトのデータを読み取ります。整数値として返されます。データの次のバイトを返すか、終わりに達した場合は -1 を返します。
4public int read(byte[] r) throws IOException{}
このメソッドは、入力ストリームから r.length バイトを読み取ります。読み取られたバイト数を返します。ファイルの終わりの場合は、-1 が返されます。
5public int available() throws IOException{}
この入力ストリームの次のメソッド呼び出しによってブロックされずに、この入力ストリームから読み取れるバイト数を返します。整数値を返します。

InputStream に加えて、他の入力ストリームもあります。詳細については、以下のリンクを参照してください:

  • ByteArrayInputStream

  • DataInputStream


このクラスはファイルの作成に使用されます。ファイルに送信します データを書き込みます。

ストリームが出力用にファイルを開く前にターゲット ファイルが存在しない場合、ストリームはファイルを作成します。

FileOutputStream オブジェクトの作成に使用できるコンストラクターが 2 つあります。

文字列タイプのファイル名を使用して出力ストリーム オブジェクトを作成します:

OutputStream f = new FileOutputStream("C:/java/hello")

ファイル オブジェクトを使用して、ファイルを書き込むための出力ストリームを作成することもできます。まず File() メソッドを使用してファイル オブジェクトを作成する必要があります:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

OutputStream オブジェクトを作成した後、次のメソッドを使用してストリームに書き込んだり、他のストリーム操作を実行したりできます。

シリアル番号メソッドと説明1public void close() throws IOException{}2protected void Finalize()throws IOException {}3public void write(int w)throws IOException{}4public void write(byte[] w)

OutputStream に加えて、他の出力ストリームもあります。詳細については、以下のリンクを参照してください。

  • ByteArrayOutputStream

  • DataOutputStream

Example

以下は、の使用法を示す例です。 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
import java.io.*;

public class fileStreamTest2{
	public static void main(String[] args) throws IOException {
		
		File f = new File("a.txt");
		FileOutputStream fop = new FileOutputStream(f);
		// 构建FileOutputStream对象,文件不存在会自动新建
		
		OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
		// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
		
		writer.append("中文输入");
		// 写入到缓冲区
		
		writer.append("\r\n");
		//换行
		
		writer.append("English");
		// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
		
		writer.close();
		//关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
		
		fop.close();
		// 关闭输出流,释放系统资源

		FileInputStream fip = new FileInputStream(f);
		// 构建FileInputStream对象
		
		InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
		// 构建InputStreamReader对象,编码与写入相同

		StringBuffer sb = new StringBuffer();
		while (reader.ready()) {
			sb.append((char) reader.read());
			// 转成char加到StringBuffer对象中
		}
		System.out.println(sb.toString());
		reader.close();
		// 关闭读取流
		
		fip.close();
		// 关闭输入流,释放系统资源

	}
}

FileとI/O

ファイルとIに関するクラスもいくつかあります。 /O、私たちも知っておく必要があります: iFile クラス (クラス)

  • FileRereader クラス (クラス)

  • 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);
          // 现在创建目录
          d.mkdirs();
      }
    }
  • 上記のコードをコンパイルして実行し、ディレクトリ「/tmp/user/java/bin」を作成します。

注:

Java は、UNIX と Windows の規則に従ってファイル パス区切り文字を自動的に区別します。 Windows バージョンの Java で区切り文字 (/) を使用しても、パスは正しく解析されます。

ディレクトリの読み取り

ディレクトリは実際には、他のファイルやフォルダーを含む File オブジェクトです。

File オブジェクトを作成し、それがディレクトリである場合、isDirectory() メソッドを呼び出すと true が返されます。

オブジェクトの list() メソッドを呼び出すことで、それに含まれるファイルとフォルダーのリストを抽出できます。

以下に示す例は、 list() メソッドを使用してフォルダーに含まれる内容を確認する方法を示しています:

import java.io.File;

public class DirList {
   public static void main(String args[]) {
      String dirname = "/tmp";
      File f1 = new File(dirname);
      if (f1.isDirectory()) {
         System.out.println( "Directory of " + dirname);
         String s[] = f1.list();
         for (int i=0; i < s.length; i++) {
            File f = new File(dirname + "/" + s[i]);
            if (f.isDirectory()) {
               System.out.println(s[i] + " is a directory");
            } else {
               System.out.println(s[i] + " is a file");
            }
         }
      } else {
         System.out.println(dirname + " is not a directory");
    }
  }
}

上記の例のコンパイルと実行結果は次のとおりです:

Directory of /tmp
bin is a directory
lib is a directory
demo is a directory
test.txt is a file
README is a file
index.html is a file
include is a directory

このファイル入力ストリームを閉じ、このストリームに関連するすべてのシステム リソースを解放します。 IOExceptionをスローします。
このメソッドはファイルへの接続をクリアします。ファイル入力ストリームが参照されなくなったら、必ずファイル入力ストリームの close メソッドを呼び出してください。 IOExceptionをスローします。
このメソッドは、指定されたバイトを出力ストリームに書き込みます。
指定された配列内の w.length 長さのバイトを OutputStream に書き込みます。