Java基礎:阻塞式IO

來源:互聯網
上載者:User

標籤:

轉載請註明出處:jiq?欽‘s technical Blog 

備忘:閱讀此文之前,建議先看我這篇博文瞭解阻塞式IO和非阻塞式IO的基本概念。

一、流(Stream)1、位元組流

輸入(InputStream)

介質流

FileInputStream

從檔案中讀取資訊

PipedInputStream

產生用於寫入相關PipedOutputStream的資料,實現“管道化”概念

ByteArrayInputStream

允許將記憶體緩衝區當做InputStream使用

處理流

SequenceInputStream

將兩個或多個InputStream轉換為單個InputStream

ObjectInputStream

對象輸入資料流

FilterInputStream子類

 

BufferedInputStream

防止每次讀取時都進行實際寫操作,代表“使用緩衝區”

DataInputStream

與DataOutputStream配合使用,可以按照可移植的方式從流讀取基礎資料型別 (Elementary Data Type)(int、char、long等)

LineNumberInputStream

 

PushbackInputStream

 

 

輸出(OutputStream)

介質流

FileOutputStream

用於將資訊寫至檔案

PipedOutputStream

任何寫入其中的資訊都會自動作為相關PipedInputStream的輸出,實現“管道化”概念

ByteArrayOutputStream

在記憶體中建立緩衝區,所有送往“流”的資料都放置在此緩衝區

處理流

ObjectOutputStream

對象輸出資料流

FilterOutputStream子類

 

BufferedOutputStream

避免每次發送資料時都要進行實際的寫操作,代表“使用緩衝區”

DataOutputStream

與DataInputStream配合使用,按照可移植的方式向流中寫入基本類型資料(int、char、long等)

PrintStream

用於產生格式化輸出,DataOutputStream處理資料的儲存,PrintStream處理顯示


2、字元流

輸入(Reader)

介質流

FileReader

FileInputStream的對應

CharArrayReader

ByteArrayInputStream的對應

PipedReader

PipedInputStream的對應

處理流

BufferedReader

BufferedInputStream的對應

InputStreamReader

用於將InputStream轉換為Reader

 

輸出(Writer)

介質流

FileWriter

FileOuputStream的對應

CharArrayWriter

ByteArrayOutputStream的對應

PipedWriter

PipedOutputStream的對應

處理流

BufferedWriter

BufferedOutputStream的對應

OutputStreamWriter

用於將OutputStream轉換為Writer

 

位元組流與字元流:

(1)讀寫單位不同:位元組流以位元組(8bit)為單位,字元流以字元為單位,根據碼錶映射字元,一次可能讀多個位元組。

(2)處理對象不同:位元組流能處理所有類型的資料(片、avi等),而字元流只能處理字元類型的資料。

(3)位元組流在操作的時候本身是不會用到緩衝區的,是檔案本身的直接操作的;而字元流在操作的時候下後是會用到緩衝區的,是通過緩衝區來操作流。

(4)設計Reader/Writer繼承層次主要是為了國際化,位元組流僅支援8位的讀寫,不能很好處理16位的Unicode字元,java本身的char是16位的,添加字元流就是為了在所有IO操作中都支援Unicode。

建議:盡量嘗試使用字元流,一旦無法滿足需求,再考慮位元組流!!!

 

裝飾器設計模式(Decorator):

上面的流中,位元組流和字元流各自內部的“處理流”可以封裝其他“處理流”和“介質流”,而InputStreamReader和OutputStreamWriter可以封裝位元組流,提供了位元組流到字元流的轉換功能。


二、輸入輸出(IO)1、檔案IO

位元組流:

public static void main(String[] args)throws IOException {      String fileName="D:"+File.separator+"hello.txt";      File f=new File(fileName);      InputStream in=new FileInputStream(f);      byte[] b=new byte[1024];      int count =0;      int temp=0;      while((temp=in.read())!=(-1)){          b[count++]=(byte)temp;      }      in.close();      System.out.println(new String(b));    }

字元流:

public static void main(String[] args)throws IOException {      String fileName="D:"+File.separator+"hello.txt";      File f=new File(fileName);      char[] ch=new char[100];      Reader read=new FileReader(f);      int temp=0;       int count=0;      while((temp=read.read())!=(-1)){          ch[count++]=(char)temp;      }      read.close();      System.out.println("內容為"+new String(ch,0,count));    }

2、記憶體IO

public static void main(Stringargs[])throws IOException {         Stringstr = “Hello,jiyiqin”;ByteArrayInputStreambInput = new ByteArrayInputStream(str.getBytes());System.out.println("Convertingcharacters to Upper case " );for(int y = 0 ;y < 1; y++ ) {while(( c= bInput.read())!= -1) {System.out.println(Character.toUpperCase((char)c));}bInput.reset();}}

3、管道IO

import java.io.InputStream;import java.io.OutputStream;import java.io.PipedInputStream;import java.io.PipedOutputStream; public class PipedInputStreamTest {   public static void main(String args[]) {       PipedInputStream input = new PipedInputStream();       PipedOutputStream output = new PipedOutputStream();       try {           output.connect(input);           new Thread(new OutputstreamRunnable(output)).start();           new Thread(new InputstreamRunnable(input)).start();       } catch (Exception e) {           e.printStackTrace();       }    }} //輸出管道流線程class OutputstreamRunnable implementsRunnable {   private OutputStream out;   public OutputstreamRunnable(OutputStream output) {       this.out = output;    }   @Override   public void run() {       String str = "hello pipe";       try {           out.write(str.getBytes());           out.flush();           out.close();       } catch (Exception e) {           e.printStackTrace();       }    }} //輸入管道流線程class InputstreamRunnable implementsRunnable {   private InputStream in;   public InputstreamRunnable(InputStream in) {       this.in = in;    }   @Override   public void run() {       byte[] bs = new byte[1024];       int len = -1;       try {           if ((len = in.read(bs)) != -1) {                System.out.println(newString(bs, 0, len));           }       } catch (Exception e) {           e.printStackTrace();       }    }}

4、網路IO即常說的Java通訊端(Socket)編程,這是阻塞式的Java網路IO。

服務端代碼

public class Server {        public static void main(String args[]) throws IOException {       int port = 8888;       ServerSocket server = new ServerSocket(port);       Socket socket = server.accept();       Reader reader = new InputStreamReader(socket.getInputStream());        char chars[] = new char[64];        int len;        StringBuilder sb = new StringBuilder();        while ((len=reader.read(chars)) != -1) {           sb.append(new String(chars, 0, len));        }        System.out.println("from client: " + sb);        reader.close();        socket.close();        server.close();     }  }  

 用戶端代碼

public class Client {        public static void main(String args[]) throws Exception {       String host = "127.0.0.1";      int port = 8888;      Socket client = new Socket(host, port);      Writer writer = new OutputStreamWriter(client.getOutputStream());        writer.write("Hello Server.");        writer.flush();      writer.close();        client.close();     }  }  

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Java基礎:阻塞式IO

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.