본문 바로가기
Back-end/JAVA & Spring

[Java] java.io.FileInputStream 주요 메소드

by 꼬바리 2021. 5. 26.

[ FileInputstream ]

  • java.io의 가장 기본 파일 입출력 클래스
  • 입력 스트림(통로)을 생성해줌
  • 사용법은 간단하지만, 버퍼를 사용하지 않기 때문에 느림
  • 속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 쓰는 경우가 많음

외부 리소스 입출력에 대한 개념과 설명은 아래 링크글을 참조하시면 됩니다.

2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_io / nio / nio2 [1/3]

2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_java.io [2/3]

2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_java.nio [3/3]

 


[ 생성자 ]

  • new FileInputStream(File file)
  • new FileInputStream(FileDescriptor jdObj)
  • new FileInputStream(String name)

생성자는 여러 타입의 매개변수를 받지만 공통적으로 파일의 주소와 이름의 정보를 가진 객체를 받아 해당 파일과의 입력 스트림을 생성합니다.

 


 

[ int read() ]

  • 모두 현재 파일 포인터 위치를 기준으로 함 (파일 포인터 앞의 내용은 없는 것처럼 작동)
  • int read() : 1byte씩 내용을 읽어 정수로 반환
  • int read(byte[] b) : 파일 내용을 한번에 모두 읽어서 배열에 저장
  • int read(byte[] b. int off, int len) : 'len'길이만큼만 읽어서 배열의 'off'번째 위치부터 저장

1byte 크기의 정수로 반환해주기 때문에 문자로 출력하기 위해서는 (char)타입으로 형변환 해줘야 합니다. read()로 읽은 뒤에는 파일 포인터가 마지막에 읽은 위치에 가 있는 점을 유의해야 합니다. 기본 스트림은 특성이 일종의 흐름이므로, 이 파일 스트림의 위치를 정교하게 컨트롤할 수 없다는 단점이 있습니다. 그냥 읽는대로 흘러간다라고 생각하면 됩니다. 이러한 단점을 극복할 수 있는 기능은 'RandomAccessFile' 클래스에 구현되어 있습니다.

 

package study.first;

import java.io.FileInputStream;

public class Main {
	public static void main(String[] args) {

		byte[] arr1 = new byte[20];
		byte[] arr2 = new byte[20];
		
		// 파일 열기 (해제 자동)
		try (FileInputStream fi = new FileInputStream("input.txt")) {
			
			// 1byte만 읽음
			System.out.println((char)fi.read());
			
			// 4글자만 읽어서 배열의 0번 인덱스부터 저장
			fi.read(arr2, 0, 4);
			for(byte a : arr2)
				System.out.print((char)a);
			// 남은 모든 내용 배열에 저장
			fi.read(arr1);
			System.out.println();
			for(byte a : arr1)
				System.out.print((char)a);
			
		// 예외처리
		} catch (Exception e) {

			System.out.println("실패.");
		}	
	}
}

 


[ byte[] readAllBytes() ]

  • 현재 파일 포인터에서 EOF(End Of File)까지의 모든 내용을 byte 타입의 배열(주소)을 반환
  • byte[] 배열의 참조변수 주소로 바로 넣어줄 수도 있고, 아래 코드와 같이 바로 출력도 가능
package study.first;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Main {
	public static void main(String[] args) {
		
		// 파일 열기 (해제 자동, try-with-resources)
		// input.txt : "Hello World..!!"
		try (FileInputStream fi = new FileInputStream("input.txt");
				FileOutputStream fo = new FileOutputStream("output.txt")) {
			
			for(byte b : fi.readAllBytes())
					System.out.print((char)b); // "Hello World..!!"

		// 예외처리
		} catch (Exception e) {

			System.out.println("실패.");
		}	
	}
}

 


 

[ byte[] readNBytes(int len) ]

  • 현재 파일 포인터에서 N byte만큼을 담은 byte 타입 배열 반환
package study.first;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Main {
	public static void main(String[] args) {
		
		// 파일 열기 (해제 자동, try-with-resources)
		// input.txt : "Hello World..!!"
		try (FileInputStream fi = new FileInputStream("input.txt");
				FileOutputStream fo = new FileOutputStream("output.txt")) {
			
			for(byte b : fi.readNBytes(5))
				System.out.print((char)b);  // "Hello"
			
		// 예외처리
		} catch (Exception e) {

			System.out.println("실패.");
		}	
	}
}

 


 

[ int available() ]

  • 현재 파일 포인터 위치에서 읽을 수 있는 바이트 수 반환
package study.first;

import java.io.FileInputStream;

public class Main {
	public static void main(String[] args) {
		
		// 파일 열기 (해제 자동)
		try (FileInputStream fi = new FileInputStream("input.txt")) {
			
			// 현재 읽을 수 있는 바이트 수
			System.out.println(fi.available()); // 15 
			
			// 1byte씩 2번 읽음
			System.out.println((char)fi.read());
			System.out.println((char)fi.read());
			
			System.out.println(fi.available()); // 13
			
			
		// 예외처리
		} catch (Exception e) {

			System.out.println("실패.");
		}	
	}
}

 


 

[ void close() ]

  • 현재 열려 있는 파일을 닫음
  • try-with-resource문 사용 시 자동으로 자원 해제가 되므로 불필요
  • try-catch-finally문 사용 시 사용해줘야 메모리 누수를 방지하고 다른 곳에서 리소스 사용이 가능함
  • finally문 내에서도 역시 예외처리를 해줘야 함
package study.first;

import java.io.FileInputStream;

public class Main {
	public static void main(String[] args) {
				
		FileInputStream fi = null;
		
		// 파일 열기
		try {
			
			fi = new FileInputStream("input.txt");			
						
		// 예외처리
		} catch (Exception e) {

			System.out.println("실패.");
		
		// 파일 닫기 처리 (try-catch-finally문 사용 시)
		} finally {
			
			try {			
				fi.close();
				
			} catch (Exception ex) {				
				System.out.println("파일을 닫을 수 없습니다.");
				
			}
		}
	}
}

 


 

 

[ long skip(long numbytes) ]

  • 매개변수로 받은 바이트 수만큼 파일 포인터를 이동시킴
  • 기본 스트림에서는 파일 포인터가 반대로 돌아오지는 못함
package study.first;

import java.io.FileInputStream;

public class Main {
	public static void main(String[] args) {
				
		FileInputStream fi = null;
		
		// 파일 열기 (try-catch-fianlly)
		// 원문 : Hello World..!!
		try {
			
			fi = new FileInputStream("input.txt");
			fi.skip(6); // 6byte 파일 포인터 이동
			System.out.println((char)fi.read()); // 'W'
		
		// 예외처리
		} catch (Exception e) {

			System.out.println("실패.");
		
		// 파일 닫기 처리 (try-catch-finally문 사용 시)
		} finally {
			
			try {			
				fi.close();
				
			} catch (Exception ex) {				
				System.out.println("파일을 닫을 수 없습니다.");
				
			}
		}
	}
}

 

728x90
반응형

댓글