JAVA-4 InputStream/OutputStream

Java語言定義了許多類專門負責各種方式的輸入或者輸出,這些類都被放在java.io包中。其中

所有輸入流類都是抽象類InputStream(字節輸入流)或者抽象類Reader(字符輸入流)的子類

所有輸出流都是抽象類OutputStream(字節輸出流)或者抽象類Writer(字符輸出流)的子類

 

InputStream類是字節輸入流的抽象類,是所有字節輸入流的父類,InputStream類具有層次結構如下圖所示

輸出流OutputStream類是字節輸入流的抽象類,此抽象類表示輸出字節流的所有類的超類。

其它子類講解:

ObjectInputStream/ObjectOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82185460

ByteArrayInputStream/ByteArrayOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82185609

BufferedInputStream/BufferedOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82185662

DataInputStream/DataOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82186009

 

代碼先行:

InputStream

package com.stydy.stream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

public class InputStreamx {

     // 文件路徑

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              InputStream in = new FileInputStream(filePath);

              byte bytes[] = new byte[1024];

              

              int len =0;

              int temp = 0;

              while ((temp = in.read()) !=-1) {

                   bytes[len] = (byte) temp;

                   len++;

              }

              in.close();

              System.out.println(new String(bytes, 0, len));

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

 

OutputStream

package com.stydy.stream;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class OutputStreamx {

     // 文件路徑

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              /**

               * 這兩個構造方法各多了一個boolean參數append。

               * append參數爲true時,數據從文件尾部寫入;append參數爲false時,數據覆蓋原文件

               */

              //OutputStream out = new FileOutputStream(filePath, true);

              OutputStream out = new FileOutputStream(new File(filePath), true);

              String msg = "\r\n" + "小蚊子(xiaowenzi)" + "\r\n" + "小蚊子(xiaowenzi)";

              out.write(msg.getBytes("GBK"));

              out.close();

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

 

InputStream 函數列表

public FileInputStream(String name)

public FileInputStream(File file)

public FileInputStream(FileDescriptor fdObj)

private void open(String name)

 

//一個一個字節的讀

public int read()

//b-讀入數據的緩衝區。

public int read(byte b[])

/**

 * b-讀入數據的緩衝區。

 * off-在其處寫入數據的數組 b 的初始偏移量。

 * len-要讀取的最大字節數。

 */

public int read(byte b[], int off, int len)

代碼解析:

package com.stydy.stream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

public class InputStreamx {

     // 文件路徑

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              InputStream in = new FileInputStream(filePath);

              byte bytes[] = new byte[1024];

              

              int temp = 0;

              while ((temp = in.read(bytes, 0, 11)) !=-1) {

              }

              in.close();

              System.out.println(new String(bytes));

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

解析:

1.文件內容: xiaowenzi#xiaowenzi#xiaowenzi

2.讀取到的內容,因爲最大長度爲11: bytes[0]=xiaowenzi#x, bytes[1]=iaowenzi#xi, bytes[2]=aowenzi

3.逆向輸出,輸出最後11位長度字符:結果爲aowenzii#xi

 

/**

 * 跳過和丟棄此輸入流中數據的 n 個字節   

 * 跳過和丟棄此輸入流中數據的 n 個字節。出於各種原因,skip 方法結束時跳過的字節數可能小於該數,也可能爲 0。導致這種情況的原因很多,跳過 n 個字節之前已到達文件末尾只是其中一種可能。返回跳過的實際字節數。如果 n 爲負,則不跳過任何字節。

 * 

 */

public long skip(long n)

代碼解析:

package com.stydy.stream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

public class InputStreamx {

     // 文件路徑

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              InputStream in = new FileInputStream(filePath);

              byte bytes[] = new byte[1024];

              

              int temp = 0;

              while ((temp = in.read(bytes, 0, 10)) !=-1) {

                   //每讀完一次跳過一個繼續讀取

                   in.skip(1);

              }

              in.close();

              System.out.println(new String(bytes));

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

解析:

1.文件內容: xiaowenzi#xiaowenzi#xiaowenzi

2.讀取到的內容,因爲最大長度爲10,每次讀完跳過一個繼續讀取: bytes[0]=xiaowenzi#,跳過後面一個字符x繼續讀取bytes[1]=iaowenzi#x, 跳過後面一個字符i繼續讀取bytes[2]=aowenzi

3.逆向輸出,輸出最後10位長度字符:結果爲aowenzii#x

 

/**

 * 輸出流的大小

 * 如果是網絡流的話,此種方法可能不準確,因爲請求會存在延時

 */

public int available()

//關閉流

public void close()

//在讀取的字節數 <= readlimit時,一定確保不失效.而讀取的字節數 > readlimit,就不能確保不失效(隨時都可能失效),但不一定立即失效.

public synchronized void mark(int readlimit)

//重新回到標記位置,從標記位置重新讀取

public synchronized void reset()

//判斷是否可被標記

public boolean markSupported()

 

OutputStream 函數列表

public FileOutputStream(String name)

public FileOutputStream(String name, boolean append)

public FileOutputStream(File file)

public FileOutputStream(File file, boolean append)

public FileOutputStream(FileDescriptor fdObj)

 

private void open(String name, boolean append)

public void write(int b)

public void write(int b, boolean append)

public void write(byte b[])

public void write(byte b[], int off, int len)

 

public void close()

protected void finalize()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章