Language/Java

[Java] 파일 생성, 읽기 및 캐릭터셋(UTF-8) 설정

The Neo 2022. 3. 7. 00:25

자바로 파일을 생성하는 방법은 다양하게 많지만 그 중 가장 범용적이고, 성능도 뛰어난 방법을 소개해보고자 한다. 

 

[Java] 파일 생성, 읽기 및 캐릭터셋(UTF-8) 설정


테스트를 위한 String 생성

public static void main(String args[]) throws Exception {
        List<String> sampleList = new ArrayList<>();
        for(int i = 0; i < 10; i++) {
            sampleList.add("test-" + i);
	}
}

테스트를 위해서 10번의 루트를 실행하며, test-0 ~ test-9까지 문자열을 생성하고 sampleList 스트링 리스트 변수에 문자열 값들을 저장한다.

 

파일 생성 메소드

public static boolean createTextFile(String filePath, List<String> sampleList) {
    BufferedWriter bw = null;
    try {
        bw = new BufferedWriter(new FileWriter(filePath));

        for(String sampleStr : sampleList) {
            bw.write(sampleStr);
            bw.newLine();
        }

        bw.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

bw.newLine()은 개행을 하는 명령어인데, System.getProperty("line.separator")를 별도로 변수에 저장후 sampleStr에 붙여서 호출해도 동일한 결과를 가져온다. 개인적으로 line.separator를 변수에 저장하여 호출하는 것을 선호하는 편인데 그 이유는 필자는 bw.write에 호출할 때 한번에 콜하는 것을 선호하기에 StringBuffer에 세팅해서 한번에 던지는 스타일이다.

 

동일한 결과가 나오는 파일 생성 메소드

public static boolean createTextFile(String filePath, List<String> sampleList) {
    BufferedWriter bw = null;
    String newLine = System.getProperty("line.separator");

    try {
        bw = new BufferedWriter(new FileWriter(filePath));

        for(String sampleStr : sampleList) {
            bw.write(sampleStr + newLine);
        }

        bw.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

 

파일을 저장했으면, 저장한 파일을 읽는 것을 만들어보도록 한다.

 

 

파일 읽기

public static List<String> readTextFile(String filePath) {
    List<String> rtnList = new ArrayList<>();

    try {
        BufferedReader inFiles
                = new BufferedReader(new InputStreamReader(
                  new FileInputStream(filePath), StandardCharsets.UTF_8));

        String line;
        while((line = inFiles.readLine()) != null) {
            rtnList.add(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return rtnList;
}

 

파일을 읽는건 저장하는 것보다 복잡한데, 캐릭터셋으로 인해서 좀 더 복잡한 코드가 만들어졌다. 캐릭터셋을 지정하기 위해서는 InputStreamReader를 사용하며, "UTF-8"로 값을 세팅 할 수 있지만 Java 1.7부터 지원하기 시작한 StandardCharsets로 UTF-8을 지정하였다. 


전체 코드

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String args[]) throws Exception {
        List<String> sampleList = new ArrayList<>();
        for(int i = 0; i < 10; i++) {
            sampleList.add("test-" + i);
        }

        createTextFile("D:/test/test.txt", sampleList);
        List<String> rtnList = readTextFile("D:/test/test.txt");
        System.out.println(rtnList);
    }


    public static boolean createTextFile(String filePath, List<String> sampleList) {
        BufferedWriter bw = null;
        String newLine = System.getProperty("line.separator");

        try {
            bw = new BufferedWriter(new FileWriter(filePath));

            for(String sampleStr : sampleList) {
                bw.write(sampleStr + newLine);
            }

            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }


    public static List<String> readTextFile(String filePath) {
        List<String> rtnList = new ArrayList<>();

        try {
            BufferedReader inFiles
                    = new BufferedReader(new InputStreamReader(
                      new FileInputStream(filePath), StandardCharsets.UTF_8));

            String line;
            while((line = inFiles.readLine()) != null) {
                rtnList.add(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return rtnList;
    }
}

 

실행결과

[test-0, test-1, test-2, test-3, test-4, test-5, test-6, test-7, test-8, test-9]

 

반응형