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");
디렉토리 구분자는 운영체제마다 조금씩 다르다. *참고: https://rebornbb.tistory.com/entry/JAVA-SystemgetProperty
파일 유무 체크
File객체를 생성했다고 해서 파일이나 디렉토리가 생성되는 것은 아니다.
생성자 매개값으로 주어진 경로가 유효하지 않더라도 컴파일 에러나 예외가 발생하지 않는다.
File 객체를 통해 해당경로에 실제로 파일이나 디렉토리가 있는지 확인하려면 exists() 메소드를 호출할수있다.
디렉토리는 파일이 파일 시스템에 존재한다면 true, 아니면 false를 리턴한다.
boolean isExist = file.exists();
파일 생성 메소드 종류
exists() 메소드의 리턴값이 false라면 파일 또는 디렉토리를 생성할수있다.
리턴타입 | 메소드 | 설명 |
boolean | createNewFile() | 새로운 파일을생성 |
boolean | mkdir() | 새로운 디렉토리를생성 |
boolean | mkdirs() | 경로상에 없는 모든 디렉토리를 생성 |
boolean | delete() | 파일 또는 디렉토리삭제 |
파일 정보 메소드 종류
파일 또는 디렉토리가 존재할 겨우에는 다음 메소드를 통해 정보를 얻어낼수있다.
리턴타입 | 메소드 | 설명 |
boolean | canExecute() | 실행 가능한 파일인지 여부 |
boolean | canRead() | 읽을수있는 파일인지 여부 |
boolean | canWrite() | 수정 및 저장할수있는 파일인지 여부 |
String | getName() | 파일의 이름을 리턴 |
String | getParent() | 부모 디렉토리를 리턴 |
File | getParentFile() | 부모 디렉토리를 File객체로 생성후 리턴 |
String | getPath() | 전체 경로를 리턴 |
boolean | isDirectory() | 디렉토리인지 여부 |
boolean | isFile() | 파일인지 여부 |
boolean | isHidden() | 숨김파일인지 여부 |
long | lastModified() | 마지막 수정 날짜 및 시간을 리턴 |
long | length() | 파일크기를 리턴 |
String[] | list() | 디렉토리에 포함된 파일 및 서브디렉토리 목록 전부를 String배열로 리턴 |
String[] | list(FilenameFilter filter) | 디렉토리에 포함된 파일 및 서브디렉토리 목록 중에 FilenameFilter에 맞는것만 String 배열로 리턴 |
File[] | listFiles() | 디렉토리에 포함된 파일 및 서브디렉토리 목록 전부를 File배열로 리턴 |
File[] | listFiles(FilenameFileter filter) | 디렉토리에 포함된 파일 및 서브디렉토리 목록 중에 FilenameFilter에 맞는것만 File배열로 리턴 |
File 사용 예제
다음은 C:\Temp 디렉토리에 Dir 디렉토리와 file1.txt, file2txt, file3.txt 파일을 생성하고 Temp 디렉토리에 있는 파일 목록을 출력하는 예제이다.
package javaStudy;
import java.io.File;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Example {
public static void main(String[] args) throws Exception {
File dir = new File("C:/Temp/Dir");
File file1 = new File("C:/Temp/file1.txt");
File file2 = new File("C:/Temp/file2.txt");
//파일경로를 URI 객체로 생성해서 매개값으로 제공해도 됨
File file3 = new File(new URI("file:///C:Temp/file3.txt"));
if(dir.exists() == false) { dir.mkdirs(); };
if(file1.exists() == false) { file1.createNewFile(); };
if(file2.exists() == false) { file2.createNewFile(); };
if(file3.exists() == false) { file3.createNewFile(); };
File temp = new File("C:/Temp");
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-DD a HH:mm");
File[] contents = temp.listFiles();
System.out.println("날짜 시간 형태 크기 이름");
System.out.println("---------------------------");
for(File file : contents){
System.out.print(sdf.format(new Date(file.lastModified())));
if(file.isDirectory()){
System.out.println("\t<DIR>\t\t\t" + file.getName());
}else{
System.out.println("\t\t\t" + file.length() + "\t" + file.getName());
}
System.out.println();
}
}
}
FileInputStream
FileInputStream 클래스는 파일로부터 바이트 단위로 읽어들일 때 사용하는 바이트 기반 입력 스트림이다.
바이트 단위로 읽기 때문에 그림, 오디오, 비디오, 텍스트 파일 등 모든종류의 파일을 읽을 수 있다.
다음은 FileInputStream을 생성하는 두가지 방법을 보여준다.
//1.
FileInputStream fis = new FileInputStream("C:/Temp/image.gif");
//2.
File file = new File("C:/Temp/image.gif");
FileInputStream fis = new FileInputStream(file);
FileInputStream 객체가 생성될때 파일과 직접 연결되는데,
만약 파일이 존재하지 않으면 FileNotFoundException 을 발생시키므로 try- catch문으로 예외처리를 해야한다.
FileInputStream은 InputStream의 하위 클래스이기 때문에 사용법이 InputStream과 동일하다.
한바이트를 읽기 위해서 read()메소드를 사용하거나,
읽은 바이트를 byte 배열에 저장하기 위해 read(byte[] b) 또는 read(byte[] b, int off, int len) 메소드를 사용한다.
전체 파일의 내용을 읽기 위해서는 이 메소드를 반복 실행해서 -1이 나올때까지 읽으면 된다.
파일의 내용을 읽은 후에 중요한 것은 IO 클래스를 생성한 후에는 항상 close() 메소드를 호출하여 닫아 주어야 한다.
FileInputStream fis = new File("C:/Temp/image.gif");
int readByteNo;
byte[] readBytes = new byte[100];
while ((readByteNo = fis.read(readBytes)) != -1) {
//읽은 바이트 배열(readByte)을 처리
}
fis.close();
FileInputStream 생성자
FileInputStream(File file) | File 객체가 가리키는 파일을 바이트 스트림으로 읽기 위해 FileInputStream 객체를 생성 |
FileInputStream(String s) | 생성자에 담긴 파일의 주소를 찾아 바이트 스트림으로 읽기 위해 FileInputStream 객체를 생성 |
FileInputStream 메소드
int read() | 1byte씩 내용을 읽어 정수로 반환 |
int read(byte[] b) | 파일 내용을 한번에 모두 읽어서 배열에 저장 |
int read(byte[] b, int off, int len) | "len"길이만큼 읽어서 배열의 "off"번재 위치부터 저장 |
int available() | 현재 파일 포인터 위치에서 읽을 수 있는 바이트 수 반환 |
void close() | 현재 열려있는 파일을 닫음 |
String 생성자 |
|
String(byte[] b, int start_index, int len) | 인자의 바이트 배열중 일부분을 인덱스로 지정하여 스트링 객체를 생성한다. |
FileInputStream 예제
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) throws Exception {
// FileInputStream 객체 생성
FileInputStream fis = null;
try {
// 파일 객체 생성
File file = new File("D:\\test\\b의개발.txt");
fis = new FileInputStream(file);
// read() 메소드로 파일 읽기 - 파일을 한 바이트씩 읽어옵니다.
int data = 0;
while ((data = fis.read()) != -1) { //한글자씩 불러오기
//읽어온 바이트는 char 형으로 변환하여 출력
System.out.print((char) data);
}
} catch(IOException e) {
System.out.println(e);
} finally {
// FileInputStream 객체 닫기
fis.close();
}
}
}
출력결과:
hello world!
Hi?
System.out.print 를 이용하여 실제 파일의 내용을 확인 할 수 있다.
FileOutputStream
FileOutputStream은 바이트 단위로 데이터를 파일에 저장할 때 사용하는 바이트 기반 출력 스트림이다.
바이트 단위로 저장하기 때문에 그림, 오디오, 비디오, 텍스트 등 모든 종류의 데이터를 파일로 저장할수있다.
다음은 FileOutputStream을 생성하는 두가지 방법을 보여준다.
//1.
FileOutputStream fis = new FileOutputStream("C:/Temp/image.gif");
//2.
File file = new File("C:/Temp/image.gif");
FileOutputStream fis = new FileOutputStream(file);
주의 할 점은 파일이 이미 존재할 경우, 데이터를 출력하면 파일을 덮어쓰게 되므로, 기존의 파일 내용은 사라지게 된다.
기존의 파일 내용 끝에 데이터를 추가할 경우에는 FileOutputStream 생성자의 두번째 매개값을 true로 주면 된다.
FileOutputStream fos = new FileOutputStream("C:/Temp/data.txt", true);
FileOutputStream fos = new FileOutputStream(file, true);
FileOutputStream은 OutputStream의 하위 클래스이기 때문에 사용법이 OutputStream과 동일하다.
한바이트를 저장하기 위해서 write()메소드를 사용하고,
바이트 배열을 한꺼번에 저장하기 위해 write(byte[] b) 또는 write(byte[] b, int off, int len) 메소드를 사용한다.
write()메소드를 호출한 이후에 flush()메소드로 출력 버퍼에 잔류하는 데이터를 완전히 출력하도록 하고,
close()메소드를 호출해서 파일을 닫아준다.
FileOutputStream fos = new FileOutputStream("C:/Temp/image.gif");
byte[] data = ...;
fos.write(data);
fos.flush();
fos.close();
FileOutputStream예제
package javaStudy;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Example {
public static void main(String[] args) throws Exception {
String originalFileName = "D:\\test\\b의개발.txt";
String targetFileName = "C:\\test\\b의개발.txt";
FileInputStream fis = new FileInputStream(originalFileName);
FileOutputStream fos = new FileOutputStream(targetFileName);
int readByteNo;
byte[] readBytes = new byte[100];
while ((readByteNo = fis.read(readBytes)) != -1) { //한글자씩 불러오기
fos.write(readBytes, 0, readByteNo);
}
fos.flush();
fos.close();
fis.close();
System.out.println("복사가 잘 되었습니다");
}
}
출처 :이것이자바다 - 신용권지음
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 소켓 개념과 자바 예제 코드 (0) | 2023.12.12 |
---|---|
[JAVA] 람다식(Lambda) (0) | 2023.11.30 |
[JAVA] Base64 인코딩, 디코딩 (0) | 2023.11.20 |
[JAVA] java.nio.file.Files 사용하여 파일 내용 읽기 (1) | 2023.11.20 |
[JAVA] 이스케이프 문자(escape sequence) 종류 (0) | 2023.11.20 |