JAVA/Java 기초

입출력 스트림.java

john_ 2023. 1. 30. 17:46
728x90

입력 스트림과 출력 스트림

  • 프로그램을 기준으로 데이터가 들어오면 입력 스트림, 데이터가 나가면 출력 스트림
  • 프로그램이 다른 프로그램과 데이터를 교환하려면 양쪽 모두 입력 스트림과 출력 스트림이 필요합니다.

 

 

  • 바이트 스트림 : 그림, 멀티미디어, 문자등 모든 종류의 데이터를 입출력 할때 사용
  • 문자 스트림 : 문자만 입출력 할때 사용

자바는 데이터 입출력과 관련된 라이브러리를 java.io (input/output)패키지에서 제공합니다.

 

  • 바이트 입출력 스트림의 최상위 클래스는 InputStream과 OutputStream 입니다.
  • 문자 입출력 스트림의 최상위 클래스는 Reader와 Writer 입니다.

 


OutputStream

  • OutputStream은 바이트 출력 스트림의 최상위 클래스로, 추상 클래스 입니다.
  • 모든 바이트 출력 스트림 클래스는 이 OutputStream 클래스를 상속 받아서 만들어 집니다.

 

  • OutputStream 클래스에는 모든 바이트 출력 스트림이 기본적으로 가져야 할 메소드가 정의 됩니다.

 

 


1바이트  출력

  • write(int b) 메소드 : 매개값 int (4byte) 에서 끝 1byte 만 출력. 매개변수는 int 타입입니다.

 


WriteExam.java

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

public class writeExam {

	public static void main(String[] args) throws IOException {
		OutputStream os = null;
		
		try {
			os = new FileOutputStream("C:/Temp/test1.db");
			
			byte a = 10;
			byte b = 20;
			byte c = 30;
			
			os.write(a);	//1 byte 씩 출력
			os.write(b);
			os.write(c);

			
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			os.flush();		// 내부 버퍼에 잔류하는 바이트를 출력 후 버퍼 비우기
			os.close();		// 출력 스트림을 닫아 사용한 메모리를 해제합니다.
		}
	}
}
결과 :
C:/Temp/test1.db 파일 생성.(실행 전에 C:/Temp 디렉토리가 존재해야 합니다.)

 

tip)
FileOutputStream 생성자는 주어진 파일을 생성할 수 없으면 IOException을 발생 시킵니다.
write(), flush(), close() 메소드도 IOException이 발생할 수 있으므로 예외 처리를 해야 합니다.

바이트 배열 출력

  • write(byte[] b)  메소드 : 매개값으로 주어진 배열의 모든 바이트를 출력합니다
  • 배열의 일부분을 출력하려면 write(byte[] b, int off, int len) 메소드를 사용합니다.

 

 

 

writeExam2.java

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

public class WriteExam2 {

	public static void main(String[] args) {

		try {
			OutputStream os = new FileOutputStream("c:/Temp/test2.db");
			
//			byte[] array = {10, 20, 30};
			byte[] array = {10, 20, 30, 40, 50};
			
//			os.write(array);
			os.write(array, 1, 3);	//array index[1]부터 3개를 출력 할것.
			
			os.flush();
			os.close();
			
		}	catch (IOException e) {
			e.printStackTrace();
		}
	}
}
결과:
c:/Temp/test2.db 파일 생성

 


 

InputStream

  • InputStream은 바이트 입력 스트림의 최상위 클래스로, 추상클래스 입니다.
  • 모든 바이트 입력 스트림은 InputStream 클래스를 상속받아 만들어 집니다.

 

 

  • InputStream 클래스에는 바이트 입력 스트림이 기본적으로 가져야 할 메소드가 정의됩니다.

 


 

1바이트 입력

  • read() 메소드 : 입력 스트림으로 부터 1byte를 읽고 int(4byte) 타입으로 리턴합니다. 리턴된 4byte 중 끝 1byte 에만 데이터가 들어가 있습니다.

 

  • 더 이상 입력 스트림으로 부터 바이트를 읽을수 없다면 read() 메소드는 -1 을 리턴합니다.
  • 읽을수 있는 마지막 바이트까지 반복해서 한 바이트씩 읽을 수 있습니다.

 


ReadExam.java

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

public class ReadExam {

	public static void main(String[] args) {

		try {
			InputStream is = new FileInputStream("c:/Temp/test1.db");
			
			while(true) {
				int data = is.read();
				if(data == -1) break;	//파일 끝에 도달했을때.
				System.out.println(data);
			}
			
			is.close();	// 입력 스트림을 닫고 사용 메모리 해제
			
		}catch(FileNotFoundException e) {
			e.printStackTrace();	// 파일이 없을때 예외 처리
		}catch(IOException e) {
			e.printStackTrace();	// 파일을 읽어 들일때 예외처리
		}
	}
}
결과 :
10
20
30

 


바이트 배열로 읽기

  • read(byte[] b) 메소드 : 입력 스트림으로 부터 주어진 배열의 길이만큼 바이트를 읽고 배열에 저장한 다음, 읽은 바이트 수를 리턴합니다.
  • read(byte[] b)도 입력 스트림으로 부터 바이트를 더이상 읽을수 없다면 -1을 리턴합니다. 읽을 수 있는 마지막 바이트 까지 반복해서 읽을수 있습니다.
  •  

 

 

ReadExam2.java

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

public class ReadExam2 {

	public static void main(String[] args) {

		try {
			//데이터 출발지를 test2.db 로 하는 입력 스트림 생성
			InputStream is = new FileInputStream("c:/Temp/test2.db");
			
			byte[] data = new byte[100];	// 최대 100byte의 읽은 바이트를 저장할 배열을 생성합니다.
			
			while(true) {
				int num = is.read(data);	// read해서 파일의 내용을 data 배열에 담습니다.
				if(num==-1) break;
				
				for(int i = 0; i<num; i++) {
					System.out.println(data[i]);
				}
				
			}
			
			is.close();	// 입력스트림 닫기
			
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}
결과 :
10
20
30

 


파일 복사 예제

 

CopyExam.java

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

public class CopyExam {

	public static void main(String[] args) throws Exception{
		
		String originalFileName = "c:/Temp/test.jpg";
		String targetFileName = "c:/Temp/test2.jpg";
	
		InputStream is = new FileInputStream(originalFileName);
		OutputStream os = new FileOutputStream(targetFileName);
		
		byte[] data = new byte[64];		//한번에 작업할 최대 바이트수를 설정합니다.
        	//최대 바이트수가 작을수록 속도가 저하됩니다.
		//cpu성능이 좋을수록 최대 바이트수를 크게 설정할수 있습니다.
        
		while(true) {
			int num = is.read(data);	//파일 읽기
			if(num == -1) break;
			os.write(data, 0, num);		//파일 쓰기
		}
		
		os.flush();
		os.close();
		is.close();
		
		System.out.println("복사가 잘 되었습니다.");
	}
}

 

728x90

'JAVA > Java 기초' 카테고리의 다른 글

요소 커스텀 집계.java  (0) 2023.01.30
입출력 스트림-2.java  (0) 2023.01.30
Optional 클래스.java  (0) 2023.01.30
루핑, 매칭, 집계.java  (0) 2023.01.30
정렬. java  (0) 2023.01.30