[Java] IO 기반 입출력 및 네트워킹 ④

kiteB·2022년 4월 29일
0

Java2

목록 보기
25/36
post-thumbnail

[ 파일 입출력 ]

1. File 클래스

IO 패키지(java.io)에서 제공하는 File 클래스는 다음과 같은 기능을 제공한다.

  • 파일 크기, 파일 속성, 파일 이름 등의 정보를 얻어내는 기능
  • 파일 생성 및 삭제 기능
  • 디렉토리를 생성하고 디렉토리에 존재하는 파일 리스트를 얻어내는 기능

하지만 파일의 데이터를 읽고 쓰는 기능은 지원하지 않는다. → 파일의 입출력은 스트림을 이용해야 한다.

🐥 예제

C:\Temp 디렉토리의 file.txt 파일을 File 객체로 생성하는 코드

File file = new File("C:\\Temp\\file.txt");
File file = new File("C:/Temp/file.txt");

📌 디렉토리 구분자는 운영체제마다 다르다.

  • 윈도우에서는 \ 또는 /를 사용할 수 있고,
  • 유닉스나 리눅스에서는 /를 사용한다.
    File.separator 상수를 출력해보면 해당 운영체제에서 사용하는 디렉토리 구분자를 확인할 수 있다. 만약 \를 디렉토리 구분자로 사용한다면 이스케이프 문자(\\)로 기술해야 한다.

exists() 메소드

File 객체를 생성했다고 해서 파일이나 디렉토리가 생성되는 것은 아니다. 생성자 매개값으로 주어진 경로가 유효하지 않더라도 컴파일 에러나 예외가 발생하지 않는다. File 객체를 통해 해당 경로에 실제로 파일이나 디렉토리가 있는지 확인하려면 exists() 메소드를 호출할 수 있다. 디렉토리 또는 파일이 파일 시스템에 존재한다면 true를 리턴하고 존재하지 않는다면 false를 리턴한다.

boolean isExist = file.exists();

exists() 메소드의 리턴값이 false라면 createNewFile(), mkdir(), mkdirs() 메소드로 파일 또는 디렉토리를 생성할 수 있다.

리턴 타입메소드설명
booleancreateNewFile()새로운 파일을 생성
booleanmkdir()새로운 디렉토리를 생성
booleanmkdirs()경로상에 없는 모든 디렉토리를 생성
booleandelete()파일 또는 디렉토리 삭제

파일 또는 디렉토리가 존재할 경우, 다음 메소드를 통해 정보를 얻어낼 수 있다.

리턴 타입메소드설명
booleancanExecute()실행할 수 있는 파일인지 여부
booleancanRead()읽을 수 있는 파일인지 여부
booleancanWrite()수정 및 저장할 수 있는 파일인지 여부
booleangetName()파일의 이름을 리턴
booleangetParent()부모 디렉토리를 리턴
FilegetParent()부모 디렉토리를 File 객체로 생성 후 리턴
StringgetPath()전체 경로를 리턴
booleanisDirectory()디렉토리인지 여부
booleanisFile()파일인지 여부
booleanisHidden()숨김 파일인지 여부
longlastModified()마지막 수정 날짜 및 시간을 리턴
longlength()파일의 크기를 리턴
String[]list()디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부를 String 배열로 리턴
String[]list(FilenameFilter filter)디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 String 배열로 리턴
File()listFiles()디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부를 File 배열로 리턴
File()listFiles(FilenameFilter filter)디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 File 배열로 리턴

2. FileInputStream

파일로부터 바이트 단위로 읽어들일 때 사용하는 바이트 기반 입력 스트림

  • 바이트 단위로 읽기 때문에 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일을 읽을 수 있다.

✅ FileInputStream 생성 방법

//첫 번째 방법
FileInputStream fis = new FileInputStream("C:/Temp/image.gif");

//두 번째 방법
File file = new File("C:/Temp/image.gif");
FileInputStream fis = new FileInputStream(file);
  • 첫 번째 방법은 문자열로 된 파일의 경로를 가지고 FileInputStream을 생성한다.
  • 만약 읽어야 할 파일이 File 객체로 이미 생성되어 있다면 두 번째 방법으로 좀 더 쉽게 FileInputStream을 생성할 수 있다.

FileInputStream 객체가 생성될 때 파일과 직접 연결이 되는데, 만약 파일이 존재하지 않으면 FileNotFoundException을 발생시키므로 try-catch문으로 예외 처리를 해야 한다.

FileInputStreamInputStream의 하위 클래스이기 때문에 사용 방법이 InputStream과 동일하다. 한 바이트를 읽기 위해서 read() 메소드를 사용하거나, 읽은 바이트를 byte 배열에 저장하기 위해서 read(byte[] b) 또는 read(byte[] b, int off, int len) 메소드를 사용한다. 전체 파일의 내용을 읽기 위해서는 이 메소드들을 반복 실행해서 -1이 나올 때까지 읽으면 된다. 파일의 내용을 모두 읽은 후에는 close() 메소드를 호출해서 파일을 닫아준다.

FileInputStream fis = new FileInputStream("C:/Temp/image.gif");
int readByteNo;
byte[] readBytes = new byte[100];
while ((readByteNo = fis.read(readBytes) != -1) {
    //읽은 바이트 배열(readBytes)을 처리
}
fis.close();

3. FileOutputStream

바이트 단위로 데이터를 파일에 저장할 때 사용하는 바이트 기반 출력 스트림

  • 바이트 단위로 저장하기 때문에 모든 종류의 데이터를 파일로 저장할 수 있다.

FileOutputStream 생성 방법

//첫 번째 방법
FileOutputStream fos = new FileOutputStream("C:/Temp/image.gif");

//두 번째 방법
File file = new File("C:/Temp/image.gif");
FileOutputStream fos = new FileOutputStream(file);
  • 첫 번째 방법은 문자열로 된 파일의 경로를 가지고 FileOutputStream을 생성한다.
  • 만약 저장할 파일이 File 객체로 이미 생성되어 있다면 두 번째 방법으로 좀 더 쉽게 FileOutputStream을 생성할 수 있다.

주의할 점은 파일이 이미 존재할 경우, 데이터를 출력하면 파일을 덮어쓰게 되므로, 기존의 파일 내용은 사라지게 된다. 기존의 파일 내용 끝에 데이터를 추가할 경우에는 FileOutputStream 생성자의 두 번째 매개값을 true로 주면 된다.

FileOutputStream fos = new FileOutputStream("C:/Temp/data.txt", true);
FileOutputStream fos = new FileOutputStream(file, true);

FileOutputStreamOutputStream의 하위 클래스이기 때문에 사용 방법이 InputStream과 동일하다. 한 바이트를 저장하기 위해서 write() 메소드를 사용하고 바이트 배열을 한꺼번에 저장하기 위해서 write(byte[] b) 또는 write(byte[] b, int off, int len) 메소드를 사용한다.

FileOutputStream fos = new FileOutputStream("C:/Temp/image.gif");
byte[] data = ...;
fos.write(data);
fos.flush();
fos.close();

write() 메소드 호출 후에는 flush() 메소드로 잔류하는 데이터를 완전히 출력하도록 하고, close() 메소드를 호출해서 파일을 닫아준다.


[ 참고자료 ]

이것이 자바다 책

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글