자바 프로그램 <- (데이터) -> 파일(HDD)
- 콘솔 입출력 방식과 인터페이스 유사
- 주기억장치(휘발성)
- 보조기억장치(반영구적)
문자데이터 입출력.
이미지, 동영상, 압축파일, 실행파일 등. 비문자 데이터 입출력.
문자 코드를 부호화(0, 1)하는 작업
부호 데이터를 문자 코드화하는 작업
ISO-8859-1, EUC-KR, ANSI, UTF-8(표준인코딩! 영어 : 1byte, 한글 : 3byte), UTF-16(영어 : 2byte, 한글 : 2byte), MS949
**ANSI(ISO-8859-1, EUC-KR, MS949) : 영어 : 1byte, 한글 : 2byte
네이버 웹서버(UTF-8) -> 인코딩 + 디코딩 -> (UTF-8)브라우저
// 파일 입출력
// - 외부 환경과의 교류
// - 사용 메서드 -> 예외 미루기 설정 -> try catch
// 쓰기
// 바이트 단위 쓰기
// 1바이트씩 저장
// 파일에 데이터 저장하기(쓰기)
// 1. 스트림 객체 생성하기(열기)
// 2. 스트림 객체 사용하기(쓰기)
// 3. 스트림 객체 닫기
try {
// 쓰기 전용 스트림(빨대)
// - 스트림 모드
// 1. 생성모드(Create Mode)
// - 기본방식
// - 파일이 없으면 새로 만든다.
// - 파일이 있으면 무조건 덮어쓰기를 한다.
// 2. 추가모드(Append Mode)
// - 파일이 없으면 새로 만든다.
// - 파일이 있으면 기존 내용을 이어쓰기를 한다.
// 1. 스트림 객체 생성
File file=new File("/Users/ara/class/java/file/data.txt");
FileOutputStream stream=new FileOutputStream(file, true); // true는 이어쓰기 모드.
// 2. 쓰기
stream.write(97);
stream.write(98);
stream.write(99);
// 자동 형변환
stream.write('\r');
stream.write('\n');
stream.write('J');
stream.write('a');
stream.write('v');
stream.write('a');
// 3. 닫기!!!
stream.close();
System.out.println("완료");
} catch (Exception e) {
System.out.println("Ex75_File.m1()");
e.printStackTrace();
}
try {
FileOutputStream stream = new FileOutputStream("/Users/ara/class/java/file/diary.txt", true);
Scanner scan=new Scanner(System.in);
String input= scan.nextLine();
for(int i=0;i<input.length();i++) {
char c=input.charAt(i);
stream.write(c);
}
stream.write('\r');
stream.write('\n');
stream.close();
} catch (Exception e) {
System.out.println("Ex75_File.m2()");
e.printStackTrace();
}
데이터의 종류에는 아래와 같은 두 가지가 있다.
1. 고정폭 : 이름, 나이, 성별, 연락처
2. 가변폭 : 주소
콘솔에서 종료버튼 안 누르면 계속 실행중이어서 실행중으로 javaw.exe가 계속 뜬다. 그러니까 종료버튼 꼭 누르기.
//읽기
// - 바이트 단위 읽기
// - System.in.read() 동일
try {
// 읽기 전용 스트림(빨대)
FileInputStream stream
= new FileInputStream("/Users/ara/class/java/file/diary.txt");
// int code=stream.read();
// System.out.println(code+","+(char)code);
// code=stream.read();
// System.out.println(code+","+(char)code);
// code=stream.read();
// System.out.println(code+","+(char)code);
// 하나하나씩 말고 통째로 읽기
int code=-1;
while((code=stream.read())!=-1) {
System.out.print((char)code);
}
// 종료
stream.close();
} catch (Exception e) {
System.out.println("Ex75_File.m3()");
e.printStackTrace();
}
// 쓰기
// - 문자 단위 쓰기(2byte)
// - 모든 문자를 기록할 수 있다.(한글 포함)
try {
FileWriter writer=new FileWriter("/Users/ara/class/java/file/todo.txt");
writer.write("abc");
writer.write("\r\n");
writer.write("안녕하세요. 홍길동입니다.");
writer.close();
// 추가작성
// 닫힌 스트림은 사용이 불가능하다.
// 정 해야할 경우는 새로 스트림 생성
writer=new FileWriter("/Users/ara/class/java/file/todo.txt", true);
writer.write("추가내용입니다.");
writer.close();
} catch (Exception e) {
System.out.println("Ex75_File.m4()");
e.printStackTrace();
}
// 읽기
// - 문자 단위 읽기(한글도 가능!)
try {
FileReader reader=new FileReader("/Users/ara/class/java/file/message.txt");
// int code=reader.read();
// System.out.println((char)code);
int code=-1;
while((code=reader.read())!=-1) {
System.out.print((char)code);
}
} catch (Exception e) {
System.out.println("Ex75_File.m6()");
e.printStackTrace();
}
// 쓰기
// 알맹이만 바꾸면 콘솔, 네트워크, 파일 입출력 전부 가능.
// BufferedWriter writer=new BufferedWriter(알맹이);
try {
BufferedWriter writer
= new BufferedWriter(new FileWriter("/Users/ara/class/java/file/log.txt"));
writer.write("문자열입니다.");
writer.write("\r\n");
writer.write("하하하");
writer.newLine();
writer.write("호호호");
writer.close();
System.out.println("완료");
} catch (Exception e) {
System.out.println("Ex75_File.m7()");
e.printStackTrace();
}
// BufferedReader
// 1. 키보드 입력
// 2. 파일 입력(읽기)
try {
BufferedReader reader=new BufferedReader(new FileReader("/Users/ara/class/java/file/log.txt"));
// BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// String line=reader.readLine();
// System.out.println(line);
String line=null;
while((line=reader.readLine())!=null) {
System.out.println(line);
}
reader.close();
} catch (Exception e) {
System.out.println("Ex75_File.m8()");
e.printStackTrace();
}
private static void m10() {
// 학생 정보 입출력
// 데이터 구조
// - 이름, 나이, 성별, 주소, 연락처
// - student.dat
// 절대경로
// - 드라이브명부터 시작하는 표현
File file=new File("/Users/ara/class/java/JaveTest/src/data/student.dat");
// System.out.println(file.exists());
// 상대경로
// -.으로부터 시작하는 표현
// -. : 프로젝트 루트 폴더
// File file2=new File("./src/data/student.dat"); 이것도 가능
// File file2=new File("src/data/student.dat");
// System.out.println(file2.exists());
System.out.println("====================");
System.out.println("학생 정보 관리 프로그램");
System.out.println("====================");
Scanner scan=new Scanner(System.in);
boolean loop=true;
while(loop) {
System.out.println("1. 학생 정보 보기");
System.out.println("2. 학생 정보 쓰기");
System.out.println("3. 종료");
System.out.print("선택 : ");
String sel=scan.nextLine();
if (sel.equals("1")) {
list();
}else if(sel.equals("2")) {
add();
}else if(sel.equals("3")) {
loop=false;
}else {
System.out.println("잘못된 메뉴 선택입니다.");
}
}
System.out.println("프로그램 종료");
}
private static void list() {
System.out.println("학생 목록");
System.out.println("[이름]\t[나이]\t[성별]\t[연락처]\t[주소]");
try {
BufferedReader reader=new BufferedReader(new FileReader(Data.학생정보));
String line=null;
while((line=reader.readLine())!=null) {
// System.out.println(line);
// 홍길동,20,m,010-1234-5678,서울시 강남구 역삼동
String[] temp=line.split(",");
System.out.printf("%s\t%5s\t%s\t%s\t%s\n", temp[0], temp[1], temp[2].equals("m")?"남자":"여자", temp[3], temp[4]);
}
reader.close();
pause();
} catch (Exception e) {
System.out.println("Ex75_File.list()");
e.printStackTrace();
}
}
private static void pause() {
Scanner scan = new Scanner(System.in);
System.out.println("엔터 입력...");
scan.nextLine();
}
private static void add() {
System.out.println("학생 정보 추가");
try {
BufferedWriter writer=new BufferedWriter(new FileWriter(Data.학생정보, true));
Scanner scan=new Scanner(System.in);
System.out.print("이름 : ");
String name=scan.nextLine();
System.out.print("나이 : ");
String age=scan.nextLine();
System.out.print("성별(m|f) : ");
String gender=scan.nextLine();
System.out.print("연락처 : ");
String tel=scan.nextLine();
System.out.print("주소 : ");
String address=scan.nextLine();
writer.write(String.format("%s,%s,%s,%s,%s\n", name, age, gender, tel, address));
writer.close();
System.out.println("저장 완료");
pause();
} catch (Exception e) {
System.out.println("Ex75_File.add()");
e.printStackTrace();
}
}
또 다른 객체 메서드를 호출할 수 있다.
또 다른 정적 메서드를 호출할 수 있다.
객체 멤버 변수도 접근할 수 있다.
객체 정적 변수도 접근할 수 있다.
또 다른 객체 메서드를 호출할 수 없다.(X)
또 다른 정적 메서드를 호출할 수 있다.
객체 멤버 변수도 접근할 수 없다.(X)
객체 정적 변수도 접근할 수 있다.