파일복사는 입력스트림에서 값을 받아와서 출력 스트림을 통해 다른 파일로 옮기는 과정을 거친다.
첫번째 예시는 클래스를 이용하여 파일을 복사하는 방법이다. 객체지향 프로그래밍을 사용하여 유지보수가 용이하다
package 파일복사프로그램2;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
//메서드는 파일읽기 와 파일복사 메서드 두개를 만든다.
class FileCopy2 { //FileCopy 클래스 생성
public String fileRead(String path) { //파일 읽기
//파일의 경로(String path)를 파라미터로 받아서
//경로는 " " 안에 들어가기 대문에 String 으로 변수 선언
StringBuilder sb = new StringBuilder();
// StringBuilder : 문자열을 덧붙이거나 잘라내는 조작을 빠르게 처리하는 클래스
// 파일에서 읽은 내용을 배열처럼 덧붙여서 저장하려고 생성
try {
FileReader fr = new FileReader(path);
//파일을 읽어드릴 스트림 객체 생성 하고 경로를 path로 지정
//예전에는 "src/입출력/files/" 라고 표시 했으나 지금은 입력값을 받아 경로를 표현
//따라서 마지막 / 다음을 그냥 비워두었음
char[] buf = new char[100];
//문자배열 buf 크기는 100으로 생성
while (fr.read(buf) > 0) {
//buf가 0일때까지 반복을 할 예정이다
sb.append(buf);
//StringBuilder의 append 는 문자열을 덧붙이는 메서드로
//buf에 있는 문자열을 계속해서 덧붙여 주겠다
Arrays.fill(buf, ' ');
//buf에 남아 있는 문자가 5인데 이미 100을 입력 받았을때
// 5개의 새 문자와 이미 입력 된 95개가 한번에 출력 됨으로 ' ' 공란을 채워 초기화 시켜준다
}
fr.close();
//사용 후 스트림은 닫아줘야 한다
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
public void copy(String src, String des) {//파일 복사
//String src 와 String des 를 받을 것이다.
String txt = fileRead(src);
try {
FileWriter fw = new FileWriter(des);
//FileWriter 클래스를 사용하여 복사 대상 파일(des)에
fw.write(txt);
//텍스트 데이터(txt)를 쓰는 작업을 수행
//txt는 현재 src 를 담고 있음
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class filecopy {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String dir = "src/입출력/files/";
//경로를 입력 받을 것이기 때문에 파일명을 dir에 넣어주고
System.out.println("원본파일명 : ");
String srcf = sc.next();
//입력을 srcf 에 담고
File f = new File(dir + srcf);
//파일의 경로를 (dir + srcf) 이렇게 설정
if (!f.exists()) {
System.out.println("원본파일이 존재하지 않습니다");
return;
}
System.out.println("복사 파일명 : ");
String desf = sc.next();
//복사할 파일명을 입력하게 하고
FileCopy2 fc = new FileCopy2();
//위에서 생성해준 class FileCopy2 클래스를 객체화 시켜
fc.copy(dir + srcf, dir + desf);
//copy메서드를 호출하여 (String src, String des) 이걸
//(dir + srcf, dir + desf) 이렇게 표현
String res = fc.fileRead(dir + desf);
//String dir = "src/입출력/files/"; + String desf = sc.next();
System.out.println("복사된 내용 : " + res);
}
}
두번째 예시는 "FileReader"와 "FileWriter" 를 사용하는 방법이다. 첫번째 보다 간단하지만 유지보수가 어렵다고 한다.
package 입출력_완;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Filecopy2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String src = "src/입출력/files/a.txt"; //원본 파일 경로
String des = "src/입출력/files/z.txt"; //복사 파일 경로
try {
FileReader fr = new FileReader(src);
//원본파일에서 1문자씩 읽는 스트림을 생성해야함
FileWriter fw = new FileWriter(des);
//복사파일에 1문자씩 출력하는 스트림을 생성
int ch;
while ((ch = fr.read()) != -1) {
//원본파일에서 1문자씩 읽어서 ch에 저장
fw.write(ch); //읽은 값이 ch에 있으니까 ch 값을 복사파일에 출력
//읽자마자 쓰는거야 언제까지? while 문이 false 가 될 떄까지
}
fr.close();
fw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
'JAVA' 카테고리의 다른 글
자바 URLConnection과 HttpURLConnection (0) | 2023.07.29 |
---|---|
[JAVA] 입출력을 사용하여 입력 값을 받는 메모장 프로그램 만들기 (1) | 2023.03.13 |
[JAVA] 입출력 스트림 ⑥ 파일 제어 및 디렉토리 (0) | 2023.03.13 |
[JAVA] 입출력 스트림 ④ 보조스트림 _ RandomAccess (0) | 2023.03.13 |
[JAVA] 입출력 스트림 ④ 보조스트림 _ 바이트를 문자로 (0) | 2023.03.13 |