CodeStates_BE_44/TIL

Day 17. [Java] 파일 입출력

조화이트 2023. 3. 9. 16:47
728x90

1. InputStream, OutputStream

스트림은 단방향으로만 데이터를 전송할 수 있기 때문에 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요하다.

입출력 스트림은 어떤 대상을 다루느냐에 따라 종류가 나뉜다.

File을 다룰 경우 FileInputStream/FileOutputStream을 사용하고 프로세스를 다룰 때는 PipedInputStream/PipedOutputStream을 사용한다.

FileInputStream

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);
        }
    }
}

FileInputStream의 Read()는 파일의 내용을 바이트 단위로 읽어서 정수로 반환해주는 메서드이다.

i = fileInput.read()) ≠ -1 이라는 코드는 ‘파일의 내용이 비어있지 않을 때’ 라는 의미와 같다.

 

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);
        }
    }
}

InputStream과 마찬가지로 바이트 단위로 입력받은 내용을 파일에 기록하고 내보내는 기능을 한다.

 

2. FileReader / FileWriter

FileInput(Output)Stream의 경우 바이트 기반 스트림 즉, 입출력 단위가 1byte인 스트림이다.

하지만 char 타입은 2byte이다.

이를 해소하기 위해 자바에서 제공하는 문자 기반 스트림이 FileReader, FileWriter이다.

문자 기반 스트림과 그 하위 클래스는 여러 종류의 인코딩과 유니코드간의 변환을 자동으로 처리한다.

FileReader는 인코딩을 유니코드로 변환하고, FileWriter는 유니코드를 인코딩으로 변환한다.

 

3. File

자바에서는 File 클래스로 파일과 디렉토리에 접근이 가능하다.

import java.io.*;

public class FileExample {
    public static void main(String args[]) throws IOException {
            File file = new File("../codestates.txt");

            System.out.println(file.getPath());
            System.out.println(file.getParent());
            System.out.println(file.getCanonicalPath());
            System.out.println(file.canWrite());
    }
}

//출력
..\\codestates.txt
..
C:\\Users\\chohayan\\IdeaProjects\\codestates.txt
false

만약 호출하는 파일이 존재하지 않더라도 컴파일 에러가 발생하지는 않는다.

파일 클래스를 통해 파일을 생성하려면 createNewFile() 메서드를 사용하면 된다.

File file = new File("./", "newCodestates.txt"); //파일을 생성할 경로 및 파일명 작성
file.createNewFile();
728x90
반응형