JAVA 학습 제57과 - IO 흐름(11)
PipedInputStream 및 PipedOutPutStream
입력과 출력은 직접 연결하여 라인과 결합하여 사용할 수 있다
파이프 흐름
API 문서: 파이프 입력 흐름이 파이프 출력 흐름에 연결되어야 합니다.파이프 입력 흐름은 파이프 출력 흐름에 쓸 모든 데이터 바이트를 제공합니다.일반적으로 데이터는
PipedInputStream
대상에서 읽히고 다른 라인에서 해당하는 PipedOutputStream
에 기록된다.이 두 대상에 대해 단일 라인을 사용해 보는 것을 권장하지 않습니다. 왜냐하면 이렇게 하면 라인이 사라질 수 있기 때문입니다.파이프 입력 흐름은 버퍼를 포함하고 버퍼가 제한된 범위 내에서 읽기 작업과 쓰기 작업을 분리할 수 있습니다.연결 파이프의 출력 흐름에 데이터 바이트를 제공하는 라인이 존재하지 않으면, 이 파이프가 파손된 것으로 간주됩니다class Input implements Runnable{
private PipedInputStream pis;
Input(PipedInputStream pis){
this.pis = pis;
}
@Override
public void run() {
try {
byte[] by = new byte[1024];
int len = pis.read(by);
String str = new String(by,0,len);
System.out.println("str = "+str);
pis.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
class Output implements Runnable{
private PipedOutputStream pos;
Output(PipedOutputStream pos) {
// TODO Auto-generated constructor stub
this.pos = pos;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
pos.write(" ".getBytes());//
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class Main {
public static void main(String[] args)throws IOException{
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
pis.connect(pos);//
Thread t1 = new Thread(new Input(pis));
Thread t2 = new Thread(new Output(pos));
t1.start();
t2.start();
}
}
파이프 흐름의 응용은 많지 않지만, 그 자체는 매우 특징이 있다.
입출력 패키지의 기타 클래스
기본 유형 데이터의 흐름 객체 - DataInputStream 및 DataOutputStream
바이트 배열 - ByteArray InputStream 및 ByteArray OutputStream
조작 문자 배열 - CharArray InputStream 및 CharArray OutStream
작업 문자열 - StringWriter 및 StringReader
DataInputStream 및 DataOutputStream
public static void read() throws IOException {
// TODO Auto-generated method stub
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
String str = dis.readUTF();
System.out.println(str);
dis.close();
}
public static void DataStreamDemo() throws IOException {
// TODO Auto-generated method stub
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
dos.writeUTF(" "); <a target=_blank href="">UTF-8 </a> 。
dos.close();
}
남은 방법은 OutputStream, InputStream과 차이가 많지 않다작업 배열의 흐름
원본과 외환은 모두 메모리다.ByteArrayInputStream、ByteArrayOutputStream
ByteArray OutputStream: 출력 흐름을 실현하고 그 데이터는byte 그룹에 기록됩니다.버퍼는 데이터를 계속 쓰기 때문에 자동으로 증가합니다.
toByteArray()
와 toString()
를 사용하여 데이터를 얻을 수 있으며 ByteArray OutputStream을 닫으면 올바르지 않습니다. public static void ByteStreamDemo() throws IOException {
ByteArrayInputStream bis = new ByteArrayInputStream("asdfd".getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = 0;
while((len = bis.read())!=-1){
bos.write(len);
}
System.out.println(bos.toString());
}
나머지 흐름법은 Byte Array Input Stream과 동일합니다
인코딩 문제
인코딩 문제는 문자와 이진 사이의 상호 변환일 뿐이다
문자열-> 문자열 배열:인코딩
문자열 배열-> 문자열:디코딩
public static void Demo() {
String str = " ";
//
byte[] by = str.getBytes();
for(byte b : by){
System.out.println(b);
}
//
String str1 = new String(by);// == new String(by,"GBK");
System.out.println(str1);
}
인코딩이 맞으면 디코딩에 성공할 수 있습니다
연습: 최대 바이트 수로 문자열 캡처
자바에서 문자열 'abcd' 는 'ab 안녕' 과 길이가 같고 모두 4글자이지만 바이트 수는 다르다
최대 바이트 수에 따라 바이트를 추출하는 방법을 정의합니다
예를 들어'ab안녕'을 예로 들면 세 바이트에 따라 문자를 찾으면'ab'와 반 너, 반 포기, 4 바이트에'ab너'를 찾으면 다섯 바이트에'ab너'를 찾으면
public static void main(String[] args)throws IOException{
String str = "ab asdas ";
int len = str.getBytes("GBK").length;
for(int i = 0;i<len;i++){// i
System.out.println("OK : "+Demo(str,i+1));
}
}
public static String Demo(String str,int len) throws IOException {
byte[] by = str.getBytes("GBK");
int count = 0;// ,
for(int i = len-1;i>=0;i-- ){
if(by[i]<0){
count++;
}else {
break;
}
}
// 2 , = /2
return (count & 1) == 0?new String(by,0,len):new String(by,0,len-1);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.