참고 : https://velog.io/@bahar-j/
bahar-j (June Lee) - velog
GSLB와 SLB 스위치(허브)가 아닌 서버 레벨에서의 로드 밸런싱(부하 분산). DNAT(Destination Network Address Translation) 방식을 이용해 하나의 VIP에 여러 서버들이 붙어있을 수 있음예를 들어, nginx g/w의 vip는
velog.io
스트림이란?
데이터가 한 곳에서 다른 곳으로 흐르는, '데이터의 흐름' 을 의미함
1. 입력 스트림 (Input Stream)
데이터를 어디에선가 입력받는 통로
- 파일로부터 데이터를 읽거나, 사용자로부터 입력을 받을 때 사용
- InputStream, Reader 등
- Scanner sc=new Scanner(System.in)에서, System.in이 InputStream
2. 출력 스트림 (Output Stream)
데이터를 어디론가 출력하는 통로
- 데이터를 파일에 쓰거나, 콘솔에 출력을 할 때 사용
- OutputStream, Writer 등
- System.out.println에서, System.out이 PrintStream
스트림의 종류
- 바이트 스트림: 1바이트 단위로 데이터를 처리하는 스트림
InputStream과 OutputStream이 바이트 스트림을 처리하는 기본 클래스
주로 파일 입출력, 네트워크 통신 등에 사용 - 문자 스트림: 2바이트 단위로 데이터를 처리하는 스트림
Reader와 Writer가 문자 스트림을 처리하는 기본 클래스
주로 텍스트 데이터를 입출력할 때 사용
Stream 테스트 : test1 → test2로 데이터 옮기기
int flag = 0;
byte[] arr = new byte[500];
FileInputStream inputStream = new FileInputStream("test1.txt");
FileOutputStream outputStream = new FileOutputStream("test2.txt");
while((flag = inputStream.read(arr)) != -1) {
outputStream.write(arr);
System.out.println(flag);
Arrays.fill(arr, (byte)0);
}
500바이트만큼 읽고, 쓰고, 지우고 반복
기반 스트림과 보조 스트림
보조 스트림은 직접적으로 리소스와 연결되지는 않지만, 다른 스트림에 연결되어 성능 향상을 돕는다
BufferedReader br = null;//보조 스트림
BufferedWriter bw = null;//보조 스트림
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new FileWriter("output.txt"));
- System.in이라는 InputStream(바이트)이 InputStreamReader(문자)에 연결
- 마지막으로 BufferedReader(문자+버퍼를 사용하는 스트림)과 연결
- 바이트로 받은 리소스를 문자로 바꿔서 한 줄 씩 읽어올 수 있음
String str = br.readLine();
여기에 String을 읽어서 리턴하는 메소드인 readLine을 붙이면 콘솔에 입력한 내용을 String에 저장할 수 있고,
bw.write(str);
을 해주면 해당 문자열을 받아서 "output.txt"라는 파일에 바이트 데이터로 바꿔서 쓸 수 있음
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new FileWriter("output.txt"));
while((str = br.readLine()) != null) {
str += "\n";
bw.write(str);
}
- BufferedReader(혹은 InputStream)을 사용하면, read() 메서드를 호출했을 때
입력 소스로부터 데이터를 읽어서 버퍼에 저장 - 입력 소스에서 데이터를 버퍼 크기 만큼 가져와 버퍼에 저장
- 이후 버퍼로부터 읽으면, 외부의 입력소스를 바로 읽는 것보다 작업이 훨씬 빨라짐
BufferedWriter(혹은 OutputStream)을 사용하면, write() 메서드를 호출했을 때 출력이 버퍼에 저장
이때 버퍼가 가득 찼을 때에만 모든 내용을 출력 소스에 출력하고, 마지막 출력 부분이 출력 소스에 쓰이지 못하고 버퍼에 남아있는 채로 프로그램이 종료될 수 있기 때문에
작업을 마친 후 close() 혹은 flush()를 호출해서 모든 내용이 출력되도록 해줘야함
여러 스트림을 연결해서 사용하는 경우
마지막에 연결한 Buffered 스트림을 닫아줘야 앞부분에 연결된 스트림의 close() 메서드도 자동으로 호출되어 함께 종료
표준 입출력(Standard I/O)
콘솔을 통한 데이터의 입력과 콘솔로의 출력을 의미
자바에서는 이를 위한 3가지 입출력 스트림을 자바 어플리케이션의 실행과 동시에 자동으로 생성해주기 때문에, 별도로 스트림을 생성하는 코드 없이도 아래의 세 가지 스트림을 사용 가능
- System.in//이 스트림을 Scanner에 넣어 사용
- System.out
- System.err : System.out 과 같은 역할 + 입출력을 콘솔 이외 다른 대상으로 변경하는 것이 가능
직렬화와 반직렬화
- 직렬화 : 바이트 형태로 데이터 변환 (ser형식 파일에 저장)
- 반직렬화 : 데이터를 객체로 변환
- 웹에서는 문자열을 CSV, JSON 형식으로 직렬화하는 경우가 많음
- 그러나, 자바는 실제로 쓰이는 객체 형태로 변환하여 직렬화와 반직렬화를 거친 후에도
데이터 이용에 용이하기 때문에자바 시스템 간의 데이터 교환에서 많이 쓰임
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 직렬화
Member m = new Member("hong", 20);
ObjectOutputStream oos = null;
oos = new ObjectOutputStream(new FileOutputStream("object.ser")); // 두번째 인자로 true를 주면 덮어쓰기
oos.writeObject(m);
// 반직렬화
ObjectInputStream ols = null;
ols = new ObjectInputStream(new FileInputStream("object.ser"));
m = (Member) ols.readObject();
// 반직렬화 성공 확인
System.out.println(m.name);
System.out.println(m.age);
}
}
class Member implements Serializable {
String name;
int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
Enum 열거 타입 (1) | 2024.11.12 |
---|