데이터입출력
자바에서 입출력을 수행하려면,
즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면,
두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데
이것을 스트림 (stream) 이라고 정의했다.
스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로
입력과 출력을 동시에 처리할 수 없다. 그래서 입력과 출력을
동시에 수행하려면 입력을 위한 입력스트림 (input stream) 과 출력을 위한
출력스트림 (output stream) 2개 스트림이 필요하다.
스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며
중간에 건너뜀 없이 연속적으로 데이터를 주고받는다.
io관련 라이브러리 -> 반드시 checked exection 처리. 예외 처리.
io : 프로그램에서 외부와 통신하는 라이브러리
FileInputStream에서...
// 반복문을 사용해서 전체 text file을 출력.
(but 영어를 제외한 다른 언어들은 1byte로
처리가 안되기 때문에 출력에 오류가 남. )
source file 에서 teb은 4space 설정이 기본.
editer setting checked.
window-preferences-general-editor-text editors ~
예외처리에서도 중복이 발생하기 때문에
하위에서는 상위 단으로 예외처리를 던짐. throws ~
문자 스트림 - 인코딩/ 디코딩
파일 복사만을 할 때 - 바이트 스트림 파일만을 사용.
utf-8 파일을 복사 인코딩해서 euc-kr로 변경할때 - 문자 스트림을 사용.
Stream : byte stream - InputStream, OutputStream
Character stream - Reader, Writer
img file download
인터넷에서의 이미지 다운로드
url connection 사용.
text file download
buffer
보조스트림 = 편리한 기능 제공.
bufferedReader는 라인단위로 읽을 수 있다.
Input/ Outpur / read / write 차이를 확실히 알 것.
OutputStream / reader - char type 문자 타입/// byte 변환 - reader , writer
Socket - 접속.
Input/ Output Stream - 기본 : 바이트 단위로 스트림 처리..
reader/ writer - 글자 encoding에 따라 단위를 다르게 읽어서 처리를 한다.
Reader/Writer -> char
byte 데이터를 data output Stream/ input Stream 에서
int/ long / float / double 리턴가능.
보조스트림... buffer로 동작 처리 함으로서 속도를 상승
Serialize 직렬 역직렬화에서
transient 키워드를 사용하면 직렬화에서 제외 됨. ( default value : null )
데이터 입출력
입출력 스트림
입력 스트림과 출력 스트림
- 프로그램을 기준으로 데이터가 들어오면 입력 스트림, 데이터가 나가면 출력 스트림
- 프로그램이 다른 프로그램과 데이터를 교환하려면 양쪽 모두 입력 스트림과 출력 스트림이 필요
- 바이트 스트림: 그림, 멀티미디어, 문자 등 모든 조유르이 데이터를 입출력할 때 사용
- 문자 스트림: 문자만 입출력할 때 사용.
- 자바는 데이터 입출려과 관련된 라이브러리를 java.io 패키지에서 제공
- 바이트 입출력 스트림의 최상위 클래스는 InputStream과 OutputStream
- 문자 입출력 스트림의 최상휘 클래스는 Reader와 Writer
OutputStream
- OutputStream은 바이트 출력 스트림의 최상위 클래스로 추상 클래스
- 모든 바이트 출력 스트림 클래스는 이 OutputStream 클래스를 상속받아서 만들어짐
- OutputStream 클래스에는 모든 바이트 출력 스트림이 기본적으로 가져야 할 메소드가 정의됨
리턴 타입 메소드 설명
void write(int b) 1byte를 출력
void write(byte[] b) 매개값으로 주어진 배열b의 모든 바이트를 출력
void write(byte[] b, int off, int len) 매개값으로 주어진 배열 b[off]부터 len개의 바이트를 출력
void flush() 출력 버퍼에 잔류하는 모든 바이트를 출력
void close() 출력 스트림을 닫고 사용 메모리 해제
1 바이트 출력
- write(int b) 메소드: 매개값 int(4byte)에서 끝 1byte만 출력. 매개변수는 int타입.
바이트 배열 출력
- write(byte[]b) 메소드 : 매개값으로 주어진 배열의 모든 바이트를 출력
- 배열의 일부분을 출력하려면 write(byte[] b, int off, int len) 메소드를 사용
InputStream
- InputStream은 바이트 입력 스트림의 최상위 클래스로, 추상 클래스
- 모든 바이트 입력 스트림은 InputStream 클래스를 상송받아 만들어짐
InputStream - FileInputStream/ BufferedInputStream/ DataInputStream
- InputStream 클래스에는 바이트 입력 스트림이 기본적으로가져야 할 메소드가정의됨
InputStream
리턴타입 메소드 설명
int read() 1byte를 읽은 후 읽은 바이트를 리턴
int read(byte[] b) 읽은 바이트를 매개값으로 주어진 배열에 저장 후 읽은 바이트 수를 리턴
void close() 입력 스트림을 닫고 사용 메모리 해제
package com.example;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataStreamExample {
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("xxx.bin");
DataOutputStream dout = new DataOutputStream(out);
dout.writeDouble(10.5);
// double = 8byte
dout.writeInt(100000);
// integer 4 byte * 8byte = 12byte
dout.close();
FileInputStream in = new FileInputStream("xxx.bin");
DataInputStream din = new DataInputStream(in);
System.out.println(din.readDouble());
System.out.println(din.readInt());
din.close();
System.out.println("End.. ");
}
}
바이트 입력 스트림
1 바이트 입력
- read() 메소드: 입력 스트림으로부터1byte를 읽고 int(4byte) 타입으로 리턴. 리턴된 4byte 중 끝
1byte에만 데이터가 들어 있음
- 더 이상 입력 스트림으로부터바이트를 읽을 수 없다면 read() 메소드는 -1을 리턴. 읽을 수 있는
마지막 바이트까지반복해서 한 바이트씩읽을 수 있음
바이트 배열로 읽기
- read(byte[ ] b) 메소드: 입력 스트림으로부터
주어진 배열의 길이만큼 바이트를읽고
배열에 저장한 다음 읽은 바이트 수를 리턴
- read(byte[ ] b)도 입력 스트림으로부터
바이트를 더 이상 읽을 수 없다면 -1을 리턴.
읽을 수 있는 마지막 바이트까지 반복해서
읽을 수 있음
문자 출력
- Writer는 문자 출력 스트림의 최상위 클래스로, 추상 클래스. 모든 문자 출력 스트림 클래스는
Writer 클래스를상속받아서 만들어짐
- Writer 클래스에는모든 문자 출력 스트림이
기본적으로가져야 할 메소드가 정의됨
리턴 타입 메소드 설명
void write(int c) 매개값으로 주어진 한 문자를 출력
void write(char[ ] cbut) 매개값으로 주어진 배열의 모든 문자를 출력
void write(char[ ] cbut, int off, int len) 매개값으로 주어진 배열에서 cdbf[off]부터 len개 까지의 문자를 출력
void write(String str) 매개값으로 주어진 문자열을 출력
void write(String str, int off, int len) 매개값으로 주어진 문자열에서 off 순번부터 len개까지의 문자를 출력
void flush() 버퍼에 잔류하는 모든 문자를 출력
void close() 출력 스트림을 닫고 사용 메모리를 해제
Reader
- Reader는 문자 입력 스트림의 최상위 클래스로, 추상 클래스
- 모든 문자 입력 스트림 클래스는 Reader 클래스를상속받아서 만들어짐
- Reader 클래스에는문자 입력 스트림이 기본적으로가져야 할 메소드가정의됨
메소드 설명
int read() 1개의 문자를 읽고 리턴
int read(char[] cbut) 읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자수를 리턴
void close() 입력 스트림을 닫고, 사용 메모리 해제
보조 스트림
- 다른 스트림과 연결되어 여러 편리한 기능을 제공해주는스트림. 자체적으로입출력을 수행할 수
없기 때문에 입출력 소스로부터 직접 생성된 입출력 스트림에 연결해서사용
- 입출력 스트림에 보조 스트림을 연결하려면보조 스트림을 생성할 때 생성자 매개값으로입출력
스트림을 제공
- 보조스트림변수 = new 보조스트림(입출력스트림);
- 보조 스트림은 또 다른 보조 스트림과 연결되어 스트림 체인으로구성할 수 있음
- 보조스트림2 변수 = new 보조스트림2(보조스트림1);
보조 스트림 기능
InoutStreamReader 바이트 스트림을 문자 스트림으로 변환
BufferedInputStream,
BufferedOutputStream, 입출력 성능 향상
BufferedReader, BufferedWriter
DataInputStream, DataOutputStream 기본 타입 데이터 입출력
PrintStream, PrintWriter 줄바꿈 처리 및 형식화된 문자열 출력
ObjectInputStream, ObjectOutputStream 객체 입출력
package com.example;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
public class BufferedOutExample {
// buffered 기능을 사용. : 보조 스트림 사용
public static void main(String[] args) throws IOException {
FileOutputStream o = new FileOutputStream("xxx.bin");
BufferedOutputStream out = new BufferedOutputStream(o);
var start = LocalTime.now();
for (int i=0; i<1024*1024*100; i++) {
// o.write('A');
out.write('A');
// System.out.println(".");
}
var end = LocalTime.now();
System.out.println(start.until(end, ChronoUnit.MILLIS));
out.close();
// o.close();
System.out.println("End..");
}
}
InputStream을 Reader로 변환
- InputStream을 Reader로 변환하려면InputStreamReader 보조 스트림을연결
OutputStream을 Writer로 변환
- OutputStream을 Writer로 변환하려면OutputStreamWriter 보조 스트림을 연결
메모리 버퍼로 실행 성능을 높이는 보조 스트림
- 프로그램이중간에 메모리 버퍼buffer와 작업해서 실행 성능 향상 가능
- 출력 스트림의 경우 직접 하드 디스크에 데이터를보내지 않고 메모리 버퍼에 데이터를
보냄으로써출력 속도를 향상. 입력 스트림에서도버퍼를 사용하면 읽기 성능 향상
- 바이트 스트림에는BufferedInputStream, BufferedOutputStream이 있고 문자 스트림에는
BufferedReader, BufferedWriter가 있음
기본 타입 스트림
- 바이트 스트림에 DataInputStream과 DataOutputStream 보조 스트림을 연결하면 기본 타입(boolean,
char, short, int, long, float, double) 값을 입출력할 수 있음
바이트-> InputStream - DataInputStream -> 프로그램 : 기본 데이터 타입 (int, double)
-> DataOutputStream - OutputStream - 바이트
PrintStream과 PrintWriter
- 프린터와 유사하게출력하는 print(), println(), printf() 메소드를 가진 보조 스트림
프로그램 PrintStream/PrintWriter
기본 타입 또는 문자열 =>> print()/ println()/ printf() =>> OutputStream/Writer => 출력
- PrintStream은 바이트 출력 스트림과 연결되고, PrintWriter는 문자 출력 스트림과 연결
PrintStream ps = new PrintStream(바이트 출력 스트림);
PrintStream pw = new PrintWriter(문자 출력 스트림);
직렬화와 역직렬화
- 직렬화: 메모리에 생성된 객체를 파일 또는 네트워크로 출력하기위해 필드값을일렬로 늘어선
바이트로 변경하는것
- 역직렬화: 직렬화된바이트를 객체의 필드값으로복원하는 것.
- ObjectOutputStream은 바이트 출력 스트림과 연결되어객체를 직렬화하고, ObjectInputStream은
바이트 입력 스트림과 연결되어 객체로 복원하는역직렬화
ObjectInputStream ois = new ObjectInputStream (바이트 입력 스트림)
ObjectOutputStream ois = new ObjectOutputStream (바이트 출력 스트림)
Serializable 인터페이스
- 멤버가 없는 빈 인터페이스이지만, 객체를
직렬화할 수 있다고 표시하는 역할
- 인스턴스 필드값은 직렬화 대상. 정적 필드값과
transient로 선언된 필드값은 직렬화에서
제외되므로 출력되지 않음
serialVersionUID 필드
- 직렬화할 때 사용된 클래스와 역직렬화할 때
사용된 클래스는 동일한 클래스여야 함
- 클래스 내용이 다르더라도 두 클래스가 동일한
serialVersionUID 상수값을 가지면 역직렬화 가능
File과 Files 클래스
File 클래스
- File 클래스로부터File 객체를 생성
File file = new File("경로");
- exists() 메소드가false를 리턴할 경우, 다음 메소드로파일 또는 폴더를 생성
- exists() 메소드의리턴값이 true라면 다음 메소드를 사용
Files 클래스
- Files 클래스는 정적 메소드로 구성되어 있기 때문에 File 클래스처럼객체로 만들 필요 없음
- Files의 정적 메소드는 운영체제의파일 시스템에게파일 작업을 수행하도록 위임
package com.example;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FilesExample {
// File class / Files class
public static void main(String[] args) {
File f = new File("object.bin");
System.out.println(f.exists()); // file 존재 확인
System.out.println(f.getName()); // file name
System.out.println(f.getParent()); // file parant check
System.out.println(f.getAbsolutePath()); // file 절대경로
System.out.println(f.length()); // file 길이
System.out.println(f.lastModified()); // 수정된날짜 epoch time
Date modifiled = new Date (f.lastModified()); // 수정된 날짜를 modifiled로 저장 .
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // 포맷식 설정
System.out.println(df.format(modifiled)); // 수정된 날짜를 포맷으로 출력.
}
}
'Hello World > JAVA' 카테고리의 다른 글
JAVA - Collection Framework 컬렉션 자료구조 [개발스터디 기몬] (0) | 2023.04.25 |
---|---|
JAVA - Generic 제너릭 [개발스터디 기몬] (0) | 2023.04.18 |
JAVA - Lambda Expression 람다식 [개발스터디 기몬] (0) | 2023.04.18 |
JAVA - 중첩 선언과 익명 객체 NestedClass/ InnerClass / Anonymous [개발스터디 기몬] (0) | 2023.04.14 |
JAVA - Interface [ 개발스터디 기몬] (0) | 2023.04.13 |
댓글