⚡️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의 차이
맥 이클립스 자바 파일 읽기, 불러오기, 자바 텍스트 파일 불러오기, 자바 txt 읽기, FileInputStream 생성자, FileInputStream 메소드, FileInputStream FileReader 차이, FileReader BufferedReader, 파일 한줄씩 읽기, 불러오기
'Java, JSP' 카테고리의 다른 글
[Java/자바] 람다식(Lambda Expression), 함수형 인터페이스 사용법 (0) | 2022.01.20 |
---|---|
[Java/자바] 쓰레드/Thread 사용법 (상속, Runnable) (0) | 2022.01.19 |
[Java/자바] ArrayList 사용법 (4) | 2022.01.13 |
[Java/자바] 해시맵, HashMap 사용법과 EntrySet, Iterator (0) | 2022.01.11 |
[Java/자바] 객체 비교, equals()와 hashCode() (0) | 2022.01.10 |
댓글