종료 후 재실행시 출력을 누르면 전에 입력받았던 값들을 출력하는 프로그램
소스 보기 >>
더보기

실행 시 EOFException 발생한 것을 볼 수 있다.

address.txt 안에 데이터가 저장된다. 인코딩이 UTF 로 되서 한글문자는 확인이 불가하다.
Main
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Ex017_DataStream {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Test t = new Test();
int ch;
try {
while(true) {
do {
System.out.print("1.입력 2.출력 3.종료 => ");
ch = sc.nextInt();
} while(ch<1 || ch> 3);
if (ch ==3) {
t.saveFile();
return;
}
switch(ch) {
case 1 : t.add(); break;
case 2 : t.printAll(); break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
sc.close();
}
}
}
Class
class TestVO {
private String name;
private String tel;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Test {
private String pathname = "address.txt";
private List<TestVO> list = new ArrayList<>();
private BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public Test() {
loadFile();
}
private void loadFile() {
File f = new File(pathname);
if( ! f.exists()) {
return;
}
// 파일이 존재하면 파일의 내용을 읽어ㅣlist에 저장
DataInputStream dis = null;
try {
dis = new DataInputStream(new FileInputStream(f));
String name, tel;
int age;
while(true) {
name = dis.readUTF();
tel = dis.readUTF();
age = dis.readInt();
TestVO vo = new TestVO();
vo.setName(name);
vo.setTel(tel);
vo.setAge(age);
list.add(vo);
}
} catch (EOFException e) {
// DataInputStream은 더 이상 읽을 데이터가 없으면 EOFException예외가 발생한다.
// 따라서 이곳에서는 코드를 작성할 필요없이 예외만 catch한다.
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dis != null) {
try {
dis.close();
} catch (Exception e2) {
}
}
}
}
public void saveFile() {
try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(pathname))) {
for(TestVO vo : list) {
dos.writeUTF(vo.getName());
dos.writeUTF(vo.getTel());
dos.writeInt(vo.getAge());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void add() {
System.out.println("\n데이터 등록");
try {
TestVO vo = new TestVO();
System.out.print("이름 ? ");
vo.setName(br.readLine());
System.out.print("전화번호 ? ");
vo.setTel(br.readLine());
System.out.print("나이 ? ");
vo.setAge(Integer.parseInt(br.readLine()));
list.add(vo);
System.out.println("등록 완료...\n");
} catch (NumberFormatException e) {
System.out.println("나이는 숫자만 가능합니다.");
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public void printAll() {
System.out.println("\n데이터 출력");
for(TestVO vo : list) {
System.out.print(vo.getName()+"\t");
System.out.print(vo.getTel()+"\t");
System.out.println(vo.getAge());
}
System.out.println();
}
}
Test의 생성자에 loadFile() 을 넣어 종료 후 다시 실행했을 때는 파일을 불러오도록 한다.
loadFile() 메소드에서는 파일의 pathname 으로 된 파일의 객체를 생성해준다. 그 파일이 없으면 exists() 메소드에서 false를 return해주므로 읽을 파일이 존재하지 않다는 것을 의미하므로 밖으로 나간다.
pathname 의 파일이 있으면 그 파일을 읽어서 list에 저장해주어야 출력할 수 있으므로 리스트에 넣는 작업을 해준다.
EOFException을 잡지 않으면, 첫 실행시 생성자에서 loadFile() 메소드를 실행해 파일이 없으면 나가고 파일이 있으면 읽고 리스트에 넣는 작업을 하고 더 이상 넣을 데이터가 없으면 EOFException이 발생한다.

따라서 코드 작성 필요없이 예외만 catch한다.
saveFile() 을 통해 종료를 누르면 입력했던 데이터들을 파일에 저장한다.
FileOutputStream 은 파일이 없으면 생성하고 있으면 내용을 덮어씀으로 로드시 List에 넣어놨던 것들을 차례대로 저장시 넣어주어야 자료가 손실되지 않는다.

'쌍용강북교육센터 > 8월' 카테고리의 다른 글
0825_Java : ObjectStream 활용 예제 (0) | 2021.08.25 |
---|---|
0825_Java : ObjectOutputStream, ObjectInputStream 클래스 (0) | 2021.08.25 |
0825_Java : DataInputStream, DataOutputStream 클래스 (0) | 2021.08.25 |
0825_Java : BufferedReader, BufferedWriter 클래스 (0) | 2021.08.25 |
0824_Java숙제 : 파일 속 자료 중에 조건에 해당하는 자료 다른 파일로 옮기기 (2) | 2021.08.25 |