💨
プログラミング自主学習 DAY75 InputStream
InputStream
外部のデーターを読み取る(input)際に、生成されるストリームだ。
InputStreamは最上位の入力ストリームで、抽象クラスだ。
サブクラスとしては、FileInputStream, BufferedInputStream, DataInputStreamなどがある。
昨日、作成したファイルを読む練習をする。
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