자바 - BIO, NIO, AIO

자바 IO는 어떻게 구현이야?

데이터 입 / 출력 동작에 대한 자바 프로그램은 자바 IO, 방식 "흐름"데이터를 조작하는 데 사용된다.

JAVA IO의 세 가지 유형

동기 차단 BIO
NIO 동기 비 차단
비동기 비 차단 AIO

동기화 : 때 자신의 읽기와 쓰기와 동기 IO, 자바 IO 거래.
비동기 비동기 IO를 사용하는 경우, 자바 OS가 처리 위탁 될 것입니다 IO는 읽기 및 쓰기, 당신은 OS의 주소와 크기 버퍼 데이터를 전달해야, OS는 비동기 IO 작업의 API를 지원해야합니다.
차단 : 반환하기 전에 완료하는 데 쓸 것 IO, 자바가 차단 된 전화를 차단 사용하는 경우.
비 차단 : 입출력 이벤트 디스패처는 독자가 읽기 및 쓰기, 완료 될 때까지 지속적으로 루프를 읽기 및 쓰기를 계속할 수 알려 드리겠습니다 때, 즉시 반환됩니다 자바 전화를 읽고 쓸 수없는 경우, 비 블로킹 IO를 사용하는 경우.

1.BIO (동기 차단)

데이터 소스 IO 작업이 다른 작업이 스트림 데이터 소스에서 수행 할 수없는 경우, 당신은 작동하기 위해 데이터 스트림에 다른 작업을 다른 작업과 함께 플레이해야합니다.
왜 동기 차단은 무엇입니까?
실제로는 그 클라이언트가 서버 측 ServerSocket의 연결 소켓을 사용 ServerSocket를를 생성하는 서버이다 ServerSocket의 소켓 해당 스레드에 연결 소켓이 통신하도록 만드는 요청 토크를 받는다. 클라이언트와의 통신을 차단 서버 진행하여, 클라이언트가 요청을 보내고 그 다음, 반응 소켓 처리 종료 후 리턴된다.
클라이언트 액세스 서버를 필요로 할 때마다 서비스 스레드에게 클라이언트 작성
(1) 바이트 스트림의 단일 바이트 읽기 (스트림이 종료되고)
, 입력 스트림 InputStream에서 : 외부 데이터 소스로부터 데이터를 판독 내부 절차.
출력 스트림 OutputStrem : 외부 데이터 소스에 대한 프로그램 데이터의 출력

의 InputStream (입력 스트림)
이 InputStream (어레이 동작)
PipedInputStream (파이프 라인 동작)
하는 FilterInputStream (필터 입력 스트림 장식 바이트 스트림)
니어 FF eredInputStream (a 버퍼 바이트 스트림 동작)
의 DataInputStream (동작의 기본 데이터 형식)
FileInputStream에 (파일 조작 )
ObjectInputStream를 (객체 행위 직렬화)
의 OutputStream (출력 스트림)
를 ByteArrayOutputStream (어레이 동작)
PipedOutputStream 파이프 (파이프 라이닝)
하는 FilterOutputStream의 (필터 출력 스트림, 바이트 스트림 장식)
니어 FF eredOutputStream (a 버퍼 바이트 스트림 동작)
DataOutputStream 정렬 ( 연산의 기본 데이터 형식)
의 PrintStream (인쇄)
FileOutputStream 또는 (파일 조작)
ObjectOutputStrem (객체 행위, 직렬화)

(2) 단일 문자의 문자 스트림 읽기 (Wirter이다 리더, 문자 스트림의 끝)
리더 (입력 스트림)
(어레이 동작)에서 CharArrayReader
때문에 PipedReader (파이프 라인 동작)
필터 처리 (여과 흐름 문자 스트림 장식)
니어 eredReader FF (함께 버퍼링 된 문자 스트림)
InputStreamReader (감형)
을 FileReader (파일 조작)

Wirter (출력 스트림)
CharArrayWirter (어레이 동작)
PipedWirter (파이프 라인 동작)
FilterWirter (여과 흐름 장식 문자 스트림)
니어 FF eredWriter (문자 버퍼 스트림)
의 OutputStreamWriter (감형)
FileWriter (파일 조작)
의 PrintWriter (인쇄)

스트림 파일에 대한 간단한 파일 작업 : 샘플 코드

텍스트 문서의 내용을 읽고

package file;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class BIO {
    public static void  main (String args[]) throws IOException {
        //根据指定路径创建一个文件句柄
        File file =new File( "C:\\Users\\Lenovo\\Desktop\\hello.txt");
        FileInputStream fis = null;
        try {
          //打开此文件的操作流程
            fis = new FileInputStream(file);
            byte[] bytearr = new byte[128];
         //读取指定长度的数据
            fis. read(bytearr);
            String str = new String (bytearr);
            System.out.println(str);
            
		 //打开输出流 
            FileOutputStream fos = new FileOutputStream(file);
            String   string=  new String("alaaalalalalalala");
         //将文本文档的内容由hello改变成alaaalalalalalala
            fos.write(string.getBytes());
            fos.close();
		
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            fis.close();
        }
    }
}

운전 후 사용할 것 BufferedInputStream을 FileInputStream의 FIS = NULL; 변화 BufferedInputStream을 FIS = NULL;
FIS = FileInputStream에 새로운 (파일) 변경 FIS = 새로운 BufferedInputStream을 (새로운 또는 FileInputStream ( 파일));
그림 삽입 설명 여기
그림 삽입 설명 여기

2.NIO (동기 비 차단)

왜 동기 왜 NIO을 비는-차단?
얼마나 많은 클라이언트에 상관없이 서버, 클라이언트 액세스를 액세스 할 수 있으며 스레드를 소비하지 않기 때문에 당신이 쇼핑을하는 당신은 다른 작업을 수행 할 다른 것들에 갈 수 있습니다, 그것은 단지 연결을 만든 다음 셀렉터의 위쪽에 등록됩니다 선택 스레드는 지속적으로 모든 소켓에 연결 여론 조사, 당신을 알리기 위해 이벤트를 발견하고는, 프로세스는 비 차단 요청을 처리하기위한 스레드를 시작합니다. 그러나이 처리 공정, 당신은 여전히 첫 번째 데이터, 프로세스를 읽을 수 있어야하고 반환이 동기 과정이다.

NIO 세 가지 핵심 개념 :
버퍼 (버퍼)
채널 (채널)
선택기 (선택)
1 버퍼 (버퍼)
NIO 또는 네트워크로 파일에 쓰기 데이터, 네트워크 또는 데이터가이 시간 아웃시 파일 읽기 버퍼는 버퍼에 의해 수행 될 필요가있다.
버퍼 다음과 같은 일반적인 단계를 사용하여 : 버퍼 쓰기 데이터를 플립 () 메소드는 버퍼에서 데이터를 읽어 호출에 분명 () 메서드 또는 컴팩트 () 메서드를 호출합니다.
버퍼는 데이터가 기록 또는 지금 읽을 수 포함

(부울 제외한) 각 자바 원시 형 버퍼의 한 종류에 대응은 다음과 같은 :
의 ByteBuffer
CharBuffer를
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
에 Doublebuffer의
사용 버퍼의 버퍼 사이즈를 정의한다.
그림 삽입 설명 여기
2. 판독 기입 채널 (채널)
채널은 데이터 기록 및 판독 될 수있는 객체이다. 원래 I와 NIO를 타고 / O는 비교가, 채널이처럼 만들
스트림입니다. 이 채널은 판독 및 기록 데이터 버퍼에 삽입된다. 읽기 및 네트워크 채널을 통해 데이터를 기록.

채널 4 개는 달성 :
되는 FileChannel : 데이터 파일에서 읽습니다.
DatagramChannel 데이터는 : 읽거나 UDP 네트워크에서 쓰기 데이터입니다.
SocketChannel에가 : 읽거나 TCP 네트워크에서 쓰기 데이터입니다.
ServerSocketChannel을 : 당신이 서버와 같은 TCP에서 연결을 수신 할 수 있습니다. 각 연결은 SocketChannel에 생성해야합니다.

3.Selector 선택기
선택기 선택기는 .Selector 스위칭 스레드 컨텍스트의 자원 소비 저장, 스레드 관리 채널의 복수를 달성하기 위해 관심 채널 일 (읽기, 쓰기, 동의 (수신 서버), 연결의 복수의 채널을 모니터링 할 수 있습니다 에너지 관리 채널 비 차단,되는 FileChannel이 차단, 관리 할 수 없습니다.

그림 삽입 설명 여기

3.AIO (비동기 비 차단)

NIO 유사과 AIO하지만 NIO는 상태를 완료하기 위해 운영 체제를 확인하려면 자신의 폴링을하고, AIO는 다음 클라이언트 콜백 인터페이스에 대한 운영 시스템은 작업이 완료 당신에게.

왜 AIO 비동기 비 차단은 무엇입니까?
파일 IO 작업을 시작 후 AIO의 채택에 따라, 당신에게 그 확인을 말해, 당신은 즉시, 다른 일을 반환 할 수 있습니다 당신은 운영 체제가 작업 자신 IO 완료 제어하지 않습니다.
당신은 당신이 유적이 완료되면 운영 체제를 작성하는 것입니다 요청 후, 모든 것을 시작할 때, 쓰기 파일을 읽고하는 API를 기반으로 AIO 경우, 운영 체제, 콜백 인터페이스에 올 것이다 당신을 작업이 완료되어 말할 수 있습니다. 이 기간 동안 기다릴 필요가 없습니다, 국가의 운영 체제를 완료하기 위해 폴링 판사에 갈 필요가 없습니다, 당신은 쇼핑과 다른 것들에 갈 수 있습니다. 동기화가 자신의 폴링이 운영 체제로 주도권을했다입니다 운영 체제 차례로 알려 비동기입니다. 그것이 그래서, AIO 비동기 비 차단하고 있습니다.

게시 59 개 원래 기사 · 원의 찬양 (11) · 전망 2241

추천

출처blog.csdn.net/qq_41219586/article/details/104517281