原文地址: http://blog.csdn.net/jiangwei0910410003/article/details/22376895
摘要:
Java 流在處理上分為字元流和位元組流。字元流處理的單元為 2 個位元組的 Unicode 字元,分別操作字元、字元數組或字串,而位元組流處理單元為 1 個位元組,操作位元組和位元組數組。
Java 內用 Unicode 編碼儲存字元,字元流處理類負責將外部的其他編碼的字元流和 java 內 Unicode 字元流之間的轉換。而類 InputStreamReader 和 OutputStreamWriter 處理字元流和位元組流的轉換。字元流(一次可以處理一個緩衝區)一次操作比位元組流(一次一個位元組)效率高。
(一)以位元組為導向的 Stream------InputStream/OutputStream
InputStream 和 OutputStream 是兩個 abstact 類,對於位元組為導向的 stream 都擴充這兩個基類; 1、 InputStream
基類InputStream:
構造方法:
InputStream() 建立一個輸入的stream流
方法:
available():返回stream中的可讀位元組數,inputstream類中的這個方法始終返回的是0,這個方法需要子類去實現。
close():關閉stream方法,這個是每次在用完流之後必須調用的方法。
read():方法是讀取一個byte位元組,但是返回的是int。
read(byte[]):一次性讀取內容到緩衝位元組數組
read(byte[],int,int):從資料流中的哪個位置offset開始讀長度為len的內容到緩衝位元組數組
skip(long):從stream中跳過long型別參數個位置
以上的方法都是很簡單理解的,這裡就不寫代碼介紹了。
下面還有三個方法:
mark(int):用於標記stream的作用
markSupported():返回的是boolean類型,因為不是所有的stream都可以調用mark方法的,這個方法就是用來判斷stream是否可以調用mark方法和reset方法
reset():這個方法和mark方法一起使用的,讓stream回到mark的位置。
上面說的可能抽象了點,下面就用代碼來解釋一下吧:
[java] view plain copy package com.io.demo; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class InputStreamTest { public static void main(String[] args) throws IOException { writeToFile(); readFromFile(); } private static void readFromFile() { InputStream inputStream = null; try { inputStream = new BufferedInputStream(new FileInputStream(new File("test.txt"))); // 判斷該輸入資料流是否支援mark操作 if (!inputStream.markSupported()) { System.out.println("mark/reset not supported!"); return; } int ch; int count = 0; boolean marked = false; while ((ch = inputStream.read()) != -1) { System.out.print("." + ch); if ((ch == 4