
Java8 부터 지원하는 Stream은 컬렉션, 배열 등에 대해 저장되어있는 요소들을 하나씩 참조하며 반복적인 처리를 가능케하는 기능.
Stream을 이용하면 불필요한 for문과 그 안에서 이루어지는 if문 등의 분기처리를 쓰지 않고도 깔끔하고 직관적인 코드로 변형할 수 있다.
https://ahndding.tistory.com/23
데이터가 들어온 순서대로 흘러다니는 단방향의 통로이다.
입구와 출구가 존재하며 입구를 InputStream, 출구를 OutputStream이라 한다.
Stream 을 통해 데이터는 기본적으로 byte 또는 byte[] 형태로 흘러다닌다.
Stream은 동기적, blocking방식으로 동작한다.
데이터를 읽거나 쓰기 위해 스트림에 요청하면 스트림은 자신의 역할에 맞춰 다시 데이터를 읽거나 쓸 수 있을 때까지 다른 작업을 하지 못하고 무한정 기다린다.
Java에서 모든 I/O는 Stream을 기반으로 하기 때문에 빈번하게 사용되는데,
사용을 끝내고 닫아주지 않으면 심각한 메모리 누수가 발생할 수 있기 때문에 예외처리에 주의를 기울여서 사용하여야 한다.
임시로 데이터를 담아둘 수 있는 일종의 큐이다.
바이트 단위의 데이터가 입력될 때마다 Stream은 즉시 전송하게 되는데 이것은 디스크 접근이나 네트워크 접근같은 오버헤드가 발생하기 때문에 매우 비효율적인 방법이다.
중간에서 입력을 모아서 한번에 출력함으로써 I/O의 성능을 향상시키는 역할을 한다.
// Buffer를 사용하지 않고 출력
public static void nonBufferIO() {
for (int i = 0; i < 100000; i++) {
System.out.print(i); //입력이 있을 때마다 출력
}
System.out.println();
}
// Buffer를 사용하여 출력
public static void bufferIO() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 100000; i++) {
sb.append(i); //1. 버퍼에 모두 담고
}
sb.append("\n");
System.out.print(sb); //2. 출력
}
}
//<수행속도>
//nonBufferIO() : 281(ms)
//bufferIO() : 15 (ms)
위의 코드는 참고 사이트에서 가져온 코드이다.
0부터 10만까지의 숫자를 nonBufferIO()는 매번 화면에 출력하고,
bufferIO()는 입력들을 모두 버퍼에 담은 후 입력이 끝나면 버퍼에 담아둔 데이터를 출력한다.
밀리초로 각 메서드의 수행시간을 측정한 결과 nonBufferIO()는 281밀리초
bufferIO()는 15밀리초로 10배가 넘는 속도차이가 났다.
입력이 많아지고 데이터의 크기가 커질 수록 이 속도의 차이는 커질 것이다.
버퍼의 장점을 스트림에 적용하여 Java에서는 BufferedInputStream과 BufferedOutputStream을 제공한다.
자바의 기본 입출력 방식이었던 Stream은 blocking 방식과 Non-Buffer의 특징으로 인해 입출력 속도가 느릴 수 밖에 없었다.
자바 4부터 그러한 문제점을 해결하고자 NIO(New Input Ouput)가 java.nio패키지에 포함되어 등장하였는데, Channel이 그 기본 입출력 방식이다.
데이터가 흘러다니는 양방향의 통로.
Channel은 Stream과 유사하지만 동작 방식이 다르다.
양방향이기 때문에 input/output 을 구분하지 않는다.
Stream은 입력과 출력을 위해 InputStream과 OutputStream을 만들어야 했지만 Channel은 그럴 필요가 없다.
또, Channel은 Stream과 다르게 기본적으로 Buffer를 통해서만 read와 write를 할 수 있는 buffer방식이고, blocking방식과 non-blocking방식 모두 가능하다. NIO는 Non-blocking 방식으로 데이터를 처리할 수 있어서 과도한 스레드 생성을 피하고 스레드를 효과적으로 재사용 할 수 있다.
NIO는 불특정 다수의 클라이언트를 연결하거나 하나의 입출력 처리작업이 오래걸리지 않는 경우에 사용하는 것이 좋고,
IO는 연결 클라이언트 수가 적고 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성이 있는 경우 유리하다.
https://javanitto.tistory.com/11
byte Stream 기반의 최상위 클래스
input stream

output stream

8bit의 input과 output을 사용할 때 프로그램은 Byte Stream을 사용한다.
모든 Byte Stream 클래스는 InputStream과 OutputStream의 자손 클래스이다.
대부분의 많은 Byte Stream 클래스는 작동 방식을 설명하기 위해 File I/O Byte Stream, File Input/Output에 초점을 맞추게 된다.
스트림을 사용하고 스트림을 닫는 작업 또한 상당히 중요하다.
스트림을 닫음으로써 리소스의 누출을 방지할 수 있고 또한, CopyByte의 에러를 방지할 수 있다.
Java는 문자 값을 유니코드로 저장한다.
Character I/O는 내부적으로 포맷을 자동으로 local character set으로 변환하게 된다.
local character set은 보통 ASCII 코드의 superset이다.
대부분의 app에서 character I/O Stream은 byte Stream보다 복잡하지 않다.
Stream 클래스로 요청된 I/O는 자동으로 local Character set으로 변환하기 때문에 프로그래머의 추가 개발이나 작업 없이 사용할 수 있다.
유저의 입력을 받기 위해 자바에서 제공하는 스트림으로 java.lang 패키지에 포함되어 있다.
주로 볼 수 있는 Scanner를 선언할 때 () 내부안에 선언하는 System.in이 표준 스트림이다.

키보드를 이용해 입력 받거나 , 프로그램을 실행하며 받는 arg들이 input에 활용될 수 있다.
byte stream, character stream 두 종류가 있다.
둘의 차이점이라면 Read/Write할 때 character stream은 파일을 close하지 않으면 reader로 읽을 수 없다는 것과 File I/O에 버퍼를 사용한다는 것의 차이가 있다.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyCharacters {
public static void main(String[] args) throws IOException {
FileReader inputStream = null;
FileWriter outputStream = null;
try {
inputStream = new FileReader("xanadu.txt");
outputStream = new FileWriter("characteroutput.txt");
int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
}
위의 코드는 참고사이트의 사이트를 참고한 코드이다.
https://dblog94.tistory.com/entry/Java-Study-13%EC%9D%BC%EC%B0%A8
참고사이트 정리
https://ahndding.tistory.com/23
https://javanitto.tistory.com/11
https://dblog94.tistory.com/entry/Java-Study-13%EC%9D%BC%EC%B0%A8