Java網絡編程(一)流

一、前言

一直以來流都是困擾新手和才工作者的東東,這裏也算給新來者一些簡介。用最簡單的語言,說明罪簡單的道理。希望如此

二、流的簡單

2.1 基礎流輸入流inputStream

擁有的方法:reed(讀取)、available(可以讀取最少長度)、close(關閉)、
package stream;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by ycy on 16/3/5.
 * inputStream 輸入流主要方法
 * read
 * skip(網絡中一般很少用)
 * available
 * close
 */
public class InputStream_test {
    public static void main(String[] args) throws IOException {
        InputStream in=null;//沒有實現
        /*單字節讀取*/
        byte[] input=new byte[10];
        for (int i = 0; i <input.length ; i++) {
            int b=in.read();
            if (b==-1)break;
            input[i]=(byte) b;
        }
        /*讀取真正字節數量*/
        int bytesRead=0;
        int byteToRead=1024;
        byte[] input2=new byte[byteToRead];
        while (bytesRead<byteToRead){
            int result=in.read(input2,bytesRead,byteToRead-bytesRead);
            if (result==-1)break;//流結束
            bytesRead+=result;
        }
        /*available建議字節*/
        int byteAvailable=in.available();
        byte[] input3=new byte[byteAvailable];
        int bytestRead3=in.read(input,0,byteAvailable);
        //立即執行其他程序部門
    }
}

2.2基礎流輸出流outputStram

擁有的方法 write(寫入)、flush(刷新)、close(關閉)、
 /**
     * 單字節輸入
     *
     * @param out
     * @throws IOException
     */
    public static void generateCharacters(OutputStream out) throws IOException {
        int fistPrintableCharacter = 33;
        int numberOfPrintableCharacters = 94;
        int numberOfCharactersPerLine = 72;

        int start = fistPrintableCharacter;
        while (true) {
            /*無限循環*/
            for (int i = start; i < start + numberOfCharactersPerLine; i++) {
                out.write((
                        (i - fistPrintableCharacter) % numberOfCharactersPerLine) + fistPrintableCharacter);
            }
            out.write('\r');//回車
            out.write('\n');//換行
            start = ((start + 1) - fistPrintableCharacter) % numberOfCharactersPerLine + fistPrintableCharacter;
        }
    }

    /**
     * 有數組緩存測輸入流
     *
     * @param out
     * @throws IOException
     */
    public static void getnerateCharacters(OutputStream out) throws IOException {
        int fistPrintableCharacter = 33;
        int numberOfPrintableCharacters = 94;
        int numberOfCharactersPerLine = 72;
        int start = fistPrintableCharacter;
        byte[] line = new byte[numberOfCharactersPerLine + 2];
        //+2 對應回車和換行
        while (true) {
            for (int i = start; i < start + numberOfCharactersPerLine; i++) {
                line[i - start] = (byte) ((i - fistPrintableCharacter) % numberOfPrintableCharacters + fistPrintableCharacter);
            }
            line[72] = (byte) '\r';
            line[72] = (byte) '\n';
            try {
                out.write(line);
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
            out.write(line);
            start = ((start + 1) - fistPrintableCharacter) % numberOfPrintableCharacters + fistPrintableCharacter;
        }
    }

2.3 基礎流總結

基礎流的基本方法 read與Write 數組的擴展,表示可以緩存字節,這樣在網絡傳輸中更快(因爲每次傳輸都需要在我們需要消息裏面加報文其他信息的)。就2、3個方法,是不是沒你想的那麼複雜。流不要理解那麼深,就理解爲字節傳輸通道就ok。是不是很簡單,不需要太多語言來講解複雜的解釋

2.4 過濾流

 所謂過濾流就是除開基礎類的其他流的類,其實都是基於者兩個類的擴展。過濾流使用原則---使用最後封裝的一個!!
或者如此也行
DataOutputStream dataout = new DataOutputStream(
                           new BufferedOutputStream(
                           new FileOutputStream("data.txt")));

2.4.1 緩衝流

在使用的時候我們基本都用緩充流,什麼叫緩衝就是你直接喝水與與杯子喝水的區別。用杯子要快一些吧!
默認輸入緩衝:2048 字節       默認輸出緩衝:512字節
  1. bufferinputStream:多字節讀取多次從底層輸入流中讀取數據,加入數組。
  2. BuffredOutputStream:每次寫入緩衝區,而不是寫入底層輸出流,因此必應要flush方法。
  3. printStream:不要用,因爲他沒有編碼,使用的是平臺默認編碼,跨平臺怎麼辦。 包括以後的prinWriter(已經接近編碼問題)也不要用,java大神說的照做就ok。

2.4.2  數據流

  dataoutputStream 與 dataInputStream ,專業讀取數據的,可以看看api穩定就ok,我沒有經常用啦。

2.4.3 閱讀器與書寫器

唯一的好處:將字節變爲字符,我們讀起來更快,杯子(緩衝流)成爲了飲料(閱讀書寫器),都裝好了!!!
  1. writer書寫器:Writer 與outputStream的子類。outputStreamWriter是Writer的子類,注意指定編碼方式
  2. Reader閱讀器:他也有一個方法available不是返回字節數,而是返回boolean
  3. 總結:把面向字節變換爲面向字符的接口InputStreamReader 與OutputStramWirter都是過濾器;默認使用緩存區8192字符
//讀取input流的閱讀器

/**
 * 使用reader 字節變爲字符
 * 使用bufferreader 使用緩存加快了速度
 * @param in
 * @return
 * @throws IOException
 */
public  static String getMaccyrillicString(InputStream in) throws IOException{
    Reader re=new InputStreamReader(in,"macCyrillic");
    re=new BufferedReader(re,1024);
    StringBuilder sb=new StringBuilder();
    int c;
    while ((c= re.read())!=-1){
        sb.append((char)c);
    }
    return sb.toString();
}
public static void main(String[] args) {

}

三、總結

這一章節我們用幾句話形容了流的內容,用幾段代碼來展示了流的讀取寫出。記住一個原則就ok:要想快用緩存,再快就是讀字符。
從基礎流要過濾器流,就是一個基類到子類的一些擴展。沒什麼難得,沒事上面幾行代碼,在項目裏面足夠處理流的數據了。就是一句話解決的事情,是不是??
看過請評論一下,指點一下,我可以學習進步一下。謝謝!! 不想閉門造車



發佈了81 篇原創文章 · 獲贊 47 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章