입출력 스트림

자바에서 데이터는 스트림을 통해 입출력 된다. 스트림은 단일 뱡향으로 연속적으로 흘러가는 것을 말하는데,

물이 높은 곳에서 낮은 곳으로 흐르는듯이 데이터는 출발지에서 도착지로 흘러간다.

프로그램이 출발지냐 또는 도착지냐에 따라서 사용하는 스트림의 종류가 결정된다. 

 

 

입출력 스트림의 종류

바이트 기반 스트림 : 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용

문자 기반 스트림 : 문자 데이터를 읽고 출력할 때 사용

스트림 클래스가 바이트 기반인지, 문자 기반인지 구별하려면 최상위 클래스를 보면 된다. 

 

 

바이트 출력 스트림 : Out Put Stream

Out Put Stream은 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스이다. 모든 바이트 기반 출력 스트림 클래스는

Out Put Stream 클래스를 상속받아서 만들어 진다.

 

write(int b) 메소드

해당 메소드는 매개 변수로 주어지는 int(4byte)에서 끝 1byte만 출력 스트림으로 보낸다. 매개 변수가 int

타입이므로 4byte 모두 보내는 것은 아니다. 

 

 

 

밑에 예제는 10, 20 30이 저장된 각각의 바이트 파일 C:\Temp\test1.db로 출력해서

test1.db 내용으로 저장하는 예제

package sec01.exam01;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class WriteEx {

	public static void main(String[] args) throws InterruptedException, IOException {
		// 스트림 
		OutputStream os = new FileOutputStream("c:/Temp/test1.db");// 해당 위치에 파일 생성
		
		
		// 파일에 값입력
		byte a = 10;
		byte b = 20;
		byte c = 30;
		
		// 1byte씩 출력
		os.write(a);
		os.write(b);
		os.write(c);
		

		
		os.flush();// 출력 버퍼에 잔류하는 모든 바이트 출력
		os.close();// 출력 스트림을 닫음 
		
	}

}

 

 

 

밑에 예제는 10, 20 30이 저장된 배열을 파일 C:\Temp\test2.db로 출력해서

test2.db 내용으로 저장하는 예제

 

배열 전체를 출력하기

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class WriteEx {

	public static void main(String[] args) throws InterruptedException, IOException {
		// 스트림 
		OutputStream os = new FileOutputStream("c:/Temp/test2.db");// 해당 위치에 파일 생성
		
		

		
		byte[] array = {10, 20, 30};
		os.write(array); // 배열의 모든 바이트를 출력
		
		os.flush();// 출력 버퍼에 잔류하는 모든 바이트 출력
		os.close();// 출력 스트림을 닫음 
		
	}

}

 

 

write(byte[ ] b, int, off, int len ) 메소드

해당 메소드는 b(off)부터 len개의 바이트를 출력 스트림으로 보낸다. 

 

밑에 예제는 10, 20, 30, 40, 50이 저장된 배열에서 20, 30, 40을 추려서 파일 C:\Temp\test3.db

출력해서 test3.db의 내용으로 저장한다.

package sec01.exam01;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class WriteEx {

	public static void main(String[] args) throws InterruptedException, IOException {
		// 스트림 
		OutputStream os = new FileOutputStream("c:/Temp/test3.db");// 해당 위치에 파일 생성
		
		
		byte[] array = {10, 20, 30, 40, 50};
		os.write(array, 1, 3); // 배열의 1번 인덱스부터 3개를 출력
		
		os.flush();// 출력 버퍼에 잔류하는 모든 바이트 출력
		os.close();// 출력 스트림을 닫음 
		
	}

}

 

 

 

 

 

 

바이트 입력 스트림 : IN Put Stream

 

 

read( ) 메소드 

해당 메소드는 입력 스트림으로부터 1byte를 읽고 int(4byte) 타입으로 리턴 한다. 따라서 리턴된 4byte 중 끝

1byte에만 데이터가 들어 있다.

 

package sec01.exam01;

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

public class ReadEx {
	// 파일 읽어오기
	public static void main(String[] args) throws Exception {
		InputStream is = new FileInputStream("c:/Temp/test2.db");
		
		
		while(true) {
			int data = is.read(); // 1byte씩 읽기
			if(data == -1) break;// -1을 리턴하면 자료가 없다.( 파일 끝에 도달했을 경우 )
			System.out.println(data);
		}
		
		
		
		is.close();
	}

}
위에서 출력한 test2.db 읽기 
<결과>
10
20
30

 

 

read(byte[ ] b) 메소드

해당 메소드는 입력 스트림으로부터 매개값으로 주어진 배열의 길이만큼 바이트를 읽고 해당 배열에 저장한다.

그리고 읽은 바이트 수를 리턴한다. 실제로 읽은 바이트 수가 배열의 길이보다 적을 경우, 읽은 수 만큼만 리턴

많은 양의 바이트를 읽을 때는 read(byte[ ] b) 메소드를 사용하는 것이 좋다. 

입력 스트림으로 부터 100개의 바이트가 들어온다면 read() 메소드는 100번을 반복해서 읽어야 하지만,

read(byte[ ] b) 메소드는 한 번 읽을 때 배열의 길이만큼 읽기 때문에 읽는 횟수가 현저히 줄어든다.

 

 

package sec01.exam01;

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

public class ReadEx {
	// 파일 읽어오기
	public static void main(String[] args) throws Exception {
		InputStream is = new FileInputStream("c:/Temp/test3.db");
		

		
		
		// 임시 저장 공간
		byte[] buffer = new byte[100];
		
		while(true) {
			int data = is.read(buffer);
			if(data == -1) break;// -1을 리턴하면 자료가 없다.
			for(int i = 0; i < data; i++) {
				System.out.println(buffer[i]);
			}
		}
		is.close();
	}

}
위에서 작성했던 test3.db 파일 입력 스트림을 생성
<결과>
20
30
40

 

 

 

read( byte[ ] b, int off, int len ) 메소드

해당 메소드는 입력 스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 읽은 바이트 수인 len개를 리턴한다. 실제로 읽은 바이트 수가 len개보다 작을 경우에는 읽은 수만큼만 리턴해당 메서드도 동일하게 입력 스트림으로부터 바이트를 더 이상 읽을 수 없다면 -1을 리턴한다.

 

지정한 길이만큼 읽기

package sec01.exam02;

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

public class ReadEx {
	// read( ) 메소드
	public static void main(String[] args) throws IOException {
		InputStream is = new FileInputStream("c:/Temp/test1.db");
		
		byte[] buffer = new byte[5];
		
		// 입력 스트림으로 부터 3byte를 읽고 buffer[2], buffer[3], buffer[4]에 각각 저장 
		int readByteNum = is.read(buffer, 2, 3);
		if(readByteNum != -1) { // 읽은 바이트가 있다면 
			for(int i=0; i<buffer.length; i++) {// 배열 전체를 읽고 출력
				System.out.println(buffer[i]);
			}
		}
		is.close();
	}

}

 

 

 

 

문자 출력 스트림 : Writer

문자 기반 출력 스트림의 최상위 클래스로 추상클래스이다. 모든 문자 기반 출력 스트림 클래스는 Writer 클래스를 상속

받아서 만들어진다.

 

 

 

write( int c ) 메소드

 해당 메소드는 매개 변수로 주어지는 int(4byte)에서 끝 2byte(1개의 문자)만 출력 스트림으로 보낸다.

매개 변수가 int 타입이므로 4byte 모두를 보내는 것은 아니다.

package sec01.exam02;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
	
public class WriteEx {

	public static void main(String[] args) throws IOException {
		Writer writer = new FileWriter("c:/Temp/test7.db");// 스트림 생성 
//		Writer은 부모 클래스 FileWriter 자식 클래스 자동 타입 변환          
        
		// 한문자씩 출력 	
		char a = 'a';
		char b = '비';
		char c = 'c';
		
		writer.write(a);
		writer.write(b);
		writer.write(c);
		

	
		
		writer.flush();// 출력 버퍼에 잔류하는 모든 문자를 출력
		writer.close();// 출력 스트림을 닫음
	}

}

 

 

write( char[ ] cbuf ) 메소드

해당 메소드는 매개값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보낸다.

package sec01.exam02;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
	
public class WriteEx {

	public static void main(String[] args) throws IOException {
		Writer writer = new FileWriter("c:/Temp/test7.db");

		
		// 배열 전체를 출력하기
		char[] array = {'A', 'B', 'C'};
		
		writer.write(array);
	
		
		writer.flush();
		writer.close();
	}

}

 

'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글

2023-06-29 30일차  (0) 2023.06.29
2023-06-28 29일차  (0) 2023.06.28
2023-06-22 25일차  (0) 2023.06.22
2023-06-21 24일차  (0) 2023.06.21
2023-06-20 23일차  (0) 2023.06.20

+ Recent posts