반응형
안녕하세요! 오늘은 Java를 사용해 파일을 처리하는 방법에 대해 다뤄보겠습니다. 파일 처리란 디렉터리나 파일의 정보를 확인하거나, 파일을 생성하고 복사하는 작업을 포함합니다. 이를 통해 프로그램에서 파일과 상호작용하는 방법을 익힐 수 있습니다. 😊
이번 글에서는 파일 정보 출력, 디렉터리 생성, 파일 복사 세 가지 주요 작업을 다룰 예정입니다. 각 예제를 단계별로 설명해드리겠습니다.
1. 파일 정보 출력 및 디렉터리 생성
먼저, 파일의 정보 출력과 디렉터리 및 파일 생성을 알아보겠습니다. 이를 위해 File 클래스를 사용합니다.
코드 설명:
package com.javaex.io.bytestream;
import java.io.File;
import java.io.IOException;
public class FileClassEx {
// 파일이 저장될 경로를 설정합니다.
private static String rootPath = System.getProperty("user.dir") + "\\files"; // 현재 작업 디렉터리의 'files' 폴더
public static void main(String[] args) {
System.out.println("루트 경로 : " + rootPath);
// 'files' 폴더에 대한 File 객체를 생성합니다.
File f = new File(rootPath);
// 파일 또는 디렉터리의 존재 여부를 확인합니다.
System.out.println(rootPath + ":" + (f.exists() ? "존재함" : "없음"));
// 디렉터리의 정보 출력
printFileInfo(f);
// 새로운 디렉터리 생성
File newDir = new File(rootPath + "\\subdir\\subdir2");
if (!newDir.exists()) { // 디렉터리가 없다면
if (newDir.mkdirs()) { // 디렉터리를 실제로 생성
System.out.println(newDir + "을 생성했습니다.");
}
}
// 디렉터리 생성 후 다시 정보 출력
printFileInfo(f);
// 새 파일 생성
File newFile = new File(rootPath + "\\subdir\\myfile.txt");
if (!newFile.exists()) { // 파일이 없다면
try {
newFile.createNewFile(); // 새 파일을 실제로 생성
} catch (IOException e) {
System.err.println("파일을 만들지 못했어요.");
}
}
// 최종적으로 디렉터리 및 파일 정보 출력
printFileInfo(f);
// 파일 삭제
newFile.delete(); // 생성한 파일 삭제
}
// 파일 또는 디렉터리의 정보를 출력하는 메서드
private static void printFileInfo(File f) {
System.out.println("------------------");
if (f.isDirectory()) { // 파일이 디렉터리일 경우
System.out.println("디렉터리: " + f.getName()); // 디렉터리 이름 출력
// 디렉터리 내 파일 목록을 가져옵니다.
File[] files = f.listFiles();
// 각 파일 또는 디렉터리의 정보를 출력합니다.
for (File file : files) {
// 디렉터리 여부에 따라 'd' 또는 'f'를 출력합니다.
System.out.print(file.isDirectory() ? "d " : "f ");
// 읽기 권한, 쓰기 권한, 실행 권한을 확인하여 출력합니다.
System.out.print(file.canRead() ? "r" : ".");
System.out.print(file.canWrite() ? "w" : ".");
System.out.print(file.canExecute() ? "x" : ".");
System.out.print(" " + file.getName()); // 파일명 출력
System.out.println("\t" + file.length()); // 파일 크기 출력
}
} else { // 파일일 경우
System.out.println("File: ");
System.out.println(f.getName() + "\t");
System.out.println(f.canRead() ? "r" : ".");
System.out.println(f.canWrite() ? "w" : ".");
System.out.println(f.canExecute() ? "X" : ".");
System.out.println();
}
}
}
코드 분석:
- File 객체 생성:
File 객체는 실제로 파일이나 디렉터리를 생성하는 것이 아니라, 파일이나 디렉터리에 대한 정보를 다룰 수 있는 객체입니다. new File(rootPath)와 같이 파일이나 디렉터리 경로를 지정하여 객체를 생성합니다. - 파일/디렉터리 존재 여부 확인:
exists() 메서드를 사용하여 해당 경로에 파일이나 디렉터리가 존재하는지 확인할 수 있습니다. - 디렉터리 생성:
mkdirs() 메서드를 사용하여 여러 개의 중첩된 디렉터리를 한 번에 생성할 수 있습니다. - 파일 생성:
createNewFile() 메서드는 지정한 경로에 파일을 실제로 생성합니다. 단, 파일이 이미 존재하면 새로 생성되지 않습니다. - 파일/디렉터리 정보 출력:
listFiles() 메서드를 사용하여 디렉터리 내의 파일 목록을 배열로 가져오고, 파일의 권한(읽기, 쓰기, 실행)을 확인하여 출력합니다.
2. 파일 복사하기
이번에는 파일을 복사하는 작업을 해보겠습니다. FileInputStream과 FileOutputStream을 사용하여 파일을 바이트 단위로 읽고, 읽은 내용을 새 파일에 쓰는 방식입니다.
코드 설명:
package com.javaex.io.bytestream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class FileStreamEx {
private static String rootPath = System.getProperty("user.dir")+ "\\files\\";
private static String source = rootPath + "img.jpg"; // 원본 파일 경로
private static String target = rootPath + "img_copy.jpg"; // 복사할 파일 경로
public static void main(String[] args) {
System.out.println("rootPath : " + rootPath);
System.out.println("원본 파일 : " + source);
System.out.println("타겟 파일 : " + target);
try (InputStream fis = new FileInputStream(source); // 원본 파일을 읽기 위한 스트림
OutputStream fos = new FileOutputStream(target)) { // 복사할 파일을 쓰기 위한 스트림
int data = 0;
while((data = fis.read()) != -1) { // 파일을 끝까지 읽음
fos.write(data); // 읽은 데이터를 타겟 파일에 씁니다.
System.out.println("data : " + data); // 복사된 데이터 출력
}
System.out.println("파일을 복사했어요.");
} catch (FileNotFoundException e) {
System.err.println("파일을 찾을 수 없습니다.");
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
코드 분석:
- 파일 읽기/쓰기 스트림:
FileInputStream은 파일을 읽는 스트림이고, FileOutputStream은 파일을 쓰는 스트림입니다. 두 스트림을 사용하여 파일을 바이트 단위로 처리할 수 있습니다. - 파일 복사:
fis.read()로 파일을 읽고, 읽은 데이터를 fos.write()로 새로운 파일에 씁니다. 파일을 한 바이트씩 읽어서 바로 복사하는 방식입니다. - 예외 처리:
파일이 존재하지 않을 경우 FileNotFoundException, I/O 오류가 발생할 경우 IOException을 처리합니다. - 파일 복사 완료:
파일 복사가 완료되면 "파일을 복사했어요." 메시지를 출력합니다.
마무리
오늘은 파일 정보 출력, 디렉터리 생성, 파일 복사 방법에 대해 배워보았습니다. Java에서 파일 처리 작업은 다양한 경우에 필요하며, 그 과정에서 File, FileInputStream, FileOutputStream 클래스들을 잘 활용할 수 있습니다.
- 파일 및 디렉터리 정보 확인: File 클래스를 사용하여 파일이나 디렉터리의 정보를 쉽게 확인할 수 있습니다.
- 디렉터리 및 파일 생성: 새로운 디렉터리와 파일을 프로그램 내에서 동적으로 생성할 수 있습니다.
- 파일 복사: FileInputStream과 FileOutputStream을 사용하여 파일을 쉽게 복사할 수 있습니다.

반응형
'개발 > JAVA' 카테고리의 다른 글
Java 입출력과 텍스트 처리: Scanner와 StringTokenizer 활용하기 (18) | 2025.01.22 |
---|---|
Java 입출력 스트림 이해하기: Buffered 및 CharStream 사용 예제 (11) | 2025.01.21 |
자바 I/O 스트림 이해하기: BufferedStream, ByteArrayStream, DataStream 활용하기 ✨ (6) | 2025.01.17 |
JAVA의 함수형 프로그래밍과 Stream 활용하기 (7) | 2025.01.16 |
Java 예외 처리: 기본부터 사용자 정의 예외까지 (8) | 2025.01.15 |