자바

[JAVA] 파일 입출력(I/O)

ChaeHing 2023. 3. 9. 15:37

InputStream, OutputStream

 

  • 자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공한다.
  • 스트림은 단방향으로만 데이터를 전송할 수 있기에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요합니다.

 

FileInputStream

  • 파일을 바이트 스트림으로 읽는다.
// test.txt -> hi my name is ChaeHing
import java.io.FileInputStream;
    
public class FileIo {    
    public static void main(String[] args) {
        try{
            //FileInputStream fileInput = new FileInputStream("test.txt"); // 파일스트림 생성, 상대경로.. 왜인지 안된다.
            FileInputStream fileInput = new FileInputStream("src/FileIo/test.txt"); 
            // 파일스트림 생성, 읽어올 파일 절대경로 입력
            
            int i = 0;
            while((i = fileInput.read()) != -1){ // fileInput.read()의 리턴값을 i에 저장, 값이 -1 인지 확인
                                                 // 파일끝에 도달하면 -1을 리턴함
                System.out.print((char)i); // 파일 내용 출력
            }
            fileInput.close(); // 파일 스트림 닫기
        }
        catch (Exception e){
            System.out.println(e);
            //파일이 없다면,  java.io.FileNotFoundException: test.txt (지정된 파일을 찾을 수 없습니다)
        }
       }
}

/*
hi my name is ChaeHing
*/

BufferedInputStream

  • 보조 스트림으로 바이트가 아닌 버퍼로 읽기때문에 성능이 더 향상된다.
  • 버퍼란, 바이트 배열로 여러 바이트를 저장하여 한 번에 많은 양에 데이터를 입출력해주는 임시 저장 공간
import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class FileIo {
    public static void main(String[] args) {
        try{
            //FileInputStream fileInput = new FileInputStream("test.txt"); // 파일스트림 생성, 상대경로.. 왜인지 안된다.
            FileInputStream fileInput = new FileInputStream("src/FileIo/test.txt"); 
            // 파일스트림 생성, 읽어올 파일 절대경로 입력
            BufferedInputStream bufferedInput = new BufferedInputStream(fileInput); 
            // 파일스트림을 버퍼스트림으로

            int i = 0;
            //while((i = fileInput.read()) != -1){ // fileInput.read()의 리턴값을 i에 저장, 값이 -1 인지 확인
            while ((i = bufferedInput.read()) != -1) { // 파일스트림과 똑같이 사용
                                                 // 파일끝에 도달하면 -1을 리턴함
                System.out.print((char)i); // 파일 내용 출력
            }
            fileInput.close(); // 파일 스트림 닫기
        }
        catch (Exception e){
            System.out.println(e); 
            // 파일이 없다면, java.io.FileNotFoundException: test.txt (지정된 파일을 찾을 수 없습니다)
        }

    }
}

/*
hi my name is ChaeHing
*/

FileOutputStream

import java.io.FileOutputStream;

public class FileOutPut {
    public static void main(String[] args) {
        try{
            FileOutputStream fileOutput = new FileOutputStream("src/FileIo/file.txt");
            // 생성할 파일 경로 입력, 기존에 파일이있다면 overwrite
            String word = "file Create"; // 파일안에 입력할 내용, 문자열

            fileOutput.write(word.getBytes()); // 문자열을 바이트 배열로 반환하여 파일에 입력 및 저장
            fileOutput.close(); // 파일 스트림 닫기

        }catch (Exception e){
            System.out.println(e);
        }
    }
}

/*
src/FileIo/file.txt 경로내 파일이 생성됨
파일 내용file Create
*/

 

FileReader / FileWriter 

  • 문자 기반 스트림 - char 2byte
  • InputStream, OutputStream는 바이트 기반으로 입출력 단위가 1byte기 때문에 이를 해소 할수 있다
    • JAVA에서 문자는 2byte
  • 문자 기반 스트림과 그 하위 클래스는 어려 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동으로 처리한다.
  • FileReader는 인코딩을 유니코드로 변환하고, FileWriter는 유니코드를 인코딩으로 변환

FileReader

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

        try {
            FileReader file = new FileReader("file.txt"); // 스트림 생성

            int data = 0;

            while((data=file.read()) != -1) { // fileinputstream과 동일
                System.out.print((char)data); // 파일내용 출력
            }
            file.close(); // 스트림 닫기
        }
        catch (IOException e) { // 예외처리
            e.printStackTrace();
        }
    }
}

BufferedReader

  • FileReader도 buffer를 통해 성능 개선 가능
public class FileReaders {
    public static void main(String[] args) {

        try {
            FileReader file = new FileReader("file.txt"); // 스트림 생성
            BufferedReader bufferedReader = new BufferedReader(file); // 버퍼 Reader 생성

            int data = 0;

            while((data=bufferedReader.read()) != -1){
                System.out.print((char)data); // 파일내용 출력
            }
            file.close(); // 스트림 닫기
        }
        catch (IOException e) { // 예외처리
            e.printStackTrace();
        }
    }
}

FileWriter

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterEx {
    public static void main(String[] args) throws IOException {

        try {
            String fileName = "test.txt";
            FileWriter fileWriter = new FileWriter(fileName); // 스트림 생성

            String str = "file creat!! gogo"; // 파일 내용 
            fileWriter.write(str); // 파일 내용 쓰기
            fileWriter.close(); // 스트림 닫기
            // 이름이 동일한 파일 존재시 overwrite
            
        }catch (IOException e){ // 예외 처리
            e.printStackTrace();
        }

    }

}

File

  • 자바에서는 File  클래스로 파일과 디렉토리에 접근 가능
import java.io.File;
import java.io.IOException;

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

        System.out.println(file.getPath()); // 상대경로 반환
        System.out.println(file.getParent()); // 상위 디렉토리 상대경로 반환
        System.out.println(file.getCanonicalPath()); // 절대경로 반환
        System.out.println(file.canWrite()); // 파일 쓰기가 가능한지 여부 반환 boolean
    }
}

/*
..\testfile.txt
..
C:\project\testfile.txt
false

파일이 없기 때문에 canWrite() 메소드 호출시 false 발생
해당 위치에 파일이 없지만 컴파일 에러 발생하지 않음
인스턴스만 생성하면 파일이 생성되지 않음
*/
package FileIo;

import java.io.File;
import java.io.IOException;

public class FileClass {
    public static void main(String[] args) throws IOException {
        //File file = new File("../testfile.txt");
        File file = new File("src/FileIo", "testfile.txt"); // 인스턴스생성
        // 첫번째 인자 경로, 두번쨰 인자 파일이름       
        file.createNewFile(); // 해당 메소드를 호출해야 파일이 생성됨

        System.out.println(file.getPath()); // 상대경로 반환
        System.out.println(file.getParent()); // 상위디렉토리 상대경로 반환
        System.out.println(file.getCanonicalPath()); // 절대경로 반환
        System.out.println(file.canWrite()); // 파일 쓰기가 가능한지 여부 반환 boolean
    }
}

*/
src\FileIo\testfile.txt
src\FileIo
C:\project\practice\src\FileIo\testfile.txt
true
*/