20/11/12

아라·2020년 11월 12일
0

국비교육

목록 보기
23/30

파일 입출력

자바 프로그램 <- (데이터) -> 파일(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)브라우저

파일 쓰기 : FileOutputStream(바이트 단위, 한글X)

// 파일 입출력
// - 외부 환경과의 교류
// - 사용 메서드 -> 예외 미루기 설정 -> 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

콘솔에서 종료버튼 안 누르면 계속 실행중이어서 실행중으로 javaw.exe가 계속 뜬다. 그러니까 종료버튼 꼭 누르기.

파일 읽기 : FileInputStream(바이트 단위, 한글X)

//읽기
// - 바이트 단위 읽기
// - 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

// 쓰기
		
// 알맹이만 바꾸면 콘솔, 네트워크, 파일 입출력 전부 가능.
// 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

// 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)
객체 정적 변수도 접근할 수 있다.

0개의 댓글