코딩 기록들

[자바의 다양한 기능들] 7.3 바이트 단위 입출력 스트림 (InputStream) 본문

Java

[자바의 다양한 기능들] 7.3 바이트 단위 입출력 스트림 (InputStream)

코딩펭귄 2024. 1. 16. 00:08

InputStream

  • 바이트 단위 입력 스트림 최상위 추상 클래스
  • 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
주요 하위 클래스 

FileInputStream : 파일에서 바이트 단위로 자료를 읽음

ByteArrayInputStream byte : 배열 메모리에서 바이트 단위로 자료를 읽음

FilterInputStream : 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스

 

주요 메서드

int read() : 입력 스트림으로부터 한 바이트의 자료를 읽음. 읽은 자료의 바이트 수를 반환

int read(byte b[]) : 입력 스트림으로 부터 b[] 크기의 자료를 b[]에 읽음. 읽은 자료의 바이트 수를 반환\

int read(byte b[], int off, int len) : 입력 스트림으로 부터 b[] 크기의 자료를 b[]의 off변수 위치부터 저장하며 len 만큼 읽음.                                                        읽은 자료의 바이트 수를 반환

void close() : 입력 스트림과 연결된 대상 리소스를 닫음

 

 

FileInputStream 예제

예제 1) 파일에서 한 바이트씩 자료 읽기

public class FileInputStreamTest1 {

	public static void main(String[] args) {
		
        FileInputStream fis = null;
		
		try {
			fis = new FileInputStream("input.txt");
            
		    // read는 int로 표현됨
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
		
		} catch (IOException e) {
			System.out.println(e);
		} finally{
			try {
				fis.close();
			} catch (IOException e) {
				System.out.println(e);
			} catch (NullPointerException e){
				System.out.println(e);
			}
		}
		System.out.println("end");
	}

}

 

txt파일 만들어주기 (같은 프로젝트 안에)

input.txt

ABC

 

출력결과

A

B

C

end

 

 

예제 2)  파일의 끝까지 한 바이트씩 자료 읽기

public class FileInputStreamTest2 {

	public static void main(String[] args) {

		try(FileInputStream fis = new FileInputStream("input.txt")){ //이렇게 resource를 안에다 넣으면 auto close되기때문에 별도의 close 안해도 됨
			int i;
            // end of file 까지 읽기
			while ( (i = fis.read()) != -1){ // end of file 이 -1을 반환하므로
				System.out.println((char)i);
			}
			System.out.println("end");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

 

- 파일에서 바이트 배열로 자료읽기 (*배열에 남아있는 자료가 있을수 있음에 유의할 것)

public class FileInputStreamTest3 {

	public static void main(String[] args) {
		 		
		try (FileInputStream fis = new FileInputStream("input2.txt")){
			
            // byte array를 만들어서 읽기
			byte[] bs = new byte[10];
			int i;
            // file의 끝까지 읽기
			while ( (i = fis.read(bs)) != -1){ //byte수(= i)가 -1 = end of file이라는 의미
				
                // case 1
                /*for(byte b : bs){ //이렇게하면 버퍼에 남아있는 값이 함께 출력됨
					System.out.print((char)b);
				}*/
                
                // case 2
				for(int k= 0; k<i; k++){ // 읽은 i 개수만큼만 출력되도록(i반환값 이용)
					System.out.print((char)bs[k]);
				}
				System.out.println(": " +i + "바이트 읽음" );
			}
			 
            // case 3 
			/*while ( (i = fis.read(bs, 1, 9)) != -1){
				for(int k= 0; k<i; k++){
					System.out.print((char)bs[k]);
				}
				System.out.println(": " +i + "바이트 읽음" );
			}*/
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("end");
	}
}
input2.txt 파일 만들기 (같은 프로젝트에!)

ABCDEFGHIJKLMNOPQRSTUVWXYZ

 

출력결과

case 1 case 2 case 3
ABCDEFGHIJ : 10바이트 읽음
KLMNOPQRST : 10바이트 읽음
UVWXYZQRST : 10바이트 읽음
ABCDEFGHIJ : 10바이트 읽음
KLMNOPQRST : 10바이트 읽음
UVWXYZ : 6바이트 읽음
ABCDEFGH : 9바이트 읽음
JKLMNOPQ : 9바이트 읽음
STUVWXY : 8바이트 읽음

 

 

 

 

 

 

 

 

자료출처

fastcampus

한 번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지