파일 입출력(I/O)

김수민·2023년 3월 14일
0

백엔드 부트캠프

목록 보기
24/52

InputStream, OutputStream

FileInputStream

터미널에 다음과 같이 입력하면 code라는 문자열이 입력된 codestates.txt 파일이 생성됨

echo code >> codestates.txt
import java.io.FileInputStream;
  
public class FileInputStreamExample {
    public static void main(String args[])
    {
        try {
            FileInputStream fileInput = new FileInputStream("codestates.txt");
            int i = 0;
            while ((i = fileInput.read()) != -1) { //fileInput.read()의 리턴값을 i에 저장한 후, 값이 -1인지 확인합니다.
                System.out.print((char)i);
            }
            fileInput.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

BufferedInputStream이라는 보조 스트림을 사용하면 성능이 향상되기 때문에 대부분의 경우 이를 사용함. 버퍼란 바이트 배열로서, 여러 바이트를 저장하여 한번에 많은 양의 데이터를 입출력할 수 있도록 도와주는 임시 저장 공간임.

import java.io.FileInputStream;
import java.io.BufferedInputStream;
  
public class FileInputStreamExample {
    public static void main(String args[])
    {
        try {
            FileInputStream fileInput = new FileInputStream("codestates.txt");
						BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
            int i = 0;
            while ((i = bufferedInput.read()) != -1) {
                System.out.print((char)i);
            }
            fileInput.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

FileOutputStream

import java.io.FileOutputStream;
  
public class FileOutputStreamExample {
    public static void main(String args[]) {
        try {
            FileOutputStream fileOutput = new FileOutputStream("codestates.txt");
            String word = "code";

            byte b[] = word.getBytes();
            fileOutput.write(b);
            fileOutput.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

위 코드를 실행하면 같은 디렉토리 내에 code 라는 문자열이 입력된 codestates.txt 파일이 생성됨.

FileReader / FileWriter

File 입출력 스트림은 바이트 기반 스트림임. 바이트 기반은 입출력 단위가 1byte라는 뜻임. 하지만 Java에서 char 타입은 2byte임. 이를 해소하기 위해 자바에서는 문자 기반 스트림을 제공함. 문자 기반 스트림을 FileReader와 FileWriter가 있음.
문자 기반 스트림은 문자 데이터를 다룰 때 사용됨.
문자 기반 스트림과 그 하위 클래스는 여러 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동으로 처리함.
문자 기반 스트림에서는 일반적으로 바이트 기반 스트림의 InputStream이 Reader로, OutputStream이 Writer로 대응됨. FileInputStream이 문자 기반에서는 FileReader에, FileOutputStream은 FileWriter에 해댱됨.
FileReader는 인코딩을 유니코드로 변환하고, FileWriter는 유니코드를 인코딩으로 변환함.

FileReader

public class BufferedReaderExample {
    public static void main(String args[]) {
        try {
            String fileName = "codestates.txt";
            FileReader file = new FileReader(fileName);
            BufferedReader buffered = new BufferedReader(file);

            int data = 0;

            while((data=buffered.read()) != -1) {
                System.out.print((char)data);
            }
            file.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

기능을 개션할 수 있는 BufferedReader

FileWriter

public class FileWriterExample {
    public static void main(String args[]) {
        try {
            String fileName = "codestates.txt";
            FileWriter writer = new FileWriter(fileName);

            String str = "written!";
            writer.write(str);
            writer.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

File

파일 인스턴스를 생성하는 것이 곧 파일을 생성하는 것은 아님. 파일을 생성하기 위해서는 파일 인스턴스를 생성할 때 다음과 같이 첫 번째 인자에 경로를, 두 번째 인자에 파일명을 작성하고 createNewFile()메서드를 호출해주어야 함.

File file = new File("./", "newCodestates.txt");
file.createNewFile();

현재 디렉토리(.)에서 확장자가 .txt인 파일만을 대상으로 파일명 앞에 "code"라는 문자열을 붙여주는 예제.

import java.io.File;

public class FileClassExample {
    public static void main(String[] args) {

        File parentDir = new File("./");
        File[] list = parentDir.listFiles();

        String prefix = "code";

        for(int i =0; i <list.length; i++) {
            String fileName = list[i].getName();

						if(fileName.endsWith("txt") && !fileName.startsWith("code")) {
                list[i].renameTo(new File(parentDir, prefix + fileName));
            }
        }
    }
}

0개의 댓글