[24.07.08] JAVA_데이터 입출력

ANGELA·2025년 1월 8일

[KB]학습내용정리

목록 보기
13/57

01. 복습

자바 : 생성자호출에 성공하면 열기 한다.

close() 안해도 어플이 자동으로 해준다.

write() 후에 flush() 필수

  • close() 전에 flush
  • 특히 네트워크통신때 안하면 통신 안된다.

02. 오후수업

  • 이론정리
## IO Stream

데이터를 목적지로 입출력하기 위한 방법이다.
java.io 패키지에는 여러 가지 종류의 스트림 클래스를 제공하고 있습니다.
스트림은 단방향이다.
스트림은 FIFO 구조이다.
– FIFO구조란 먼저 들어간 것이 먼저 나오는 형태로서 데이터의 순서가 바뀌지 않는다는 특징이 있다.
Java Streams는 두 개의 기본 스트림을 사용하여 데이터를 읽고 씀
자바에서 스트림은 읽기, 쓰기가 동시에 되지 않는다. 
따라서 읽기, 쓰기가 필요하다면 읽는 스트림과 쓰는 스트림을 하나씩 열어 사용해야 한다.

바이트 스트림 - Java 바이트 스트림은 8비트 바이트의 입력 및 출력을 구현하는 데 사용
가장 일반적으로 실행되는 클래스는 FileInputStreamFileOutputStream 

문자 스트림 - Java 문자 스트림은 16비트 유니코드의 입력 및 출력을 구현하는 데 사용
가장 일반적으로 사용되는 클래스는 FileReaderFileWriter

바이트 기반인지 문자 기반인지 확인하는 법은 최상위 클래스를 보면 됩니다.
 
바이트 기반 스트림 최상위 클래스는 InputStream (입력 스트림), OutputStream (출력 스트림) 입니다.
하위 클래스로는 XXXInputStream (입력 스트림), XXXOutputStream (출력 스트림) 이름이 보편적입니다.
문자 기반 스트림 최상위 클래스는 Reader (입력 스트림), Writer (출력 스트림) 입니다.
하위 클래스로는 XXXReader (입력 스트림), XXXWriter (출력 스트림) 이름이 보편적입니다.

보조 스트림
보조 스트림은 다른 스트림과 연결이 되어 여러 가지 편리한 기능을 제공해주는 스트림을 말합니다.
자체적으로 입출력을 수행할 수 없기에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Reader, Writer 등에 연결해서 입출력을 수행합니다.
보조 스트림은 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등의 기능을 제공합니다.

####  InputStream
write(int b) 메소드
매개 변수로 주어지는 int(4byte) 에서 끝 1 byte 만 출력 스트림으로 보냅니다.
매개 변수가 int 타입이지만 4byte 모두를 보내지 않습니다.

read(byte[] b) 메소드
read(byte[] b) 메소드는 입력 스트림으로부터 매개값으로 주어진 배열의 길이만큼 바이트를 읽고 해당 배열에 저장합니다.
그리고 읽은 바이트 수를 리턴합니다.
 
실제 읽은 바이트 수가 배열의 길이보다 적을 경우, 읽은 수 만큼만 리턴합니다.
길이가 3인 배열로, 5 바이트를 두 번 읽을 수 있습니다.
 
입력 스트림에서 바이트를 더 읽을 수 없다면 마찬가지로 -1 을 리턴합니다.

1) InputStream : 바이트 단위로 문자를 읽어 들인다.
클래스를 이용해 문자나 숫자를 입력받으면, 아스키코드 값이 출력
2) InputStreamReader : 문자 단위로 읽어 들인다.
고정된 길이로만 읽어야 한다는 불편한 점
3) BufferedReader : 문자열을 읽어 들인다.
BufferedReader는 사용자가 엔터키를 입력할 때까지 사용자의 입력을 전부 받아들일 수 있게 하는 클래스로,InputStreamReader의 단점을 보완해준다.
InputStream과 달리 InputStreamReader2byte를 처리할 수 있기 때문에 한글도 처리가능
4) Scanner
Scanner는 java.util 패키지에 속해 있는 자바의 내장 클래스로,
콘솔입력을 앞 방법들보다 쉽게 처리할 수 있게 해준다

#### OutputStream
출력 스트림은 데이터(파일, 배열, 주변 장치 또는 소켓)를 대상에 쓰는 데 사용

BufferedWriter은 개행기호를 처리해줍니다.
bw.write("하나\n") 이렇게 직접 개행기호를 삽입해도되고 bw.newLine()을 사용하여도됩니다.
bw.flush()는 버퍼에 잔류하는 모든 바이트를 출력하는 메소드입니다.
bw.close()는 사용한 시스템 자원을 반납하고 출력 스트림을 닫는 메소드입니다.

Serializable
클래스의 직렬화는 java.io.Serializable 인터페이스를 구현하는 클래스에 의해 활성화됩니다.
이 인터페이스를 구현하지 않는 클래스는 어떤 상태도 직렬화되거나 역직렬화되지 않습니다.
직렬화 가능한 클래스의 모든 하위 유형은 그 자체로 직렬화 가능합니다.
직렬화 인터페이스에는 메서드나 필드가 없으며 직렬화 가능한 의미를 식별하는 데만 사용
자바의 직렬화, 역직렬화는 목적지도 자바객체로 수신가능한 곳이어야함
역직렬화 시 생성자를 사용하지 않는 특성이 있음
기본적으로 static, transient 키워드가 붙어있지 않은 필드만 직렬화,역직렬화 가능합니다

File 클래스
Java 파일 클래스에는 경로 이름 작업, 파일 삭제 및 이름 저장, 새 파일 생성, 내용 나열, 파일 및 해당 파일의 여러 가지 속성에 대한 여러 메타데이터가 포함
파일이나 폴더를 만들 수 있다

File.mkdir()
만들고자 하는 디렉토리의 상위 디렉토리가 존재하지 않을 경우, 생성 불가
a >> b x >> c

File.mkdirs()
만들고자 하는 디렉토리의 상위 디렉토리가 존재하지 않을 경우, 생성
a >> b >> c
  • 질문게시판
- **클래스**: 객체를 만드는 틀
- **인스턴스**: 클래스로 만들어진 실체화된 객체
- **객체**: 일반적으로 인스턴스를 가리킴
- **Objects 클래스**: 자바 유틸에 있는 유틸리티 함수들의 모음
- **Array**: 고정된 크기의 동일한 타입의 요소들을 저장하는 자료 구조
- **Arrays 클래스**: 배열을 조작하기 위한 유틸리티 클래스
- **파라미터 (Parameter)**: 메소드 정의 시 선언되는 변수
- **아규먼트 (Argument)**: 메소드 호출 시 전달되는 실제 값
---------------
List: 인터페이스로, 순서가 있는 컬렉션을 정의.
ArrayList: List 인터페이스를 구현한 클래스, 동적 배열을 사용.
Arrays: 배열 조작을 위한 유틸리티 클래스.
Array: 고정 크기의 기본 배열 구조.
---------------
# 객체 vs 클래스 vs 인스턴스
객체     :  데이터와 메서드(함수)를 갖는 독립적인 단위 ( 객체는 일반적으로 인스턴스를 지칭.)
클래스   : 객체를 생성하기 위한 설계도 (객체의 상태(속성)와 행동(메서드)을 정의)
인스턴스 :  클래스로 만든 객체.클래스의 구체적인 예시

+) [ 자바 명명 관례 -> s가 붙으면 유틸리티 클래스 (ex_ Array vs Arrays) 

# - ArrayList 리스트 경우
   
- 리스트 자체를 직렬화 하면 된다
- <T>가 직렬화 구현되어 있으면 성공, 안 되어 있으면 실패

# 직렬화 vs 역직렬화
직렬화: 객체의 상태를 바이트 스트림으로 변환하는 과정
역직렬화: 바이트 스트림을 객체로 변환하는 과정

  
buffer : 임시 저장소
	ㄴ 버퍼의 크기는 사용자 정의 가능. 최소 단위는 1byte
	ㄴ I/O 를 바로 사용하는 것 보다(EX)system.out.print() ), 버퍼에 모았다가 I/O로 보내는 것이 시간 소요가 적음..fulsh() : 버퍼의 내용을 출력하고, 비움.
profile
혼자 보려고 만든 기록장 | 또또는 귀여워 🐈‍⬛

0개의 댓글