본문 바로가기
Java, JSP

[Java/자바] FileInputStream, FileReader, 파일 불러오기

by LasBe 2022. 1. 14.
반응형

⚡️FileInputStream


자바에서는 다양한 타입의 확장자를 가진 파일을 읽기 위해 FileInputStream 클래스를 이용합니다.

 

이 클래스를 이용하면 파일에서 바이트 단위로 입력이 가능해 다른 입력 클래스들과 연결해서 데이터를 읽어올 수 있습니다.

 

이번에는 간단하게 txt 파일을 읽어보며 FileInputStream 클래스에 대해 알아보겠습니다.

 

 

 

⚡️FileInputStream 사용법


📌 FileInputStream 생성자

우선 FileInputStream의 생성자에는 두가지가 존재합니다.

FileInputStream(File file) File 객체가 가리키는 파일을 바이트 스트림으로 읽기 위해 FileInputStream 객체를 생성
FileInputStream(String s) 생성자에 담긴 파일의 주소를 찾아 바이트 스트림으로 읽기 위해 FileInputStream 객체를 생성

📌 FileInputStream 경로 지정

읽어올 텍스트 파일을 만들어 패키지 안에 넣어주도록 합니다.

 

생성자에 텍스트 파일의 주소를 넣어주는데

src 폴더 내부에 있는 파일이라면 src/패키지이름/파일이름 으로 간단하게 경로 지정을 할 수 있습니다.

File file = new File("src/file/text.txt");
FileInputStream fis1 = new FileInputStream(file);

FileInputStream fis2 = new FileInputStream("src/p0112/FileInputStreamEx.java");

 

a만약 맥을 사용하시는데 바깥에 있는 파일을 불러오고 싶다면 Finder에서 아래와 같이 간단하게 경로 복사가 가능합니다.

 

그리고 복사한 경로를 생성자에 붙여넣기만 하면 파일을 불러올 수 있습니다.

 


📌 FileInputStream 메소드

int read() 1byte씩 내용을 읽어 정수로 반환
int read(byte[] b) 파일 내용을 한번에 모두 읽어서 배열에 저장
int read(byte[] b, int off, int len) "len"길이만큼 읽어서 배열의 "off"번재 위치부터 저장
int available() 현재 파일 포인터 위치에서 읽을 수 있는 바이트 수 반환
void close() 현재 열려있는 파일을 닫음

String 생성자
String(byte[] b, int start_index, int len) 인자의 바이트 배열중 일부분을 인덱스로 지정하여 스트링 객체를 생성한다.

📌 FileInputStream으로 텍스트 파일 읽어오기 

public static void main(String[] args) throws IOException { // 예외처리
	
	FileInputStream fis = new FileInputStream("src/file/text.txt");
	
	int data = 0;
	
	while((data=fis.read())!=-1) { // 한글자씩 불러오기
		System.out.println((char)data);
	}
	
    	//파일을 다시 읽을 때 객체 다시 생성
	fis = new FileInputStream("src/file/text.txt");
	
	byte[] buf = new byte[fis.available()];

	while((data=fis.read(buf,0,buf.length))!= -1) { // 전체 읽어오기
		System.out.println(new String(buf,0,data));
		System.out.println("end--------------------------------------");
	}
    	fis.close();
}

파일을 한글자씩 읽어올 땐 read() 메소드로 정수를 리턴받아 char 형 변환을 해주는 작업이 필요합니다.

 

읽었던 파일을 다시 읽을 땐 객체를 다시 한번 생성해 주어야 합니다.

 

그 이유는 자바에서 파일을 열어 읽게 되면 파일 포인터가 읽은 만큼 이동하게 되는데

만약 파일을 모두 읽은 상태에서 다시 한번 파일을 읽게 되면 포인터가 0으로 고정이 되어 반복문이 무한하게 돌게 됩니다.

 

그 다음은 버퍼 배열과 메소드 avaliable()을 이용해 파일 전체를 읽어오는 방법입니다.

 

위에 설명해놓은 메소드를 확인해보면 파일 전체의 길이를 입력받아

String 생성자를 통해 파일 전체를 정상적으로 불러오는 것을 알 수 있습니다.

 

그렇다면 한줄씩 읽어오는 것은 어떻게 할까요?

 

다른 방법들도 있겠지만 저는 BufferedReader를 통해 파일의 데이터를 한줄씩 불러오겠습니다.


📌 FileReader로 경로 지정하고 BufferedReader로 파일 읽어오기

File file = new File("src/file/text.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);

String line = "";

while((line=br.readLine()) != null) {
	System.out.println(line);
}

FileReader는 FileInputStream과 거의 유사하지만 사소한 차이가 있습니다.

 

FileInputStream은 InputStream을 상속받아 구현되어 바이트 단위로 처리하고,

FileReader는 InputStreamReader->Reader 클래스로부터 구현되어 문자 단위로 처리합니다.

 

대부분의 메소드가 비슷하기 때문에 동일한 방식으로 사용이 가능합니다.

 

BufferedReader에 생성자 파라미터로 들어갈 수 있는 것은 FileReader이기 때문에  파일리더에 경로를 담아줍니다.

 

그 후 BufferedReader의 readLine() 메소드를 통해 파일의 데이터를 한줄 씩 불러올 수 있습니다.

 

자세한 BufferedReader의 설명은 이 글을 참고해주세요.

2021.12.26 - [Language/Java] - [Java/자바] 입력 BufferedReader와 Scanner의 차이

 

[Java/자바] 입력 BufferedReader와 Scanner의 차이

알고리즘 풀이 속도 차이 백준에서 자바로 같은 문제를 풀어도 상위권 풀이들과 비교하면 3~4배의 속도 차이를 보인다. 이유는 간단했다. 나는 입력으로 Scanner를 상위권 풀이는 BufferedReader를 사

lasbe.tistory.com

 

더보기

맥 이클립스 자바 파일 읽기, 불러오기, 자바 텍스트 파일 불러오기, 자바 txt 읽기, FileInputStream 생성자, FileInputStream 메소드, FileInputStream FileReader 차이, FileReader BufferedReader, 파일 한줄씩 읽기, 불러오기

반응형

댓글


오픈 채팅