◎ JAVA

◆ 싱글 바이트 입/출력

  • 목표 : 싱글 바이트 단위 데이터 입력(열기)

  • 준비물 : 파일 객체(없으면 에러), 스트림 객체(입력용)

  • try{} catch(){} 를 사용하기 싫으면 if 조건문을 입력해서 예외를 스킵해준다.

  • 에러나는곳에 add throws를 클릭하면 예외처리가 자동 생성되어 에러가 사라진다.

  • 파일의 크기는 long으로 설정한다.

  • 입력 순서 : [프로그램] <- stream <- target <- [single.txt]

  • 버퍼(buffer)을 사용한 대량 데이터를 복사할 수 있다.

    	public class Test02 {
    		public static void main(String[] args) throws IOException {
    
    			File target = new File("temp", "single.txt");
    			if(!target.isFile()) {
    			System.err.println("존재하지 않는 파일입니다");
    			System.exit(-1);
    			}
    	
    			FileInputStream stream = new FileInputStream(target);
    
    			//[1] for를 이용하여 파일 크기만큼 반복
    			//- 사용하지 않음(나중에는 여러 글자를 불러오므로 횟수 계산이 어려움)
    			//for(int i=0; i < target.length(); i++) {
    			int n = stream.read();
    			System.out.println("n = " + n);
    			//}
    	
    			[2] while을 이용하여 반복하여 읽기
    			//- EOF(End of File) 값인 -1이 나올 때까지 입력
    			while(true) {
    				int n = stream.read();
    				if(n == -1) break;
    				System.out.println("n = " + n);
    			}
    			//사용 완료한 통로는 정리한다.
    			stream.close();
    		}
    	}

◆ 멀티 바이트 입/출력

  • 준비물 : 파일 객체(없을 경우 파일이 자동 생성), 출력 스트림, +버퍼 스트림

  • 출력 순서 : [프로그램] -> 분해(mixer) -> 임시보관(buffer) -> 통로(stream) -> 파일(target) -> [multi.txt]

  • 입력 순서 : [프로그램] <- combine <- buffer <- stream <- target <- [multi.kh]

  • 아래와 같은 코드는 데이터의 순서와 형태를 알지 못하면 읽어오지 못한다.

  • buffer : 한 개씩 들어오는 데이터를 의미 있는 데이터가 될 때까지 모았다가 보내주는 것이다.

  • 변수.flush(); : 강제 전송 명령. 계속 사용할 경우.
    (ex 통신, 메세지를 보내고서 카톡방에 있을 경우)

  • 변수.close(); : flush 수행 후 종료.
    더 이상 사용을 하지 않고 종료할 경우.
    (ex 메세지를 보내고서 카톡방에 나갈 경우)

    public class Test01 {
    	public static void main(String[] args) throws IOException {
    
    		File target = new File("temp", "multi.txt");
    		FileOutputStream stream = new FileOutputStream(target);
    		BufferedOutputStream buffer = new BufferedOutputStream(stream, 20); //buffer 크기 지정
    		DataOutputStream mixer = new DataOutputStream(buffer);	
    	
    		//출력 순서 : [프로그램] → mixer → buffer → stream → target → [multi.txt]
    		mixer.writeBoolean(false); //boolean 형식으로 분해해서 출력
    		mixer.writeByte(100); //byte 형식으로 분해해서 출력
    		mixer.writeInt(100); //int 형식으로 분해해서 출력
    		mixer.writeChar(100); //char 형식으로 분해해서 출력
    		mixer.writeLong(100L); //long 형식으로 분해해서 출력
    		mixer.writeFloat(100f); //float 형식으로 분해해서 출력
    		mixer.writeDouble(100d); //double 형식으로 분해해서 출력
    	
    		//총 합계 28byte, 버퍼 크기는 기본 8192byte
    		//버퍼는 가득 차야 데이터가 전송이 된다.
    		//만약 프로그램 종료 등 여러 이유로 버퍼가 가득차지 않아도 전송하려면 
    		//강제 전송 명령을 사용해야 한다.
    		//mixer.flush(); //강제 전송 명령. 계속 사용할 경우.(ex 통신) (ex 메세지를 보내고서 카톡방에 있을 경우)
    		mixer.close(); //flush 수행 후 종료. 더 이상 사용을 하지 않고 종료할 경우. (ex 메세지를 보내고서 카톡방에 나갈 경우)
    	}
    }

◆ Object 입/출력

  • 입출력의 가능성이 있다면 자격을 부여(마킹)해야 한다
  • java.io.Serializable 인터페이스를 상속
  • 상속 받으면 경고가 나온다.
  • 클래스의 버전을 관리할 것을 요구(serialVersionUID를 생성하여 숫자로 관리)
  • 안만들면 클래스의 내용이 바뀔 때마다 무조건 serialVersionUID가 바뀜(통제안됨)
  • 입출력에서 제외하고 싶은 필드가 있다면 transient 키워드를 붙이면 된다.

객체 출력

  • 자바에서 가장 복잡하며 형태를 예측하기 어려운 데이터 유형이다.
  • 멀티바이트처럼 크기가 정해져 있지도 않다.
  • 분해가 가능하도록 펼치는 작업이 추가로 필요(직렬화)하다.
  • (직렬화 → 분해) → 임시저장 → 전송
  • ((ObjectOutputStream)직렬화 -> 분해) -> 분해(DataOutputStream) -> 임시저장(BufferOutputStream) -> 전송(FileOutputStream)
  • 주의! : Generic Type은 다운캐스팅에서 고려 대상이 아니다.
  • Generic Type은 에러가 완전히 사라지는 것이 아니다.

◆ String 입/출력

인코딩

  • .getBytes()로 문자열을 byte 배열로 변환이 가능하다.
  • UTF-8 : 3byte가 모여서 한 글자로 표현 된다.
  • MS949 : 2byte가 모여서 한 글자로 표현 된다.
  • byte 배열을 문자열로 만들려면 String 클래스의 생성자를 사용한다.
  • String을 편법으로 byte로 변환 후 출력할 수 있지만 거의 사용하지 않는다.
  • 문자열은 출력 스트림을 따로 쓴다.
  • Writer와 Reader를 상속 받은 클래스들을 조합하여 사용할 수 있다.
  • FileWriter : 문자열을 byte 타입으로 자동 변환 역할을 한다.
  • BufferedWriter : 버퍼 성능 조절 역할을 한다.
  • PrintWriter : 다양한(타입) 형태로 출력하는 역할을 한다.(단, 입력은 불가능)

문자열 입력

  • FileReader는 정해진 크기의 char만 읽을 수 있다.
  • Buffer에는 줄단위 입력 기능이 있어서 BufferedReader를 추가하여 줄단위 입력이 가능하게 한다.
  • null(객체가 없으므로, 원시형 값과 동급)은 .equals를 사용 불가하다.
  • null은 비교 연산(==)으로 비교 가능하다.
  • StringBuffer의 장점 : 입력 받은 데이터를 한 꺼번에 출력 가능하다.
  • StringBuffer의 단점 : 종료 전까지 파일이 생성되지 않음. 중도에 데이터가 날아갈 수 있다.
profile
Backend Developer

0개의 댓글