[JAVA] File I/O

GONG PYUNG·2022년 5월 17일
0
post-thumbnail

Overview

입출력 스트림
: 응용 프로그램과 입출력 장치를 연결하는 소프트웨어 모듈, 버퍼를 통해 순차적으로 이루어짐 (FIFO)

입출력 스트림 종류

  • 문자 스트림 (2byte)
  • 바이트 스트림 (1byte)

실습

1. Text File Read & Print

void PrintFile(String fileName) {
	String line = null;
	
	try {
		// 입력 스트림
		FileReader fileReader = new FileReader(fileName);
		// 입력 스트림으로부터 문자를 읽을 때 버퍼링
		BufferedReader bufferedReader = new BufferedReader(fileReader);
		
		// 버퍼로부터 한 줄씩 읽기
		while((line = bufferedReader.readLine()) != null) {
			// 화면에 한 줄씩 출력
			System.out.println(line);
		}
		// 버퍼 리더 닫기
		bufferedReader.close();
		
	} catch (IOException e) {
		System.out.println("입출력 오류");
	}
}

2. Binary File Read & Write

void CopyFile(String inputFile, String outputFile) {
	final int BUFFER_SIZE = 4096;
	int readLen;
	
	try {
		// 바이트 단위 입출력 스트림
		InputStream inputStream = new FileInputStream(inputFile);
		OutputStream outputStream = new FileOutputStream(outputFile);
		
		//바이트 배열 버퍼 생성
		byte[] buffer = new byte[BUFFER_SIZE];
		
		// 파일을 읽어 버퍼에 담기
		while ((readLen = inputStream.read(buffer)) != -1) {
			// 버퍼의 내용을 파일에 쓰기
			outputStream.write(buffer, 0, readLen);
		}
		// 입출력 스트림 닫기
		inputStream.close();
		outputStream.close();
	} catch (IOException e) {
		System.out.println("입출력 오류");
	}
}

3. File/Directory List 출력

void FileSearchAll(String path) {
	File directory = new File(path);
	File[] fList = directory.listFiles();
	
	for (File file : fList) {
		if (file.isDirectory()) {
			// 폴더인 경우 재귀호출을 통한 하위 폴더 파일 탐색
			FileSearchAll(file.getPath());
		} else {
			System.out.println(file.getName());
		}
	}
}

4. Practice

1) INPUT 폴더 하위에 위치한 파일들의 파일명, 크기를 Console에 출력

static String rootPath = ".\\INPUT";
static void printFile(String path) {
	File directory = new File(path);
	File[] fList = directory.listFiles();
	
	for (File file : fList) {
		if (file.isDirectory()) {
			printFile(file.getPath());
		} else {
			System.out.print(file.getPath());
			System.out.print(": ");
			System.out.println(file.length() + "bytes");
		}
	}
}

public static void main(String[] args) {
	printFile(rootPath);
}

2) INPUT 폴더 하위에 위치한 파일 중 크기가 3Kbyte가 넘는 파일들은 OUTPUT 폴더로 복사

static void fileSearchAll(String path) {
	File directory = new File(path);
	File[] fList = directory.listFiles();
	
	for (File file : fList) {
		if (file.isDirectory()) {
			fileSearchAll(file.getPath());
		} else {
			String partPath = path.substring(rootPath.length());
			System.out.println("." + partPath + "\\" + file.getName());
			if (file.length() > 3*1024) {
				copyFile(partPath, file.getName());
			}
		}
	}
}

static void copyFile(String partPath, String fileName) {
	final int BUFFER_SIZE = 512;
	int readLen;
	
	try {
		File destFolder = new File(".\\OUTPUT" + partPath);
		if (!destFolder.exists()) {
			destFolder.mkdirs();
		}
		
		InputStream is = new FileInputStream(".\\INPUT" + partPath + "\\" + fileName);
		OutputStream os = new FileOutputStream(".\\OUTPUT" + partPath + "\\" + fileName);
		
		byte[] buffer = new byte[BUFFER_SIZE];
		
		while ((readLen = is.read(buffer)) != -1) {
			os.write(buffer, 0, readLen);
		}
		
		is.close();
		os.close();
		
	} catch (IOException e) {
		System.out.println("입출력 오류");
	}
	
}

public static void main(String[] args) {
//		printFile(rootPath);
	fileSearchAll(rootPath);
}
profile
주니어 개발자 공평

0개의 댓글