만들 예제의 실행모습 

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

 

소스 보기 >>

더보기

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이 발생한다.

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

따라서 코드 작성 필요없이 예외만 catch한다.

 

saveFile() 을 통해 종료를 누르면 입력했던 데이터들을 파일에 저장한다.

FileOutputStream 은 파일이 없으면 생성하고 있으면 내용을 덮어씀으로 로드시 List에 넣어놨던 것들을 차례대로 저장시 넣어주어야 자료가 손실되지 않는다.

address.txt 안에 데이터가 저장된다. 인코딩이 UTF 로 되서 한글문자는 확인이 불가하다.

 

 

+ Recent posts