국비학원/공부

22일차 java(10)

mikan- 2023. 7. 3. 13:22

# 파일저장

public class DataOutputTest2 {

	public static void main(String[] args) throws Exception {
		
		// 1. 파일로 저장
		FileOutputStream fos = new FileOutputStream("c:\\webtest\\readme6.txt");
		
		// 2. 자바에 자료형에 맞게 포장해서 -> DataOutputStream(출력용)
		DataOutputStream dos = new DataOutputStream(fos);
		
		// 3. 메모리 -> 자료형에 맞게 파일에 저장
		char han = '한'; // 0 ~ 65535
		System.out.println((int)han); // 54620 유니코드
		
		byte b = 21; // "21"
		String str = "bg\n"; 
		byte ba[] = {65, 66, 67}; // A, B, C 의 아스키코드
		
		// 파일로 저장
		// 형식) write 자료형(저장할 값) <-> read 자료형()
		dos.writeChar(han);
		dos.writeByte(b);
		dos.writeBytes(str); // writeString(X)
		dos.write(ba); // 배열의 값을 매개변수로 저장 -> A, B, C
		
		dos.close();
		fos.close();
		
		//==============추가=================
		// 만들어진 파일의 내용을 다시 읽어들여서 확인 후 출력
		DataInputStream dis = new DataInputStream(new FileInputStream("c:\\webtest\\readme6.txt"));
		
		// 변수 = dis.read 자료형 <-> dos.write 자료형(저장할 값)
		char c = dis.readChar(); // '한'
		byte b1 = dis.readByte(); // byte = 21;
		String s = dis.readLine(); // readString(X)
					    // 앞으로 사라질거니 사용 안하는걸 추천
		byte bb[] = new byte[3]; // 65, 66, 67
		// byte bb[] = {65, 66, 67} -> String(A, B, C)로 출력 예정
		dis.read(bb); // 파일에 저장된 byte값을 배열로 bb에 저장
		
		System.out.println("c : " + c);
		System.out.println("b1 : " + b1);
		System.out.println("s : " + s);
		
		/*
		for (int i = 0; i < bb.length; i++) {
			System.out.print(bb[i] + " ");
		}
		*/
		for (byte b2:bb) {
			System.out.print((char)b2);
			System.out.print(b2 + "\t");
		}
		System.out.println("\n===================================");
		
		String str2 = new String(bb);
		System.out.println("str2 : " +str2);
		byte t[] = str2.getBytes(); // t[] = {65, 66, 67}
		for (byte b3:t) {
			System.out.print((char)b3);
		}
		// byte[] -> String 변환
		// String -> byte[]로 변환
	}
}

 

# 파일저장 (2)

// 외부의 파일(txt, img, 동영상, 실행파일(exe)) -> FileInputStream
// <-> FileReader(한글문서)

public class FileInputTest {

	public static void main(String[] args) throws Exception {
		
		// 자바는 \ 인식 못하기 때문에 \\ or / 로 변경 해야됨
		FileInputStream fis = new FileInputStream("C:\\webtest\\readme.txt");
		
		// 파일의 내용을 저장할 변수
		int read = 0;
		
		// 파일이 계속해서 읽어들일 수 있는 상태라면
		/*
		while(read != -1) {
			read = fis.read(); // = System.in.read() 대신에 사용
			System.out.write(read); // 콘솔에 파일의 내용을 변환해서 출력
		}
		*/
		while(true) {
			read = fis.read();
			if(read == -1) break; // 파일의 끝에 도달하면 더이상 출력X
			System.out.write(read);
		}
		
		fis.close();
	}

}

 

# 파일저장 (3)

// 외부의 파일(txt, img, 동영상, 실행파일(exe)) -> FileInputStream
// <-> FileReader(한글문서)
import java.io.*; // 예외처리 미리

public class FileInputTest2 {

	public static void main(String[] args) throws Exception {
		
		// 자바는 \ 인식 못하기 때문에 \\ or / 로 변경 해야됨
		FileInputStream fis = new FileInputStream("C:\\webtest\\readme.txt");
		
		// 파일의 내용을 저장할 변수
		int read = 0;
		
		/* 1번째
		FileOutputStream fos = new FileOutputStream("C:\\webtest\\readme1.txt");
		*/
		
		/* 2번째 - 파일객체를 이용(생성자의 매개변수로 전달해서 작성) 
		File f = new File("C:\\webtest\\readme2.txt");
		FileOutputStream fos = new FileOutputStream(f);
		*/
		
		// 3번째 - 다단계 결합
		FileOutputStream fos = new FileOutputStream(new File("C:\\webtest\\readme3.txt")); // 익명객체
		while(true) {
			read = fis.read();
			if(read == -1) break; // 파일의 끝에 도달하면 더이상 출력X
			fos.write(read);
			//System.out.write(read);
		}
	}

}

 

# BuffuerdReader

public class FilterTest {

	public static void main(String[] args) throws IOException {
		
		// System.in 은 InputStream 의 객체(멤버변수)다
		// System.out -> PrintStream 의 객체(표준출력객체)다
		
		// 키보드로 데이터를 읽어들일 때 한글이 깨지지 않도록 많은양의 데이터를 읽어들임
		// 한 줄 로 표현하면 Scanner sc = new Scanner();
		/*
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		*/
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 익명객체를 통해 넣을 수 있음
		
		String name;
		int kor, eng, total;
		
		System.out.println("이름은");
		name = br.readLine(); // name = sc.next();
		
		System.out.println("국어 점수는");
		kor = Integer.parseInt(br.readLine()); // kor = sc.nextInt();
	//  kor = Double.parseDouble(br.readLine()); "56.9" -> 56.9
		
		System.out.println("영어 점수는");
		eng = Integer.parseInt(br.readLine()); // eng = sc.nextInt();
		
		total = kor + eng;
		System.out.println("이름 : " + name + ", 총점 : " + total);
		
		
	}

}

 

# BuffuerdReader (2)

/*
 * 키보드로 값을 입력 받아서 한글 데이터 출력
 * ex) 이름, 국어점수, 영어점수 -> 입력 -> 이름 : 홍길동, 총점 : 180점
 */
import java.io.*;

public class Sawon {

	public static void main(String[] args) throws Exception {
		
		// 이름, 사번, 암호, 성별, 나이, 전화번호
		String mem_name, mem_id, mem_pwd;
		String mem_gender, mem_age, mem_phone;
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 익명객체를 통해 넣을 수 있음
		
		// 추가(한글데이터 저장)
		File f = new File("C:\\webtest\\readme5.txt");
		FileWriter fw = new FileWriter(f, true); // true 때문에 중첩 가능
		
		System.out.println("====회원 정보 입력하기====");
		System.out.println("이름은");
		mem_name = br.readLine();
		
		System.out.println("ID는");
		mem_id = br.readLine();
		
		System.out.println("비밀번호는");
		mem_pwd = br.readLine();
		
		System.out.println("성별은");
		mem_gender = br.readLine();
		
		System.out.println("나이는");
		mem_age = br.readLine();
	
		System.out.println("전화번호는");
		mem_phone = br.readLine();
		
		// 파일에 저장
		fw.write(mem_name); fw.write("\r\n"); // 1310 줄 바꿈
		fw.write(mem_id); fw.write("\r\n"); // 1310 줄 바꿈
		fw.write(mem_pwd); fw.write("\r\n"); // 1310 줄 바꿈
		fw.write(mem_gender); fw.write("\r\n"); // 1310 줄 바꿈
		fw.write(mem_age); fw.write("\r\n"); // 1310 줄 바꿈
		fw.write(mem_phone); fw.write("\r\n"); // 1310 줄 바꿈
		fw.write("\r\n");
		
		fw.close(); // 메모리 해제
		br.close();
	}

}

 

# 객체직렬화

* 조건) String -> 각각 자료형에 맞게 저장(DataOutputStream) -> 객체를 파일로 저장
 *              -> usb or Email로 전송(파일 첨부 기능)
 *              -> 직렬화 -> 메모리(객체) -> ObjectOutputStream(객체포장) -> 파일저장
 *                                        -> ex) 냉장고에 저장(냉동실) <-> 역직렬화(해동)
 * 모든 클래스의 객체가 전부 파일로 저장되지는 않는다. -> 객체직렬화가 가능한 클래스로 만들어줘야 된다.
 * 
 * 형식 ) class 클래스명 implements Serializable;
 *                       Marker interface계열(기능 부여)
 */
import java.io.*;

class Person implements Serializable {
	String name;
	transient int age;
	transient String address;
}

public class ObjectTest { // 객체직렬화가 되는 기능부여

	public static void main(String[] args) throws Exception{
		
		Person p = new Person();
		
		p.name = "홍길동";
		p.age = 30;
		p.address = "경기도 성남시";
		
		// 1. 파일로 저장
		FileOutputStream fos = new FileOutputStream("c:\\webtest\\readme7.txt");
		
		// 2. 객체로 저장
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		
		// 3. 저장시키는 형식 -> writeObject(저장할 객체명) = 직렬화
		//                    <->(원래 저장된 형)readObject(); = 역직렬화
		oos.writeObject(p);
		oos.close();
		fos.close();
		
		// 4. 역직렬화 : 만들어진 파일의 내용을 다시 메모리상으로 로딩
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:\\webtest\\readme7.txt"));
		
		// Object(객체형변환) -> readObject -> Person으로 형변환 시켜야됨
		Person p2 = (Person)ois.readObject(); // 저장된건 Object 이기 때문에 Person형으로 형변환 시켜야됨
		System.out.println("p2 : " + p2);
		System.out.println("p1 : " + p);
		
		// 파일로 저장 -> 다시 불러오기 -> 주소가 다를수 밖에 없다.
		System.out.println("p2 == p1 ? : " + (p2 == p));
		System.out.println("p2 이름 : " + p2.name);
		System.out.println("p2 나이 : " + p2.age);
		System.out.println("p2 주소 : " + p2.address);
		
		System.out.println("========================");
		System.out.println("p1 이름 : " + p.name);
		System.out.println("p1 나이 : " + p.age);
		System.out.println("p1 주소 : " + p.address);
	}
}

 

# 예외처리

import java.io.*; // 1. 입출력에 대한 클래스 불러오기
				  // 2. 반드시 예외처리를 필수
				  // 3. flush() 호출 -> 버퍼에 저장된 내용이 바로 출력O

// 입출력의 개념파악
public class WriteHello {

	public static void main(String[] args) {
		
		byte hello[] = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 10}; // 아스키코드값
		byte a = 72; // byte는 입출력할 때 데이터를 전송할 때 필요로 하는 자료형
					 // char (나) -> byte -> char (상대방)
		
		try {
			System.out.println(a); // = System.out.printla((char)a); = write(a);
			System.out.println("hello : " + hello);
			System.out.write(a); // 'H'
			System.out.flush(); // 버퍼에 저장된 데이터를 바로바로 전송함
			System.out.write(hello); // 많은 데이터를 전송할땐 반드시 예외처리를 해야됨
			
		} catch (IOException e) {
			System.out.println(e); // e.toString()
			System.out.println("출력시 에러 유발됨");
		}
		
	}

}

'국비학원 > 공부' 카테고리의 다른 글

24일차 java(12)  (0) 2023.07.03
23일차 java(11)  (0) 2023.07.03
21일차 java(9)  (0) 2023.07.03
20일차 java(8)  (0) 2023.07.02
19일차 java(7)  (0) 2023.07.02