Java Language
InputStream 및 OutputStream
수색…
통사론
- int read (byte [] b) IOException를 throw합니다.
비고
대부분의 경우, InputStream
직접 사용하지 않고, BufferedStream
사용하는 것에주의 BufferedStream
. 이것은 InputStream
이 read 메소드가 호출 될 때마다 소스에서 읽 기 때문입니다. 이로 인해 커널과의 컨텍스트 스위치에서 중요한 CPU 사용이 발생할 수 있습니다.
InputStream를 String으로 읽어 들이기
때로는 바이트 입력을 String으로 읽을 수 있습니다. 이렇게하려면 byte
와 char
사용되는 "native Java"UTF-16 Codepoints 사이를 변환하는 것을 찾아야합니다. InputStreamReader
로 끝난다.
프로세스 속도를 약간 높이려면 버퍼를 할당하는 것이 "보통"이므로 입력에서 읽을 때 오버 헤드가 너무 많이 들지 않습니다.
public String inputStreamToString(InputStream inputStream) throws Exception {
StringWriter writer = new StringWriter();
char[] buffer = new char[1024];
try (Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {
int n;
while ((n = reader.read(buffer)) != -1) {
// all this code does is redirect the output of `reader` to `writer` in
// 1024 byte chunks
writer.write(buffer, 0, n);
}
}
return writer.toString();
}
이 예제를 Java SE 6 (이하) 호환 코드로 변환하는 것은 독자의 연습 문제로 생략되었습니다.
OutputStream에 바이트를 쓰는 중
한 번에 1 바이트 씩 OutputStream
바이트를 쓰는 중
OutputStream stream = object.getOutputStream();
byte b = 0x00;
stream.write( b );
바이트 배열 쓰기
byte[] bytes = new byte[] { 0x00, 0x00 };
stream.write( bytes );
바이트 배열 섹션 작성하기
int offset = 1;
int length = 2;
byte[] bytes = new byte[] { 0xFF, 0x00, 0x00, 0xFF };
stream.write( bytes, offset, length );
스트림 닫기
대부분의 스트림을 다 끝내면 닫아야합니다. 그렇지 않으면 메모리 누수가 발생하거나 파일을 열어 둘 수 있습니다. 예외가 발생하더라도 스트림이 닫히는 것이 중요합니다.
try(FileWriter fw = new FileWriter("outfilename");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//handle this however you
}
try-with-resources 보장, 블록이 종료 될 때 리소스가 닫혀 있는지, 일반적인 제어 흐름으로 발생했는지 또는 예외로 인해 발생했는지 등을 기억하십시오.
리소스가있는 경우 시도가 옵션이 아니거나 Java 6 이전 버전의 이전 버전을 지원하는 경우가 있습니다. 이 경우 finally
블록을 사용하는 것이 적절하게 처리됩니다.
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt");
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//handle this however you want
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//typically not much you can do here...
}
}
래퍼 스트림을 닫으면 기본 스트림도 닫힙니다. 즉, 스트림을 랩핑하고 래퍼를 닫은 다음 원래 스트림을 계속 사용할 수 없습니다.
입력 스트림을 출력 스트림에 복사
이 함수는 두 스트림간에 데이터를 복사합니다.
void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8192];
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
}
예 -
// reading from System.in and writing to System.out
copy(System.in, System.out);
입력 / 출력 스트림 배치
OutputStream
과 InputStream
에는 여러 가지 클래스가 있으며 각각 고유 한 기능이 있습니다. 스트림을 다른 스트림으로 래핑하면 두 스트림의 기능을 모두 사용할 수 있습니다.
여러 번 스트림을 래핑 할 수 있으며, 순서를 기록하십시오.
유용한 조합
버퍼를 사용하면서 파일에 문자 쓰기
File myFile = new File("targetFile.txt");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(myFile)));
버퍼를 사용하는 동안 파일에 쓰기 전에 데이터 압축 및 암호화
Cipher cipher = ... // Initialize cipher
File myFile = new File("targetFile.enc");
BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream(myFile), cipher)));
입 / 출력 스트림 래퍼 목록
싸개 | 기술 |
---|---|
BufferedOutputStream / BufferedInputStream | OutputStream 한 번에 한 바이트 씩 데이터를 쓰는 동안 BufferedOutputStream 은 데이터를 청크로 씁니다. 이렇게하면 시스템 호출 수가 줄어들어 성능이 향상됩니다. |
DeflaterOutputStream / DeflaterInputStream | 데이터 압축을 수행합니다. |
InflaterOutputStream / InflaterInputStream | 데이터 압축 해제를 수행합니다. |
CipherOutputStream / CipherInputStream | 데이터를 암호화 / 해독합니다. |
DigestOutputStream / DigestInputStream | 데이터 무결성을 확인하기 위해 Message Digest를 생성합니다. |
CheckedOutputStream / CheckedInputStream | CheckSum을 생성합니다. CheckSum은 Message Digest의 좀 더 간단한 버전입니다. |
DataOutputStream / DataInputStream | 프리미티브 데이터 유형 및 문자열 작성을 허용합니다. 바이트를 쓰는 것을 의미합니다. 플랫폼에 독립적입니다. |
PrintStream | 프리미티브 데이터 유형 및 문자열 작성을 허용합니다. 바이트를 쓰는 것을 의미합니다. 플랫폼에 따라 다름. |
OutputStreamWriter | OutputStream를 라이터로 변환합니다. Writer가 문자를 처리하는 동안 OutputStream은 바이트를 처리합니다. |
PrintWriter | OutputStreamWriter를 자동으로 호출합니다. 프리미티브 데이터 유형 및 문자열 작성을 허용합니다. 엄밀히 말하면 글자 쓰기와 글자 쓰기에 가장 적합합니다. |
DataInputStream의 예
package com.streams;
import java.io.*;
public class DataStreamDemo {
public static void main(String[] args) throws IOException {
InputStream input = new FileInputStream("D:\\datastreamdemo.txt");
DataInputStream inst = new DataInputStream(input);
int count = input.available();
byte[] arr = new byte[count];
inst.read(arr);
for (byte byt : arr) {
char ki = (char) byt;
System.out.print(ki+"-");
}
}
}