JAVA 학습 제57과 - IO 흐름(11)

4482 단어
파이프라인
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);
		
	}

좋은 웹페이지 즐겨찾기