어제 오늘 내일

[Java] 텍스트 파일 읽기 ( FileReader, BufferedReader, Scanner, Files ) 본문

IT/Java

[Java] 텍스트 파일 읽기 ( FileReader, BufferedReader, Scanner, Files )

hi.anna 2021. 5. 29. 03:02

 

Java에서는 여러 가지 방법으로 텍스트 파일의 내용을 읽을 수 있습니다.

이번 글에서는 Java에서 텍스트 파일을 읽는 방법을 소개합니다.

  1. FileReader
  2. BufferedReader
  3. Scanner
  4. 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에서 텍스트 파일을 읽는 방법을 알아보았습니다.

 

 

반응형
Comments