자바프로그래밍 보조스트림

최주영·2023년 3월 27일
0

자바

목록 보기
17/30

보조스트림

  • 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용
  • 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림을 생성
  • 보조스트림 함수 안에 주스트림 객체를 넣어야함!

✅ 종류

  • InputStreamReader / OutputStreamWriter
	public void changeStream() {
		// 1. InputStreamReader / OutputStreamWriter
		
		//: byte 기반 스트림을 문자기반 스크림으로 변경
		//FileInputStream fis = null; 
		//InputStreamReader isr = null;
		// try width resource 구문
		try(FileInputStream fis = new FileInputStream("test");
				InputStreamReader isr = new InputStreamReader(fis);) {
               // FileInputStream -> 주 스트림
               // InputStreamReader -> 보조 스트림
               // 보조스트림 함수 안에 주스트림 객체를 넣어야함!
			//fis = new FileInputStream("end");
			//isr = new InputStreamReader(fis);
			
			int data = 0;
			while((data = fis.read())!=-1) {  
				System.out.println((char)data);
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

  • BufferedInputStream / BufferedOutputStream
  • 입출력 속도를 향상 시켜주는 클래스
public void bufferedSave() {   
		// 주스트림 fos를 부스트림 bos 안에다 넣음
		try (FileOutputStream fos = new FileOutputStream("myfile");
				BufferedOutputStream bos = new BufferedOutputStream(fos);) {
			String data = "오늘 너무너무 고마워요 눈ㅁ눌이 날뻔했어요";
			bos.write(data.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


public void bufferedLoad() {
		try (FileInputStream fis = new FileInputStream("myfile");
				BufferedInputStream bis = new BufferedInputStream(fis);
				InputStreamReader reader = new InputStreamReader(bis);) {
                // InputStreamReader : 문자변환 보조 스트림
			int data = 0;
			while ((data = bis.read()) != -1) {
				System.out.println((char) data);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

  • DataInputStream / DataOutpuStream
  • 자료형 기반으로 데이터를 저장하고 불러오기

// 메인문
		Person[] persons = new Person[10];
		persons[0] = new Person("유병승",19,'남',180.5,"경기도 시흥시");
		persons[1] = new Person("강민기",32,'남',180.5,"경기도 안산시");
		persons[2] = new Person("최솔",29,'여',164.3,"경기도 안양시");
		persons[3] = new Person("윤지환",25,'남',180.1,"경기도 시흥시");
		
        new SubStreamController().savePersons(persons);
		Person[] result = new SubStreamController().loadPerson();
		
		for(Person p : result) {
			System.out.println(p);
		}


// savePersons 클래스
	public void savePersons(Person[] persons) {
		// FileOutputStream 주 스트림
		// DataOutputStream 보조 스트림
		try(DataOutputStream dos = 
				new DataOutputStream(new FileOutputStream("persons"))){
			for(Person p : persons) { // 객체안의 모든 값들을 파일로 적어줌
				if(p!=null) {  // 객체배열은 10칸인데 선언은 3명만해놓아서 널포인터 오류 예외처리
					dos.writeUTF(p.getName()); //  UTF -> String
					dos.writeInt(p.getAge());
					dos.writeChar(p.getGender());
					dos.writeDouble(p.getHeight());
					dos.writeUTF(p.getAddress());
				}

			}
			
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
    
    
    
    
    public Person[] loadPerson() {
		Person[] result = new Person[10];
   		try(DataInputStream dis =
				new DataInputStream(new FileInputStream("persons"))){
   			
   			for(int i=0; i<result.length; i++) {
   				String name = dis.readUTF();
   				int age = dis.readInt();
   				char gender = dis.readChar();
   				double height = dis.readDouble();
   				String address = dis.readUTF();
   				
   				Person p = new Person(name,age,gender,height,address);
   				result[i] = p;
   			}
   			
		}catch(EOFException e) {
			System.out.println("저장된 데이터를 모두 불러왔습니다.");
		}
   		catch(IOException e) {
			e.printStackTrace();
		}
   		return result;
	}
    

  • ObjectInputStream / ObjectOutputStream
  • 파일에 객체형식으로 저장하고 가져오는 방법
  • 객체기반으로 파일에 저장할 때 직렬화, 역직렬화를 해야한다.
  • 직렬화, 역직렬화는 jvm이 알아서 처리 -> Serializerable인 인터페이스를 구현
	public void objcetSave() {
		try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("objfile"))){
			oos.writeObject(new Person("유병승",19,'남',180.5,"경기도 시흥시"));
			
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
    
    
    	public Person objectLoad() {
		Person p = null;
		try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("objfile"))){
			
			p = (Person)ois.readObject();  // 객체 타입으로 형변환 해줘야함
		}catch(ClassNotFoundException | IOException e) {
			e.printStackTrace();
		}
		return p;
	}


//메인문
		new SubStreamController().objcetSave(); // 값적고
		Person p = new SubStreamController().objectLoad(); // 값 읽어서 반환
		System.out.println(p);
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글