이번 과제는 파일 입출력을 이용해 주소록을 만들어 보는 것이다. 원래대로라면 FileBufferedReader, BufferedWriter 등을 이용해서 할 생각이었는데, 일단은 Scanner와 PrintWriter만을 이용해서 해보려고 했다. 중간중간 데이터가 깨지고 Scanner가 예상한대로 작동하지 않는 등 몇가지 문제가 있었는데 어찌어찌 동작은 하게됐다. 더러운 부분들은 추후에 수정할 예정.
이번 과제를 하면서 알게된 점이 있는데, Scanner sc = new Scanner(System.in) 과 같은 선언은 한 번만 해야 한다는 것. 하나의 프로세스에는 하나의 IO만 연결된다고 한다. System.in은 시스템으로부터 IO권한을 가져오는 것인데, 시스템은 프로세스한테 하나의 IO만 걸어줄 수 있다고..
처음 시도했던 방법은 InputData에서 새로운 스캐너를 만들어 파일에 집어넣는 방식이었는데, InputData에서 스캐너를 close시켰더니 Main의 스캐너가 함께 죽어버리는 현상이 발생해서 막혀있던 차에 다행히 동아리 선배님이 위의 내용을 알려주셔서 계속 돌려 쓸 새로운 스캐너 클래스 Scanners.java를 만들어서 사용하게 되었다.
프로그램을 돌리고 나면 프로젝트 폴더에 test.csv 파일이 귀엽게 생성되어있다.
* 프로젝트 구성
* Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import java.io.FileNotFoundException; public class Main { public static void main(String[] args) { InputData ipd = new InputData(); PrintData prd = new PrintData(); ResetData rsd = new ResetData(); Scanners scs = new Scanners(); String i; System.out.println("** 주소록 프로그램을 실행합니다. **"); while (true) { try { System.out.println("***************\n무엇을 하시겠습니까?\n" + " 1. 데이터 읽기\n" + " 2. 데이터 추가\n" + " 3. 데이터 초기화\n" + " 4. 종료\n***************"); i = scs.getSc(); switch (i) { case "1": prd.printAddress(); break; case "2": ipd.inputAddress(); break; case "3": rsd.resetAddress(); break; case "4": System.out.println("** 프로그램을 종료합니다. **"); scs.ScClose();; System.exit(0); break; } } catch (FileNotFoundException e) { e.printStackTrace(); } } } } | cs |
* User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public class User { private String id; private String name; private int age; public User(String id, String name, int age) { setId(id); setName(name); setAge(age); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } | cs |
* InputData.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.Scanner; public class InputData { public void inputAddress() throws FileNotFoundException { User us = new User(null, null, 0); Scanners scs = new Scanners(); System.out.println("** 주소록에 데이터를 추가합니다. **\n아이디를 입력해주세요."); us.setId(scs.getSc()); System.out.println("이름을 입력해주세요."); us.setName(scs.getSc()); System.out.println("나이를 입력해주세요."); us.setAge(Integer.parseInt(scs.getSc())); File f = new File("test.csv"); Scanner fileSc = new Scanner(f); String result = ""; while (fileSc.hasNext()) { String temp = fileSc.nextLine(); User us_original = new User(temp.split(", ")[0], temp.split(", ")[1], Integer.parseInt(temp.split(", ")[2])); result = result + us_original.getId() + ", " + us_original.getName() + ", " + us_original.getAge() + '\n'; } fileSc.close(); PrintWriter pw = new PrintWriter(f); try{ pw.println(result + us.getId() + ", " + us.getName() + ", " + us.getAge()); //System.out.println(result + us.getId() + ", " + us.getName() + ", " + us.getAge()); pw.close(); } catch(Exception e) { e.printStackTrace(); } System.out.println("데이터를 입력했습니다.\n"); } } | cs |
* PrintData.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class PrintData { public void printAddress() throws FileNotFoundException { System.out.println("** 주소록의 데이터를 출력합니다. **\n 아이디 / 이름 / 나이"); File f = new File("test.csv"); Scanner sc = new Scanner(f); String result = ""; while (sc.hasNext()) { String temp = sc.nextLine(); User us = new User(temp.split(", ")[0], temp.split(", ")[1], Integer.parseInt(temp.split(", ")[2])); result = result + us.getId() + ' ' + us.getName() + ' ' + us.getAge() + '\n'; } sc.close(); System.out.println(result + "\n** 파일을 불러왔습니다. **"); } } | cs |
* ResetData.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; public class ResetData { public void resetAddress() throws FileNotFoundException { File f = new File("test.csv"); PrintWriter pw = new PrintWriter(f); pw.println("HongGilDong, 홍길동, 18"); pw.println("SimBongsa, 심봉사, 43"); pw.println("SimChung, 심청, 17"); pw.println("HengBu, 흥부, 31"); pw.println("NolBu, 놀부, 33"); pw.close(); System.out.println("** 데이터가 초기화 되었습니다. **\n"); } } | cs |
* Scanners.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.util.Scanner; public class Scanners { private Scanner sc = new Scanner(System.in); public String getSc() { return sc.nextLine(); } public void setSc(Scanner sc) { this.sc = sc; } public void ScClose() { this.sc.close(); } } | cs |
* 실행결과
*** 콘솔창
*** test.csv 파일
반응형
'이론 > JAVA' 카테고리의 다른 글
웹 페이지 파싱 (Jsoup 이용) (0) | 2017.11.06 |
---|---|
로또 생성기 - 자바 스터디 2회차 과제 (0) | 2017.10.13 |
직접 입력하는 계산기 만들기 - 자바 스터디 1회차 과제 (0) | 2017.09.30 |
댓글