java 기초 공부 내용 정리(입출력/자바의 IO패키지-바이트기반스트림, 문자기반스트림)

홍준성·2022년 6월 4일
0

java 기초 공부

목록 보기
37/39

입출력, 자바의 IO패키지

IO

Input(입력), Output(출력)

  • 입력: 프로그램에 데이터가 들어오는 것
  • 출력: 프로그램의 데이터가 나가는 것

스트림

데이터의 흐름(키보드 or 파일 → 프로그램 → 모니터 or 파일)

스트림의 특징

  1. 단방향이다.
  2. FIFO 구조를 갖고 있다.
  3. 출력 단위에 따라 바이트 기반과 문자 단위로 분류된다.

바이트 기반 스트림

바이트 단위로 데이터를 입출력하는 스트림

바이트 기반 스트림의 활용

  • 입력과 출력에 따라 read()와 write()를 구현하여 사용한다.
  • 스트림을 사용할 때는 인스턴스 생성 시 적절한 값을 전달한다.
InputStreamOutputStream
abstract int read()abstract void write(int b)
int read(byte[]b)void write(byte []b)
int read(byte []b, int off, int len)void write(byte []b, int off, int len

입력스트림출력스트림대상
FileInputStreamFileOutputStream파일
PipedInputStreamPipedOutputStream메모리
AudioInputStreamAudioOutputStream오디오
ByteArrayInputStreamByteArrayOutputStream프로세스

* 데이터를 읽거나 쓰는 대상에 따라서 적절한 스트림을 사용한다.

바이트 기반 보조 스트림의 활용

실제 바이트 기반 스트림의 성능을 향상시키는 역할

입력보조스트림출력보조스트림사용
FilterInputStreamFilterOutputStream필터를 이용한 입출력
BufferedInputStreamBufferedOutputStream버퍼를 통한 입출력
DataInputStreamDataOutputStream기본 단위로 데이터 처리
XPrintStreamprint,printf,println 사용

문자 기반 스트림

16bit의 문자나 문자열을 읽고 쓰는 스트림

문자 기반 스트림의 활용

자바에서 사용하는 char 형 변수는 2byte이므로 바이트 기반 스트림은 불편하므로 문자 단위로 입출력을 다루는 문자 기반 스트림을 제공

ReaderWriter
int read()void write(inc c)
int read(char[] cbuf)void write(char []cbuf)
abstrct int read(char [] cbuf, int off, int len)abstract void write(char [] cbuf, int off, int len)
abstrct int read(char [] cbuf, int off, int len)void write(String str)
abstrct int read(char [] cbuf, int off, int len)void write(String str, int off, int len)

대상에 따른 스트림 종류

입력 스트림출력 스트림대상
FileReaderFileWriter파일
PipedReaderPipedWriter메모리
CharArrayReaderCharArrayWriter프로세스

문자 기반 보조 스트림

문자 기반 스트림의 성능을 향상시키는 역할

문자 기반 보조 스트림의 활용

입력 보조 스트림출력 보조 스트림대상
FilterReaderFilterWriter필터를 이용한 문자 입출력
BufferedReaderBufferedWriter버퍼를 이용한 문자 입출력

스트림의 예외처리

입출력의 모든 메서드는 IOException이 발생할 가능성이 높으므로 예외 처리가 필요하다.

//패키지 내에 prac.txt 파일 미리 저장

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class Day02Ex {
	public static void main(String[] args) {
		//파일복사 프로그램
		FileReader fr;
		FileWriter fw;
		BufferedReader br;
		BufferedWriter bw;
		
		try{
			fr = new FileReader("prac.txt");
			fw=new FileWriter("result.txt");
			
			br=new BufferedReader(fr);
			bw=new BufferedWriter(fw);
			String line;
			while((line = br.readLine()) != null){
				bw.write(line);
			}
			bw.close();
			br.close();
		}
		catch(Exception e) {
			e.printStackTrace();
			
		}
	}
}

객체 직렬화

자바 시스템 내부에서 사용하는 개체나 데이터를 외부의 시스템에서 사용할 수 있도록 byte 단위의 데이터로 변환시키는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술

객체 전송의 단계

1) 직렬화된 객체를 바이트 단위로 분해한다(marshalling)
2) 직렬화 되어 분해된 데이터를 순서에 따라 전송
3) 전송받은 데이터를 복구(unmarshalling)

  • 객체 → 마샬링(바이트로 변환) → 외부시스템
  • 외부시스템 → 언마샬링(객체로 변환) → 객체

마샬링(marshalling)

데이터를 바이트 단위의 데이터로 변환시키는 작업

마샬링을 적용할 수 있는 데이터

  • 기본 자료형: boolean, char, byte, short, int, long...
  • Serializable 인터페이스를 구현한 클래스로 만들어진 객체

직렬화(Serializable)

Serializable 인터페이스는 메서드없이 JVM에게 정보 전달 기능만 존재

언마샬링(unmarshalling)

객체 스트림을 통해 전달된 바이트 단위의 데이터를 원래의 객체로 복구하는 작업

주의할 점
어떤 객체 형태로 복구할 지 형 변환을 정확하게 명시

마샬링/언마샬링 예시

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Day02Ex {
	public static void main(String[] args) {
		marshalling();
		unmarshalling();
	}
	
	public static void marshalling() {
		try {
			FileOutputStream fos = new FileOutputStream("user.ser");
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			ObjectOutputStream out = new ObjectOutputStream(bos);
			
			User user1 = new User("test","1234","가길동");
			out.writeObject(user1);
			out.close(); 
			System.out.println("객체 직렬화 완료!");
		} 
		catch(IOException e) {e.printStackTrace();
		
		}
	}
	
	public static void unmarshalling() {
		try {
		FileInputStream fis = new FileInputStream("user.ser");
		BufferedInputStream bis = new BufferedInputStream(fis);
		ObjectInputStream in = new ObjectInputStream(bis);
		
		User user2=(User)in.readObject();
		System.out.println(user2.toString());
		user2.toString();
		in.close();
		System.out.println("객체 복원 완료!");
		}
		catch(Exception e) {}
	}
}

class User implements Serializable{
	private String id;
	private String pw;
	private String name;
	
	public User(String id, String pw, String name) {
		this.id = id;
		this.pw = pw;
		this.name = name;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", pw=" + pw + ", name=" + name + "]";
	}
	
}
profile
준성이의 개발자 공부 velog

0개의 댓글