일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- HashMap
- Array
- 달빛클럽1기
- SWEA
- 알고리즘
- JPA
- 재귀
- Algorithm
- 달빛클럽
- 자바
- 노마드코더 강의
- 백준
- React.js
- SoftwareExpertAcademy
- 달빛캠퍼스
- 카카오블라인드코딩테스트
- 달빛클럽 1기
- BOJ
- 노마드코더
- 리액트
- 인플레이션에서 살아남기
- dfs
- programmers
- Java
- 프로그래머스
- Stack
- React
- ReactJS로 영화 웹 서비스 만들기
- 완전탐색
- 경제공부
- Today
- Total
th42500의 TIL
[Java] 텍스트 파일 읽기 (한 글자, N 글자, 한 줄, N개의 줄) 본문
Java를 이용하여 텍스트 파일 내의 내용을 원하는 만큼 읽어와 콘솔에 뿌려주느 코드를 작성해보고자 한다.
해당 코드는 후에 우리가 csv파일을 읽고 데이터 처리를 하는 프로젝트를 하는데에 하나의 중요한 기능이 된다.
🛠 실습 환경
✔ JDK : AdoptOpenJDK 11
✔ IntelliJ : 2022.2.3
✔ 원하는 텍스트 파일 1개 준비
👉 나는 아래와 같은 내용이 담긴 텍스트 파일(hello.txt)을 준비하였음
hello everyone
hello java
💡 글자 수별로 텍스트 파일 읽어오기
파일을 읽어오기 위해서는 java.io 패키지의 FileReader class를 사용하여야 한다
✔ FileReader 클래스
👉 java.io 패키지의 클래스 중 하나
👉 기본 버퍼 크기를 사용하여 문자 파일에서 텍스트를 읽는 클래스
👉 Object - Reader - InputStreamReader 클래스를 상속받음
Reads text from character files using a default buffer size. Decoding from bytes to characters uses either a specified charset or the platform's default charset.
The FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider using a FileInputStream.
- JDK 11 API DOCS 중 FileReader 설명 -
1️⃣ 텍스트 파일에서 한 글자 읽어오기
package com.bigdata;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class FileExercise {
private char readAChar(String filename) throws IOException {
FileReader fileReader = new FileReader(filename);
return (char)fileReader.read();
}
public static void main(String[] args) throws IOException {
FileExercise fileExercise = new FileExercise();
String filename = "./hello.txt";
char ch = fileExercise.readAChar(filename);
System.out.println(ch);
}
}
👉 FileReader 클래스는 Object - Reader - InputStreamReader 클래스를 상속받음
👉 FileReader 클래스의 InputStraemReader로부터 상속받은 read() 메서드를 이용하여 한글자의 문자를 읽어 결과를
반환하는 readAChar() 메서드를 구현하였음
👉 read() 메서드의 반환타입은 int형으로 아스키코드값을 return하거나 더 이상 읽을 글자가 없다면 -1을 return
👉 read() 메서드는 기본적으로 입출력 오류 발생에 대비하여 IOException 예외 처리를 해주어야 함
💡 실행결과
2️⃣ 텍스트 파일에서 N 글자 읽어오기
package com.bigdata;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileExercise {
private String filename;
public FileExercise(String filename) {
this.filename = filename;
}
private String readChars(int N) throws IOException {
FileReader fileReader = new FileReader(this.filename);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
int ascii = fileReader.read();
if(ascii == -1) { // 더 이상 읽을 글자가 없다면
return sb.toString();
}
sb.append((char)ascii);
}
return sb.toString();
}
public static void main(String[] args) throws IOException {
FileExercise fileExercise = new FileExercise("./hello.txt");
String str = fileExercise.readChars(3);
System.out.println(str);
}
}
👉 생성자를 이용하여 filename을 저장할 수 있도록하고 readChars() 메서드의 매개변수로는 출력할 글자수만 넘겨받도록 구현
👉 출력할 글자수만큼 for문을 이용하여 반복하되, 중간에 더이상 읽을 글자가 없을 경우 FileReader 클래스의 read() 메서드에 의해 -1이 반환되므로 이때는 그동안 입력받았던 문자열을 반환하도록 함
👉 String은 문자열 연산시 새로운 객체를 생성하여 이를 참조하지만, StringBuilder는 동일 객체내에서 문자열을 변경하는 것이 가능하므로 메모리 효율성을 위해 StringBuilder를 이용하여 문자열 연산을 수행 (물론, 이런 간단한 프로젝트에서는 String을 사용해도 상관없음)
💡 실행결과
💡 라인별로 텍스트 파일 읽어오기
파일을 읽어오기 위해서는 java.io 패키지의 FileReader class를 사용하여야 한다
✔ BufferedReader 클래스
👉 java.io 패키지의 클래스 중 하나
👉 입력 스트림에서 문자를 읽는 함수로, 문자나 배열 라인들을 효율적으로 읽기 위해 문자들을 버퍼에 저장하고 읽음
👉 버퍼 사이즈는 직접 지정할 수도 있지만 지정을 하지 않을 경우 default 사이즈가 적용됨
👉 Object - Reader 클래스를 상속받음
Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.
The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.
In general, each read request made of a Reader causes a corresponding read request to be made of the underlying character or byte stream. It is therefore advisable to wrap a BufferedReader around any Reader whose read() operations may be costly, such as FileReaders and InputStreamReaders. For example,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
will buffer the input from the specified file. Without buffering, each invocation of read() or readLine() could cause bytes to be read from the file, converted into characters, and then returned, which can be very inefficient.
Programs that use DataInputStreams for textual input can be localized by replacing each DataInputStream with an appropriate BufferedReader.
- JDK 11 API DOCS 중 BufferedReader 설명 -
3️⃣ 텍스트 파일에서 한 줄 읽어오기
package com.bigdata;
import java.io.*;
public class FileExercise {
private String filename;
public FileExercise(String filename) {
this.filename = filename;
}
private String readALine() throws IOException {
FileReader fileReader = new FileReader(this.filename);
BufferedReader br = new BufferedReader(fileReader);
return br.readLine();
}
public static void main(String[] args) throws IOException {
FileExercise fileExercise = new FileExercise("./hello.txt");
String str1 = fileExercise.readALine();
System.out.println(str1);
}
}
👉 라인별로 읽어오기 위해 BufferedReader의 생성자에 FileReader를 매개변수로 넘겨줌으로써 라인별로 읽을 수
있도록 구현
👉 BufferedReader 클래스의 .readLine() 메서드를 한 번 이용하여 텍스트 첫 줄을 읽어옴
💡 실행 결과
4️⃣ 텍스트 파일에서 N 줄 읽어오기
package com.bigdata;
import java.io.*;
public class FileExercise {
private String filename;
public FileExercise(String filename) {
this.filename = filename;
}
private String readAll() throws IOException {
FileReader fileReader = new FileReader(this.filename);
BufferedReader br = new BufferedReader(fileReader);
StringBuilder sb = new StringBuilder();
String str;
while((str = br.readLine()) != null) {
sb.append(str);
sb.append("\n"); // 줄바꿈
}
return sb.toString();
}
public static void main(String[] args) throws IOException {
FileExercise fileExercise = new FileExercise("./hello.txt");
String str2 = fileExercise.readAll();
System.out.println(str2);
}
}
👉 BufferedReader 클래스의 readLine()을 활용하여 여러줄을 읽어 파일 전체의 내용을 반환하는 기능을 구현
👉 String변수에 br.readLine()을 이용하여 한 줄씩 데이터를 저장하되, 만약 str값이 null이라면 while문을 종료하도록 함
👉 readLine()은 줄바꿈 문자를 기준으로 한 줄씩 읽으므로 파일을 읽어올때 줄바꿈 문자를 직접 입력해주어야 함
👉 readLine() 메서드는 기본적으로 입출력 오류 발생에 대비하여 IOException 예외 처리를 해주어야 함
💡 실행 결과
이렇게 오늘은 Java를 이용하여 파일 내용을 읽는 기능들을 구현해보았다.
다음에는 해당 기능들을 기반으로 대용량 데이터를 읽어보는 기능을 구현할 예정이다.
'ComputerLanguage > Java' 카테고리의 다른 글
[Java] 객체지향설계 5원칙 : SOLID (0) | 2022.11.04 |
---|---|
[Java] 데이터 읽기 & 읽은 데이터 원하는 데이터 형식으로 가공해보기 (0) | 2022.10.08 |
[Java] 현재 Directory 내에 있는 File 확인하기 (0) | 2022.10.06 |
[Java] 입/출력 처리 (0) | 2021.12.24 |
[Java] 변수 (0) | 2021.12.15 |