InputStream, OutputStream
입/출력에 사용되는 기본 클래스. 1byte 단위로 데이터를 전송하는 기본 클래스이다
입력 대상을 프로그램에 입력시에는 InputStream 을 이용한다.
출력 대상을 프로그램에서 출력할시에는 OutputStream 을 이용한다.
InputStream 의 하위 클래스
Outputstream 의 하위 클래스
파일에 데이터를 읽고/쓰기 위한 클래스
객체 생성 형식
파일 객체명 = new FileInputStream("읽어올 해당 파일 경로");
파일 객체명 = new FileOutputStream("출력할 해당 파일 경로"); // 파일이 없으면 새롭게 생성하고 거기에다 출력
// 파일에 "Hello Java" 라고 저장되어 있다고 가정하자.
// CASE1
data1 = inputstream.read(); // 1바이트 단위로 파일에서 읽어옴
print(data1); // "H" 출력
// CASE2
byte[] bs2 = new byte[3];
data2 = inputstream.read(bs2); // 3바이트 단위로 읽어옴
print(data2) "Hel" 출력
write(byte[ ] b); // 전체 쓰기 - 파일에 출력하고자 하는 것을 배열로 묶어서 던지면 한번에 쓰게됨
write( byte[ ] , int off , int len ); // off(시작점), len(길이) - 배열에서 시작점 off에서부터 특정 길이 len 만큼만 파일에 출력함
// CASE1
String data2 = "Hello Java";
byte[] arr = data1.getBytes();
outputstream.write(arr); // "Hello Java" 를 파일에 쓴다
// CASE2
String data2 = "MY World Java";
byte[] arr = data2.getBytes();
outputstream.write(arr,1,5); // "Y Wor" 을 파일에 쓴다
예제 - read() 메소드 1바이트 단위로 읽어오기
InputStream inputstream = null;
try{
inputStream = new FileInputStream("C:\\java\\pjt_ex\\hello.txt");
int data = 0;
while(true){
try{
data = inputStream.read(); // 1바이트씩 계속 읽어옴
}catch(IOException e){ // 더이상 파일에서 읽어올게 없는데
// 읽어오려고 하면 애러가 발생 하므로
e.printStackTrace(); // 애러 매시지 출력함
}
// 파일에 끝에는 -1 이 담겨져 있음
if (data == -1) break; // 파일의 끝이라면 while 문을 break한다
System.out.println("data:" + data);
}
} catch (FileNotFoundException e) { // 해당하는 파일이 없으면
e.printStackTrace(); // 애러 매시지 출력함
} finally{
try{
// 파일 스트림 객체는 마지막에 close() 로 종료시켜 줘야함
if(inputStream != null) inputstream.close();
} catch(IOException e) {
e.printStackTrace();
}
}
예제 - read() 메소드 지정한 배열 크기 단위로 읽어오기
InputStream inputstream = null;
try{
inputStream = new FileInputStream("C:\\java\\pjt_ex\\hello.txt");
int data = 0;
byte[] bs = new byte[3]; // 3 바이트 배열 단위로 파일에서 묶음으로 읽어오기 위해 선언한 배열
while(true){
try{
data = inputStream.read(bs); // 선언한 배열을 read() 의 인자로 넘겨줌.
// 이제 3바이트 단위로 파일에서 읽어올거임.
}catch(IOException e){
e.printStackTrace();
}
if (data == -1) break;
System.out.println("data:" + data);
// 제대로 읽어오는지 출력해봄
for (int i=0; i < bs.length; i++){
System.out.println("bs[" i + "] :" + bs[i]);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally{
try{
if(inputStream != null) inputstream.close();
} catch(IOException e) {
e.printStackTrace();
}
}
예제 - OutputStream( )
OutputStream outputstream = null;
try{
outputStream = new FileInputStream("C:\\java\\pjt_ex\\hello.txt");
String data = "Hello java World!";
byte[] arr = data.getBytes(); // getBytes() : 바이트 단위로 전환
try{
outputStream.write(arr,0,5); // "Hello" 를 파일에 출력한다.
}catch(IOException e){
e.printStackTrace();
}
} catch (FileNotFoundException e){
e.printStackTrace();
} finally{
try{
if(inputStream != null) inputstream.close();
} catch(IOException e) {
e.printStackTrace();
}
}
bytes 단위의 입출력을 개선해서 문자열을 좀 더 편리하게 다룰 수 있다.
DataOutputStream
DataInputStream
String str1 = "Hello java world!";
OutputStream outputStream = null;
DataOutputStream dataOutputStream = null;
try{
// FileOutputStream 객체인 outputSteam 을 이용해 바이너리 타입으로 데이터를 파일에 출력
outputStream = new FileOutputStream("C:\\java\\pjt_ex\\hello.txt");
// outputStreem 을 인자로 주어서 바이트 타입을 본래 타입(문자열) 로 변경해서 출력
dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(str); //
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dataOutputStream != null) dataOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
try{
if (outputStream != null) outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}