1. 程式人生 > >java IO字元流與位元組流簡單使用示例

java IO字元流與位元組流簡單使用示例

1.Reader && Writer
Reader

 java.lang.Object   
    |-- java.io.Reader//常用方法
                |-- int read()  //讀取單個字元
                |--  int read(char[] cbuf)  //將字元讀入陣列中
                |-- abstract  int read(char[] cbuf, int off, int len)  //將字元讀入陣列中的某一部分。
                |--abstract  void
close() //關流 |-- java.io.BufferedReader//其方法大致和Reader相同不在列舉,注意BufferedReader有ReadLine()方法 |-- java.io.LineNumberReader //以下為其常用方法 |-- LineNumberReader(Reader in) //構造方法 |-- int getLineNumber() //獲取當前行號 |-- int read() //讀取單個字元 |
-- int read(char[] cbuf, int off, int len) //將字元讀入陣列中的某一部分。 |-- String readLine() //讀取文字行。 |-- void close() //關流 |-- java.io.InputStreamReader//繼承自Reader,常用方法與Reader基本相同,注意構造方法引數,此類將位元組流轉換為字元流,是位元組流通向字元流的橋樑 |-- InputStreamReader(InputStream in)
//構造方法 |-- InputStreamReader(InputStream in, Charset cs)//構造方法,建立使用給定字符集的 InputStreamReader。 |-- java.io.FileReader//常用方法 |-- FileReader(File file)//構造方法 |-- FileReader(String fileName) //構造方法 |-- java.io.CharArrayReader//此類實現一個可用作字元輸入流的字元緩衝區。 |-- CharArrayReader(char[] buf) //構造方法,根據指定的 char 陣列建立一個 CharArrayReader。 |-- CharArrayReader(char[] buf, int offset, int length) //構造方法,根據指定的 char 陣列建立一個 CharArrayReader。 |-- java.io.PipedReader//傳送的字元輸入流。 |-- PipedReader() //構造方法,建立尚未連線的 PipedReader。 |-- PipedReader(int pipeSize) //建立一個尚未連線的 PipedReader,並對管道緩衝區使用指定的管道大小。 |-- PipedReader(PipedWriter src) //建立連線到傳送 writer src 的 PipedReader。 |-- PipedReader(PipedWriter src, int pipeSize) // 建立一個 PipedReader,使其連線到管道 writer src,並對管道緩衝區使用指定的管道大小。 |-- void connect(PipedWriter src) //使此傳送 reader 連線到傳送 writer src。 |-- java.io.FilterReader |-- protected FilterReader(Reader in) //建立一個新的 filtered reader,其餘方法和Reader相似 |-- java.io.StringReader //其源為一個字串的字元流。與CharArrayReader相似 |-- StringReader(String s) //建立一個新字串 reader。

$$ 此例為複製檔案:通過File建立一個空檔案,並把之前已存在的檔案進行讀取,將內容複製到空檔案中,實現複製檔案,

package com.IO;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedReaderTest02 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		File file = new File("E:\\Blog\\test.txt");
		BufferedReader br = new BufferedReader(new FileReader("E:\\Blog\\Copy01.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter(file));//使用 FileReader(String fileName) 構造方法
		String line = null;
		while((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		bw.close();
		br.close();
	}
}

$$ 此例仍以複製檔案為例:InputStreamReader 和 OutputStreamWriter方法的具體演示,註釋掉的是另一種實現方法,並不是錯誤,得到的結果都是相同的,都會複製到指定檔案中,注意:一旦操作文字涉及到具體的指定編碼表時,必須使用轉換流 。
本例解析:讀取一個檔案,將其轉換為字元流進行操作,可以進行整行讀取比較方便

package com.IO;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class InputStreamReaderTest01 {

	@SuppressWarnings("unused")
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

//		InputStreamReader in = new InputStreamReader(new FileInputStream("E:\\Blog\\Copy01.txt"));
//		OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("E:\\Blog\\Copy04.txt"));
		BufferedReader in = new BufferedReader(new 
				InputStreamReader(new FileInputStream("E:\\Blog\\Copy01.txt")));
		BufferedWriter out = new BufferedWriter(new 
				OutputStreamWriter(new FileOutputStream("E:\\Blog\\Copy06.txt")));
//		int len;
//		char[] ch = new char[1024];
//		
//		while((len = in.read(ch)) != -1) {
//			out.write(ch,0,len);
//			out.flush();
//		}
		
		String line = null;
		while((line = in.readLine()) != null) {
			out.write(line);
			out.newLine();
			out.flush();
		}
		out.close();
		in.close();
	}

}

$$ 此例為CharArrayReader 的基本操作,此類用的相對較少對應位元組流中的 ByteArrayInputStream

package com.IO;

import java.io.CharArrayReader;
import java.io.IOException;

public class CharArrayReaderTest01 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
		CharArrayReader cr = new CharArrayReader(ch);
		System.out.println((char)cr.read());
		cr.skip(1);//跳過下標為 1 之前的元素
		char[] ch1 = new char[5];
		cr.read(ch1, 0, 4);//相當於複製0~4的元素ch1中
		System.out.println(new String(ch1));
	}

}
/**結果為
*  a
*  ervt
*/

Writer
與Reader相似,二者大多數都是對應存在的,相當於有輸入必有輸出

java.lang.Object
  |-- java.io.Writer //常用方法
              |-- Writer append(char c)  //將指定字元新增到此 writer。
              |-- abstract  void flush()  //重新整理該流的緩衝。
              |-- void write(char[] cbuf)  //寫入字元陣列。
              |-- abstract  void write(char[] cbuf, int off, int len)  //寫入字元陣列的某一部分
              |-- void write(int c)  //寫入單個字元。
              |--  void write(String str) //寫入字串。
              |-- void write(String str, int off, int len)  // 寫入字串的某一部分。
      |-- java.io.BufferedWriter //緩衝流,提高效率,方法看父類,注意建構函式要傳進來一個 Writer out,存在 newLine方法寫入一個行分隔符
      |-- java.io.OutputStreamWriter //字元流通向位元組流的橋樑,將輸出的字元流變為位元組流
                  |-- OutputStreamWriter(OutputStream out) //建構函式
                  |-- String getEncoding() //返回此流使用的字元編碼的名稱。其餘方法參看父類
      |-- java.io.CharArrayWriter//使用較少,不再列舉其具體方法
      |-- java.io.StringWriter//不做例項,不列舉方法
      |-- java.io.FilterWriter
                  |-- protected  FilterWriter(Writer out)// 建立一個新的 filtered writer,其餘方法參看父類
      |-- java.io.PipedWriter 傳送的字元輸出流。 
                  |-- PipedWriter() //建立一個尚未連線到傳送 reader 的傳送 writer。
                  |-- PipedWriter(PipedReader snk) //建立傳送 writer,使其連線到指定的傳送 reader。
                  |-- void connect(PipedReader snk)  //將此傳送 writer 連線到接收方。
      |-- java.io.PrintWriter//向文字輸出流列印物件的格式化表示形式
                  |-- PrintWriter(File file) //使用指定檔案建立不具有自動行重新整理的新 PrintWriter。
                  |-- PrintWriter(OutputStream out)// 根據現有的 OutputStream 建立不帶自動行重新整理的新 PrintWriter。
                  |-- PrintWriter(OutputStream out, boolean autoFlush)// 通過現有的 OutputStream 建立新的 PrintWriter。
                  |-- PrintWriter(String fileName)//建立具有指定檔名稱且不帶自動行重新整理的新 PrintWriter
                  |-- PrintWriter(Writer out) //建立不帶自動行重新整理的新 PrintWriter。
                  |-- PrintWriter(Writer out, boolean autoFlush)// 建立新 PrintWriter。
                  |--  void println(int x) // 列印整數,然後終止該行。
                  |-- void print(int i)  //列印整數。

$$ CharArrayWriter 簡單示例

package com.IO;

import java.io.CharArrayWriter;

public class CharArrayWriterTest01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
		CharArrayWriter cw = new CharArrayWriter();
		cw.write(ch, 0, 6);
		System.out.println(cw.size());
		System.out.println(cw.toString());
		char[] ch1 = cw.toCharArray();
		for(char c : ch1)
			System.out.print(c + " ");
	}
}
/**
 * 
 * 結果為
 * 6
 * acervt
 * a c e r v t
 * 
 * */

$$PrintWriter 示例

package com.IO;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class PrintWriterTest01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
		PrintWriter po;
		String s = "abe";
		String ss = "kl阿斯頓發";
		try {
			po = new PrintWriter(new FileOutputStream("E:\\Blog\\test02.txt"));
			po.write(ch);
			po.println(s);//列印到E:\\Blog\\test02.txt中
			po.print(ss);
			po.flush();
			po.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2.InputStream與OutputStream
InputStream
這裡只介紹幾種比較常用的類

java.lang.Object
        |-- java.io.InputStream
                    |-- int available() // 返回此輸入流下一個方法呼叫可以不受阻塞地從此輸入流讀取(或跳過)的估計位元組數。
                    |--  void close() //關流
                    |--  abstract  int read() //從輸入流中讀取資料的下一個位元組。
                    |-- int read(byte[] b) //從輸入流中讀取一定數量的位元組,並將其儲存在緩衝區陣列 b 中
                    |--  int read(byte[] b, int off, int len)  //將輸入流中最多 len 個數據位元組讀入 byte 陣列。
             |-- java.io.FileInputStream
                    |-- FileInputStream(File file) 
                    |-- FileInputStream(String name) 
                    |-- protected  void finalize()  //確保在不再引用檔案輸入流時呼叫其 close 方法。
             |-- java.io.ByteArrayInputStream //與CharArrayReader相似
                    |-- ByteArrayInputStream(byte[] buf)
                    |-- ByteArrayInputStream(byte[] buf, int offset, int length) 
             |-- java.io.FilterInputStream
                 |-- java.io.BufferedInputStream//緩衝區,提高效率
                    |-- BufferedInputStream(InputStream in) //建構函式
                 |-- java.io.DataInputStream
                    |-- DataInputStream(InputStream in) 
             |-- java.io.ObjectInputStream
                    |-- Object readObject()  //從 ObjectInputStream 讀取物件。
             |-- java.io.PipedInputStream //管道輸入流應該連線到管道輸出流;管道輸入流提供要寫入管道輸出流的所有資料位元組
                    |-- PipedInputStream() //建立尚未連線的 PipedInputStream。
                    |-- PipedInputStream(int pipeSize) //建立一個尚未連線的 PipedInputStream,並對管道緩衝區使用指定的管道大小。
                    |-- PipedInputStream(PipedOutputStream src) //建立 PipedInputStream,使其連線到管道輸出流 src。
                    |-- PipedInputStream(PipedOutputStream src, int pipeSize) //建立一個 PipedInputStream,使其連線到管道輸出流 src,並對管道緩衝區使用指定的管道大小。
                    |-- void connect(PipedOutputStream src)  //使此管道輸入流連線到管道輸出流 src。

$$ ObjectInputStream與ObjectOutputStream用法簡單示例,注意:ObjectInputStream writerObject物件的時候,不能直接新增,需要將此類實現序列化serializable。

package com.IO;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;


public class ObjectStreamTest01 {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		// TODO Auto-generated method stub

		Set<Worker> list = new HashSet<Worker>();
		list.add(new Worker("lisi01",10000));
		list.add(new Worker("lisi02",10000));
		list.add(new Worker("lisi02",15000));
		list.add(new Worker("lisi01",10000));
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("E:\\Blog\\test03.txt"));
		out.writeObject(list);
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("E:\\Blog\\test03.txt"));
		@SuppressWarnings("unchecked")
		Set<Worker> ww = (Set<Worker>)in.readObject();
		for(Worker w : ww) 
			System.out.println(w.getId() + " :: " + w.getSalary());
		out.close()