일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- table
- vscode
- json
- CMD
- Array
- js
- 문자열
- 이클립스
- CSS
- IntelliJ
- 자바
- 테이블
- Visual Studio Code
- windows
- input
- Files
- Eclipse
- Button
- 자바스크립트
- date
- 인텔리제이
- 배열
- javascript
- html
- 이탈리아
- Maven
- list
- string
- Java
- ArrayList
- Today
- Total
어제 오늘 내일
[Java] 텍스트 파일 읽기 ( FileReader, BufferedReader, Scanner, Files ) 본문
Java에서는 여러 가지 방법으로 텍스트 파일의 내용을 읽을 수 있습니다.
이번 글에서는 Java에서 텍스트 파일을 읽는 방법을 소개합니다.
- FileReader
- BufferedReader
- Scanner
- Files
먼저, 아래의 내용이 담긴 txt 파일을 준비합니다.
hello
how are you
nice to meet you
1. FileReader
FileReader(File file)
FileReader(File file, Charset charset) // Java 11 이후
FileReader(FileDescriptor fd)
FileReader(String fileName)
FileReader(String fileName, Charset charset) // Java 11 이후
FileReader는 character 파일을 읽을 수 있는 기능을 제공합니다.
인코딩을 지정할 수도 있는데, 이 기능은 Java 11 이후에서만 제공됩니다.
Java 11 이전 버전에서는, 인코딩을 지정할 수 없기 때문에
인코딩을 지정하기 위해서는 다른 방법을 사용해야 합니다.
이 클래스는 java.io.InputStreamReader 클래스를 상속받기 때문에,
InputStreamReader 클래스의 read() 메소드를 사용하여, char를 한 글자씩 읽어올 수 있습니다.
public int read() throws IOException
read() 메소드는,
텍스트 파일에서 한 글자씩 글자를 읽어서, 하나의 char를 리턴합니다.
더 이상 읽을 글자가 없으면, -1을 리턴합니다.
한 글자씩 읽기
import java.io.FileReader;
import java.io.IOException;
public class ReadFile {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("D:\\file.txt");
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
}
}
결과
hello
how are you
nice to meet you
FileReader를 사용하여, 파일의 글자를 한글자씩 읽어서 출력하는 예제입니다.
read() 메소드는, stream의 끝에서 -1을 리턴하므로,
read()의 값이 -1이면, 더 이상 파일을 읽지 않고, 반복문을 종료합니다.
2. BufferedReader
BufferedReader를 사용하면, buffer를 사용하기 때문에,
FileReader보다 좀 더 효율적으로 파일을 읽어올 수 있습니다.
public BufferedReader(Reader in)
public BufferedReader(Reader in, int sz)
첫 번째 파라미터
Reader 객체를 전달합니다.
앞에서 살펴보았던, FileReader를 전달할 수도 있고,
InputStreamReader 등의 다른 Reader 객체를 전달할 수도 있습니다.
두 번째 파라미터
buffer 사이즈를 지정할 수 있습니다.
파라미터로 입력되는 단위는 byte입니다.
BufferedReader의 기본 buffer 사이즈는 8KB입니다.
BufferedReader 객체 생성
BufferedReader bufferedReader = new BufferedReader(
new FileReader("d:\\file.txt"),
16 * 1024
);
위 코드는, 파일을 읽어 들일 BufferedReader 객체(버퍼 사이즈를 16KB인)를 만드는 예제입니다.
한 줄씩 읽기
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(
new FileReader("d:\\file.txt")
);
String str;
while ((str = reader.readLine()) != null) {
System.out.println(str);
}
reader.close();
}
}
결과
hello
how are you
nice to meet you
while (( str = reader.readLine()) != null)
BufferedReader의 readLine() 메소드는,
텍스트 파일을 한 줄씩 읽어서 리턴합니다.
더 이상 읽을 내용이 없으면, null을 리턴합니다.
인코딩 지정해서 텍스트 읽기 - FileReader
BufferedReader reader = new BufferedReader(
new FileReader("d:\\file.txt", Charset.forName("UTF-8"))
);
Java 11 이후부터는, FileReader에서 인코딩을 지정할 수 있습니다.
인코딩 지정해서 텍스트 읽기 - InputStreamReader
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("d:\\file.txt"), "UTF-8")
);
Java 11 이전에서는, FileReader에서 인코딩을 지정할 수 없으므로
InputStreamReader를 사용하여 파일을 읽고, 인코딩을 지정할 수 있습니다.
3. Scanner
Scanner 클래를 이용하면, 파일의 텍스트를 delimiter를 이용하여 잘라서 읽을 수 있습니다.
(기본 delimiter는 줄바꿈을 포함한 공백('\t', '\f', '\r', ' ', '\n')입니다.)
Scanner - next() 예제
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class ReadFile {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(new File("d:\\file.txt"));
while (scanner.hasNext()) {
String str = scanner.next();
System.out.println(str);
}
}
}
Scanner - next() 결과
hello
how
are
you
nice
to
meet
you
scanner.next()
Scanner의 next() 메소드를 사용하여,
기본 delimiter인 공백으로 구분된 문자열 단위로 텍스트 파일을 읽어 들였습니다.
Scanner - nextLine() 예제
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class ReadFile {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(new File("d:\\file.txt"));
while (scanner.hasNextLine()) {
String str = scanner.nextLine();
System.out.println(str);
}
}
}
Scanner - nextLine() 결과
hello
how are you
nice to meet you
scanner.nextLine()
Scanner의 nextLine() 메소드를 사용하면, 라인 단위로 텍스트 파일을 읽을 수 있습니다.
4. Files
java.nio.file.Files 클래스는 Java 7 이후부터 사용할 수 있습니다.
Files 클래스는 모두 static 메소드로 구성이 되어있습니다.
Files 클래스를 이용하면, 텍스트 파일 내용 전체를 List나 배열, String에 쉽게 담을 수 있습니다.
public static List<String> readAllLines(Path path) throws IOException
public static List<String> readAllLines(Path path, Charset cs) throws IOException
public static byte[] readAllBytes(Path path) throws IOException
public static String readString(Path path) throws IOException // Java 11 이후
public static String readString(Path path, Charset cs) throws IOException // Java 11 이후
readAllLines 예제
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class ReadFile {
public static void main(String[] args) throws IOException {
List<String> lines = Files.readAllLines(Paths.get("d:\\file.txt"));
System.out.println(lines);
}
}
readAllLines 결과
[hello, how are you, nice to meet you]
readAllBytes 예제
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ReadFile {
public static void main(String[] args) throws IOException {
byte[] bytes = Files.readAllBytes(Paths.get("d:\\file.txt"));
System.out.println(new String(bytes));
}
}
readAllBytes 결과
hello
how are you
nice to meet you
readString 예제
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ReadFile {
public static void main(String[] args) throws IOException {
String str = Files.readString(Paths.get("d:\\file.txt"));
System.out.println(str);
}
}
readString 결과
hello
how are you
nice to meet you
Java에서 텍스트 파일을 읽는 방법을 알아보았습니다.
'IT > Java' 카테고리의 다른 글
[Java] 파일, 디렉토리 존재 여부 확인하기 (0) | 2021.05.29 |
---|---|
[Java] 파일 생성하는 3가지 방법 (File, FileOutputStream, Files) (0) | 2021.05.29 |
[Java] 키보드로 사용자 입력받는 2가지 방법 (BufferedReader, Scanner) (0) | 2021.05.24 |
[Java] List에서 공백, null 제거하기 (0) | 2021.05.23 |
[Java] 정수의 최대값, 최소값 출력하기 (0) | 2021.05.23 |