이 글에서는 Java에서 문자열을 파일에 저장하는 방법에 대해 알아보겠습니다. 여기서는 FileWriter와 BufferedWriter를 사용하여 파일에 데이터를 저장하는 방법을 알아보겠습니다.
FileWriterFileWriter는 파일에 문자를 쓰기 위한 기본적인 클래스입니다. FileWriter는 텍스트 데이터를 파일에 쓸 수 있게 해주며, FileOutputStream을 확장하여 바이트 단위로 파일에 데이터를 쓰는 기능을 제공합니다.
FileWriter writer = new FileWriter("output.txt");
writer.write("Hello, world!");
BufferedWriterBufferedWriter는 문자 데이터를 버퍼에 쌓아서 한 번에 여러 문자를 효율적으로 쓰는 데 도움을 주는 클래스입니다. BufferedWriter는 내부적으로 버퍼를 사용하여 한 번에 여러 데이터를 파일에 쓸 수 있도록 하여 I/O 작업을 최적화합니다.
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
writer.write("Hello, world!");
다음 코드는 "Happy 2025!!"라는 문자열을 output.txt라는 파일에 저장하는 예시입니다.
public void txtWriter() {
String msg = "Happy 2025!!";
File file = null;
FileWriter writer = null;
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(new File("./output.txt"))); // ./는 현재 파일위치
bw.write(msg);
System.out.println("파일저장 완료!!!");
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if(bw != null) {bw.close();}
} catch(Exception e) {
e.printStackTrace();
}
}
}
BufferedWriter와 FileWriter를 사용하여 문자열을 파일에 작성합니다.finally 블록에서 리소스를 닫습니다.🛑리소스를 닫는 이유!!
파일을 읽고 쓰는 작업은 외부 리소스를 사용하므로 작업이 끝난 후 리소스를 닫는 것이 중요합니다.
- 파일에 데이터가 완전히 저장되지 않을 수 있음: BufferedWriter와 같은 클래스는 내부 버퍼에 데이터를 잠시 저장한 후 한 번에 파일에 씁니다. 만약 리소스를 닫지 않으면 버퍼에 저장된 데이터가 파일에 쓰여지지 않고, 데이터 손실이 발생할 수 있습니다.
- 리소스 관리: 파일을 열면 시스템 리소스를 차지합니다. 리소스를 닫지 않으면 메모리 누수나 파일 핸들 누수가 발생할 수 있습니다.
지난 글에서 작성한 BufferedReader의 readLine() 메서드를 사용하여 파일을 한 줄씩 읽어보겠습니다.
public void txtReader() {
File file = null;
FileReader reader = null;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(new File("c:/testReader.txt")));
String data = null;
while((data = br.readLine()) != null) {
System.out.println(data);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if(br != null) {br.close();}
} catch(Exception e) {
e.printStackTrace();
}
}
}
BufferedReader와 FileReader를 사용하여 파일에서 데이터를 읽어옵니다.readLine() 메서드를 사용하여 한 줄씩 읽으며, 더 이상 읽을 줄이 없으면 null을 반환합니다.사용자가 콘솔에서 입력한 데이터를 파일로 저장하는 기능을 구현하는 방법도 알아보겠습니다. BufferedReader와 BufferedWriter를 함께 사용하여 콘솔로부터 입력받은 데이터를 파일에 저장합니다.
public void question01() {
File file = null;
FileWriter writer = null;
BufferedWriter bw = null;
BufferedReader txt = new BufferedReader(new InputStreamReader(System.in));
String str = null;
try {
bw = new BufferedWriter(new FileWriter(new File("./test.txt")));
while(true) {
System.out.print("저장할 데이터를 입력하세요: ");
str = txt.readLine();
if(str.equals("exit")) {
System.out.println("종료합니다.");
break;
} else {
bw.write(str); // 입력한 데이터 bw에 넣기
bw.newLine(); // 줄바꿈
System.out.println("파일저장 완료!!!");
}
}
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
if(bw != null) {bw.close();}
} catch(Exception e) {
e.printStackTrace();
}
}
}
exit입력 시 종료합니다.BufferedWriter로 파일에 저장합니다.BufferedReader로 받아들이고, BufferedWriter로 파일에 기록합니다.배열에 저장된 객체 정보를 파일에 저장하는 기능을 구현하는 예시입니다. 객체 배열을 순회하며 각 객체의 정보를 파일에 기록합니다.
public void outputObjectFile() {
PersonVO[] ary = new PersonVO[10];
StudentVO stu = new StudentVO("하츄핑", 20, "서울", "2000");
TeacherVO tea = new TeacherVO("아자핑", 35, "서울", "자바");
EmployeeVO emp = new EmployeeVO("차차핑", 38, "서울", "교육운영팀");
ary[0] = stu;
ary[1] = tea;
ary[2] = emp;
File file = null;
FileWriter writer = null;
BufferedWriter bw = null;
try {
file = new File("./instance.txt");
writer = new FileWriter(file);
bw = new BufferedWriter(writer);
for(int i = 0; i < ary.length; i++) {
if(ary[i] != null) {
String data = ary[i].info();
System.out.println(data);
bw.write(data + "\n");
bw.flush(); // 파일에 데이터가 누락되는 상황을 방지
System.out.println("파일에 저장완료!!");
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if(bw != null) {bw.close();}
} catch(Exception e) {
e.printStackTrace();
}
}
}
info() 메서드를 호출하여 정보를 파일에 저장합니다.BufferedWriter로 파일에 데이터를 기록하고, flush()를 사용하여 즉시 저장되도록 합니다.파일에 저장된 데이터를 프로그램 실행 시 불러오는 방법을 살펴보겠습니다. BufferedReader를 사용하여 파일을 읽고, 데이터를 객체로 변환하여 배열에 저장합니다.
public boolean loadToFile() {
boolean flag = false;
File file = null;
FileReader reader = null;
BufferedReader br = null;
PersonVO[] per = new PersonVO[10];
int i = 0;
try {
br = new BufferedReader(new FileReader(new File("./Object.txt")));
String data = null;
while((data = br.readLine()) != null) {
String[] strAry = data.split("-");
if(strAry[i] != null) {
String name = strAry[++i];
int age = Integer.parseInt(strAry[++i]);
String address = strAry[++i];
String common = strAry[++i];
i -= 4;
if(strAry[i].equals("stu")) {
per[i] = new StudentVO(name, age, address, common);
}
if(strAry[i].equals("tea")) {
per[i] = new TeacherVO(name, age, address, common);
}
if(strAry[i].equals("emp")) {
per[i] = new EmployeeVO(name, age, address, common);
}
setAry(per[i]);
}
flag = true;
}
} catch(Exception e) {
e.printStackTrace();
flag = false;
} finally {
try {
if(br != null) {br.close();}
} catch(Exception e) {
e.printStackTrace();
}
}
return flag;
}