본문 바로가기

Study/Java Study

12장. 파일 입출력

1. 파일 처리

: 읽기, 쓰기, 편집 등 파일에 대한 다양한 기능을 수행하는 것

 

이때 필요한 모든 메서드는 java.io 패키지에 있으므로 파일 처리를 위해 프로그램 시작 전 다음 패키지 포함

import java.io.*;

: 자바 입출력(I/O) 수행하는 데 필요한 거의 모든 클래스 포함

 

stream: 두 대상을 연결하고 데이터를 전송할 수 있는 것

 

▷ 입출력 스트림 

- 자바에서 모든 입출력이 스트림을 통해 이루어짐

- 단방향 통신만 가능하기에 입출력 동시에 처리 X 

 

 

입출력 스트림의 분류

  • 바이트 스트림  

 : 영상, 음성, 영문자 등의 바이너리 데이터를 처리, 1바이트 단위의 입출력을 처리

 

- 한 번에 8비트 데이터를 처리하고 8비트당 입출력 연산을 수행 

- 가장 일반적으로 사용되는 입력 스트림 클래스는 FileInputStream, 출력 스트림 클래스는 FileOutputStream

 

  • 문자 스트림

: 다국어를 표현하는 유니코드를 처리, 2바이트 단위의 문자 입출력을 처리

 

- 한 번에 16비트 유니코드 데이터의 입출력을 처리 (바이트 스트림보다 2배로 빠른 수행 ok )

- 일반적으로 문자 스트림은 바이트 스트림 클래스를 사용하여 구현

- 가장 일반적으로 사용되는 입력 스트림 클래스는 FileReader, 출력 스트림 클래스는 FileWriter

 

▷ 파일 처리 과정

  1. File 클래스로 파일 열기(생성하기)
  2. 입출력 스트림 클래스로 파일 읽기 / 쓰기
  3. 파일 읽기 / 쓰기 종료하기(닫기)

파일 읽기/쓰기 처리 과정


2. 파일 생성

File 파일객체명 = new File("[디렉터리명\]");
File file = new File("test.txt");

 

File 클래스의 생성자 > 

생성자 설명
File(File parent, String child) 부모 추상 경로명과 자식 문자열 경로명에서 파일 인스턴스를 만듦
File(String pathname) 주어진 경로명을 추상 경로명으로 변환하고 새 파일 인스턴스를 만듦
File(String parent, String child) 부모 경로명과 자식 경로명을 가져와서 파일 인스턴스를 만듦
File(URI uri) 주어진 URI를 추상 경로명으로 변환하여 파일 인스턴스를 만듦

 

createNewFile() 메서드를 사용해서 파일 생성 

지정된 위치에 파일이 존재하면 false, 파일이 존재하지 않으면 true 를 반환

File file = new File("text.txt");

try {
  boolean b = file.createNewFile();
  ...
} catch(IOException e) {
  ...
}

 

File 클래스의 주요 메서드 >

메서드 설명
Boolean canRead() 파일을 읽을 수 있는지 확인
Boolean createNewFile() 원하는 경로에 새 파일을 생성. 보통 생성된 파일이 비어 있음
Boolean canWrite() 파일에 쓸 수 있는지, 즉 읽기 전용 파일인지 아닌지 확인
Boolean exists() 요청한 파일이 디렉터리에 있는지 확인
Boolean delete() 디렉터리 파일을 삭제
String getName() 디렉터리에서 특정 파일명을 찾음
String getAbsolutePath() 주어진 파일의 절대 경로를 반환
Long length() 파일 크기를 바이트 단위로 반환
String[] list() 현재 작업 디렉터리에 있는 모든 파일을 반환
Boolean mkdir() 새 디렉터리를 생성

 

File 클래스를 이용한 파일 생성 예시 )

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

public class Example01 {
  public static void main(String[] args) {
    File fileObj = new File("example01.txt");
    try {
      boolean success = fileObj.createNewFile();
      
      if(success) {
        System.out.println("파일 생성 성공");
      } else {
          System.out.println("파일 생성 실패");
      }
    } catch(IOException e) {
        System.out.println(e);
    }
  }
}

 

실행 결과 )

파일 생성 성공

 

앞 Example01.java 파일의 이름과 경로, 쓰기/읽기 여부, 파일 크기 등의 정보를 얻어와 출력해보기

import java.io.File;

public class FileHandling01 {
   public static void main(String[] args) {
      
      File finfo = new File("src\\Example01.java");
      
      if (finfo.exists()) {
         System.out.println("파일의 이름: " + finfo.getName());
         System.out.println("파일의 경로: " + finfo.getAbsolutePath());
         System.out.println("파일 쓰기가 가능한가?: " + finfo.canWrite());
         System.out.println("파일 읽기가 가능한가?: " + finfo.canRead());
         System.out.pritnln("파일의 크기: " + finfo.length());
      } else {
           System.out.println("존재하는 파일이 아닙니다.");
      }
   }
}

실행결과 )

파일의 이름: Example01.java
파일의 경로: C:\users\user\Java\Chap12\src\Example01.java
파일 쓰기가 가능한가?: true
파일 읽기가 가능한가?: true
파일의 크기: 545

3. 파일 쓰기

 

  • 바이트 출력 스트림 유형

OutputStream 클래스 

- 출력(데이트 쓰기)을 하는 추상 클래스

- 바이트 출력 스트림을 나타내는 모든 크래스의 슈퍼 클래스 

 

OutputStream 클래스의 계층 구조

 

FileOutputStream 클래스

- 파일에 데이터를 쓰는 데 사용되는 출력 스트림

- 파일에 기본값을 쓰는 경우에 사용

- 바이트 지향 데이터와 문자 지향 데이터를 모두 작성 가능

 

FileOutputStream 클래스를 이용한 파일 쓰기 예시 ) 

import java.io.File;
import java.io.FileOutputStream;

public class Example02 {
  public static void main(String[] args) {
    String str = "Hello! Java Programming ";
    try {
       File file = new File("example02.txt");
       if (!file.exists())
          file.createNewFile();
       
       FileOutputStream fos = new FileOutputStream(file);
       
       byte[] b = str.getBytes();
       
       fos.write(b);
       fos.close();
       System.out.pritnln("파일 쓰기 성공"_;
    } catch(Exception e) {
       e.getMessage();
    }
  }
}

 

실행 결과 ) 

 

  • 문자 출력 스트림 유형

Writer 클래스 

- 문자 스트림에 쓰기 위한 추상 클래스

- 서브 클래스가 구현해야 하는 추상 메서드: write(), flush(), close()

Writer 클래스의 계층 구조

FileWriter 클래스

- 문자 데이터를 파일에 쓰는 데 사용

- FileOutputStream 클래스와 달리 문자열을 직접 쓰는 방법을 제공 -> 문자열을 바이트 배열로 변환할 필요 X

 

 

FileWriter 클래스를 이용하여 키보드를 통해 ID와 이름을 입력받아 저장보기 >

import java.io.File;
import java.io.FileWriter;
import java.util.Scanner;

public class FileHandling03 {
  public static void main(String[] args) {
    File file = new File("member.txt");
    
    try {
      if (!file.exists())
          file.createNewFile();
          
      FileWriter fw = new FileWriter(file);
      Scanner input = new Scanner(System.in);
      
      boolean quit = false;
      while (!quit) {
        System.out.print("아이디 : ");
        String userID = input.next();
        fw.write("아이디 : " + userID + " ");
        
        System.out.print("이름: ");
        String userName = input.next();
        fw.write("아이디 : " + userName + " ");
        
        System.out.print("계속 진행? Y | N ");
        input = new Scanner(System.in);
        String str = input.Line();
       
        if (str.toUpperCase().equals("N"))
          quit = true;
    } catch(Exception e) {
        e.getMessage();
    }
  }
}

실행 결과 )

 


4. 파일 읽기

  • 바이트 입력 스트림 유형

- InputStream 클래스는 입력(데이터 읽기)을 가져오는 데 사용하는 추상 클래스

- 바이트 입력 스트림을 나타내는 모든 클래스의 슈퍼 클래스

 

InputStream 클래스의 계층 구조

FileInputStream 클래스 

- 파일에서 이미지 데이터, 오디오, 동영상 등의 바이트 지향 데이터를 읽어오는 데 사용되는 입력 스트림

 

FileInputStream 클래스를 이용해서 구구단을 읽어와 출력해보기 >

import java.io.File;
import java.io.FileInputStream;

public class FileHandling04 {
  public static void main(String[] args) {
     File file = new File("gugudan.txt");
     try {
        if (!file.exists())
           file.createNewFile();
           
        FileInputStream fis = new FileInputStream(file);
        int i = 0;
        
        while ((i = fis.read() != -1) {
           System.out.print((char) i);
        }
        
        fis.close();
          System.out.println("파일 읽기 성공");
        } catch(Exception e) {
           System.out.println(e);
       }
     }
  }

실행 결과 )

...

9 X 2 = 18
9 X 3 = 27
9 X 4 = 36
9 X 5 = 45
9 X 6 = 54
9 X 7 = 63
9 X 8 = 72
9 X 9 = 81
파일 읽기 성공

 

  • 문자 입력 스트림 유형

Reader 클래스 

- 문자 스트림을 읽기 위한 추상 클래스

- 서브 클래스가 구현해야 하는 추상 메서드 : read(), close()

 

Reader 클래스의 계층 구조

 

FileReader 클래스 

- 파일에서 문자 지향 데이터를 읽는 데 사용

- FileInputStream 클래스와 같은 바이트 형식으로 데이터를 반환

 

BufferedReader 클래스 

- 문자 기반 입력 스트림에서 텍스트를 읽는 데 사용

- readLine() 메서드로 데이터를 한 줄씩 읽을 떄 사용할 수 있어 성능으 빠르게 함

 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class Example06 {
  public static void main(String[] args) {
   
    try {
      File file = new File("example03.txt");     // File 클래스로 파일 열기(생성하기)
      if (!file.exists())
         file.createNewFile();
         
      FileReader fis = new FileReader(file);           // 입력 스트림 클래스로 파일 읽기
      BufferedReader br = new BufferedReader(fis);
      
      String str;
      
      while ((str = br.readLine()) != null) {
        System.out.println(str);
      }
      
      fis.close();                                 // 파일 읽기 종료하기(닫기)
      System.out.println("파일 읽기 성공");
    } catch(Exception e) {
        System.out.println(e);
   }
  }
}

 

실행 결과)

Hello!!
Java Programming
파일 읽기 성공