標籤:
轉載請註明出處: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