💨

プログラミング自主学習 DAY75 InputStream

2023/08/10に公開

InputStream

外部のデーターを読み取る(input)際に、生成されるストリームだ。
InputStreamは最上位の入力ストリームで、抽象クラスだ。
サブクラスとしては、FileInputStream, BufferedInputStream, DataInputStreamなどがある。

https://zenn.dev/eldorado215/articles/207577a50ecafb
昨日、作成したファイルを読む練習をする。

1byteを読む(byte -> int)

read()メソッドは、byteをint型に変換してリータンする。
ストリームから読むbyteをないばい、-1をリターンする。

public class ReadExample {

public static void main(String[] args) {

	InputStream is;
	try {
	    is = new FileInputStream("C:/tmp/test1.db");
		while(true) {
			int data;
			data = is.read();
			if(data ==-1) break;  //+1回周る。
			System.out.println(data);
		}
		is.close();
	}
	catch (FileNotFoundException e) {
		e.printStackTrace();
	}
	catch (IOException e) {
		e.printStackTrace();
	}
     }
}

10
20
30

昨日、dbにwrite()した10,20,30を読み取った。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class ReadExample {

public static void main(String[] args) {

   try(InputStream is = new FileInputStream("C:/tmp/test1.db") ) {
     while(true) {
		int data;
		data = is.read();
		if(data ==-1) break;
		System.out.println(data);
	  }
	}
	catch (IOException e) {
		e.printStackTrace();
	}
   }
}

10
20
30

ストリーム系クラスは、AutoClosableを具象しているため、このようにコードを減らすこともできる。また、IOExceptionは、FileNotFoundExceptionのスパークラスであるため、ポリモーフィズムを利用することも可能である。

byte[]を読む(byte -> int)

read(byte[])メソッドは、byte[]の要素を読み取った回数をint型に変換してリータンする。
つまり、byteを読む時は違い、カウンター数のリターンする。
ストリームから読むbyte配列の要素がないばい、-1をリターンする。

配列の値は新しい配列を生成し、そのアドレスをreadメソッドのパラメータに入れる。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class ReadExample {

public static void main(String[] args) {
		
	try(InputStream is = new FileInputStream("C://tmp/test2.db")){
		
	byte[] data = new byte[100];
		
	while(true) {
	    int num = is.read(data);
	    if(num == -1) break;
		
	    for (int i = 0; i<num; i++) {
		System.out.println(data[i]);
	       }
	  }
     } catch(IOException e) {
		e.printStackTrace();
     }	
   }
}
10
20
30

コピー

写真、動画、音楽などをbyteに変換してInputしてからOutputすることで、ファイルをコピーすることもできる。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class ReadExample {

public static void main(String[] args) {

   String originalFileName = "C://tmp/house.jpg";
   String targetFileName = "C://tmp/house2.jpg";
		
   try(InputStream is = new FileInputStream(originalFileName);
       OutputStream os = new FileOutputStream(targetFileName)){
        byte[] data = new byte[1024];
		  
	while(true) {
	   int num = is.read(data);
	   if(num == -1) break;
	   os.write(data, 0, num);   
	      //最後のbyte配列のdataがどのindexまでにあるか分からないため
	}
	 os.flush();
	System.out.println("copy finished");
        }catch(Exception e) {
	     e.printStackTrace();
       }
     }	
  }

Discussion