728x90
반응형
사례학습 - 텍스트 파일 처리 [시급처리]
기획
입력 파일을 csv 파일로 받아서 출력 파일 csv 파일을 만들어서 사용자에게 제공한다.
입력파일은 이름, 근무시간, 시급이 존재하고,
출력 파일은 입력파일에 기록된 정보를 토대로 이름에 따른 급여를 계산하여 출력 파일을 구성한다.
설계 - MVC 아키텍처
Controller는 입력 파일과 출력 파일의 파일 이름을 받는다.
받아진 입력, 출력 파일의 파일이름을 토대로
입력 파일의 정보를 받아오기 위해 PayrollReader 클래스를 이용하고,
출력 파일을 생성하기 위해 PayrollWriter 클래스를 이용한다.
여기서 Model 클래스는 PayrollReader 와 PayrollWriter 클래스가 된다.
코드 구현
PayrollReader 클래스
import java.io.*;
import java.util.*;
public class PayrollReader {
private BufferedReader infile;
private final String EOF = "!";
private String name;
private int hours, payrate;
public PayrollReader(String file_name) {
try {
infile = new BufferedReader(new FileReader(file_name));
}
catch (Exception e) {
System.out.println("PayrollReader Error - bad file name: " + file_name);
throw new RuntimeException(e.toString());
}
}
public String name() { return name; }
public int hours() { return hours; }
public int payrate() { return payrate; }
public void close() {
try { infile.close(); }
catch (IOException e) {
System.out.println("PayrollReader Warning - file close failed");
}
}
public boolean getNextRecord() {
boolean result = false;
try {
if (infile.ready()) {
String line = infile.readLine();
StringTokenizer t = new StringTokenizer(line, ",");
String s = t.nextToken().trim();
if (! s.equals(EOF))
// 입력 파일의 규칙인 이름,근무시간,시급 데이터가 제대로 존재하는 지 예외처리
// 프로그램 자체의 입력파일 규칙을 지정해뒀기에, 통과하지 못하면 잘못된 입력파일
if (t.countTokens() == 2) {
name = s;
hours = Integer.parseInt((t.nextToken().trim()));
payrate = Integer.parseInt((t.nextToken().trim()));
result = true;
}
else {
throw new RuntimeException(line);
}
}
}
catch (IOException e) {
System.out.println("PayrollReader Error : " + e.getMessage());
}
catch (RuntimeException e) {
System.out.println("PayrollReader Error - bad record format: " + e.getMessage() + " Skipping");
result = getNextRecord(); // 다음 줄 시도
}
return result;
}
}
csv 파일을 읽을 때는 한줄씩 데이터를 읽는다.
따라서, 텍스트 파일을 읽을 때는, 입력 파일의 규칙이 존재해야 하며, 프설방 강의에서는 입력파일에는
이름, 근무시간, 시급으로 데이터를 넣는 걸 규칙으로 지정했다.
Java에서 텍스트 파일을 읽어오는 원리는 DB에서 테이블에 데이터를 읽는 원리와 동일하다.
텍스트 파일 규칙 == 데이터베이스 테이블 지정 규칙
Java에서 텍스트 파일을 읽고나서 파일을 close (닫아야한다.) 해야한다.
DB를 이용할 때 DB 연결하고, 쿼리문을 요청 후 응답을 받고 DB연결을 끊어버리는 원리와 동일하다.
(보안상의 문제이기에, 저장소 개념은 항상 사용할 때만, 열고, 닫기를 진행한다.)
PayrollWriter 클래스
import java.io.*;
import java.util.*;
public class PayrollWriter {
private PrintWriter outfile;
public PayrollWriter(String file_name) {
try {
outfile = new PrintWriter(new FileWriter(file_name));
}
catch (Exception e) {
System.out.println("PayrollWriter Error: " + file_name);
throw new RuntimeException(e.toString());
}
}
public void close() {
outfile.close();
}
public void printCheck(String name, int payment) {
outfile.println(name + "," + payment);
}
public void printCheck(String s) {
outfile.println(s);
}
}
PayrollController 클래스
public class PayrollController {
public void processPayroll(String in, String out) {
PayrollReader reader = new PayrollReader(in);
PayrollWriter writer = new PayrollWriter(out);
while (reader.getNextRecord()) {
int payment = reader.hours() * reader.payrate();
writer.printCheck(reader.name(), payment);
}
writer.printCheck("!");
reader.close();
writer.close();
}
}
Payroll 클래스
import javax.swing.*;
public class Payroll {
public static void main(String[] args) {
String name_in = JOptionPane.showInputDialog("입력 파일명");
String name_out = JOptionPane.showInputDialog("출력 파일명");
if (name_in != null && name_out != null)
new PayrollController().processPayroll(name_in, name_out);
}
}
728x90
반응형
'CS 대학강의' 카테고리의 다른 글
[CS 1-2 | 프로그램 설계 방법론] CS 1학년 JAVA 강좌 마지막 과제 (0) | 2022.11.20 |
---|---|
[CS 1-2 | 프로그램 설계 방법론] 기말 기출해석 (0) | 2022.11.18 |
[CS 1-2 | 프로그램 설계 방법론] 텍스트 및 파일처리 17주차 (0) | 2022.11.17 |
[CS 1-2 | 오픈소스 SW 기초] 사물인터넷 7주차 (0) | 2022.11.17 |
[CS 1-2 | 프로그램 설계 방법론] JAVA로 블랙잭 프로그램 제작 (0) | 2022.11.16 |