1. 程式人生 > >IO流的【字元流】

IO流的【字元流】

package com.superb.io;

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

public class TestReaderOrWrite {

	public static void main(String[] args) throws IOException {
		// OutputStreamWriter();
		// FileWriter();
		// BufferedWriter();
		copy4();
	}

	/***
	 * OutputStreamWriter 將記憶體中的資料寫入檔案的5中方式如下:
	 * 
	 * 寫入結果:ac
	 * 
	 * @throws IOException
	 */
	// 寫入單個字元。要寫入的字元包含在給定整數值的 16 個低位中,16 高位被忽略。
	static void OutputStreamWriter() throws IOException {
		java.io.OutputStreamWriter writer = new java.io.OutputStreamWriter(
				new FileOutputStream(new File("F:\\java\\io\\test\\iiiiii.txt")));

		// 寫入單個字元。要寫入的字元包含在給定整數值的 16 個低位中,16 高位被忽略。
		writer.write(97);
		writer.write('c');
		writer.write("\r\n");

		// 寫入字元陣列
		char[] c = new char[] { '我', '是', '爹' };
		writer.write(c);
		writer.write("\r\n");

		// 寫入字元陣列的某一部分。
		writer.write(c, 0, 2);
		writer.write("\r\n");

		// 寫入字串
		String str = "嘻嘻哈哈";
		writer.write(str);
		writer.write("\r\n");

		// 寫入字串的某一部分。
		writer.write(str, 0, 2);

		writer.flush();
		writer.close();
	}

	/**
	 * FileWriter:類從OutputStreamWriter類繼承而來。該類按字元向流中寫入資料,可以關聯原始檔。主要夠造函式:
	 * 
	 * @throws IOException
	 */
	static void FileWriter() throws IOException {
		String fileName = "F:\\java\\io\\test\\iiiiii.txt";
		// 建立字元輸出流類物件和已存在的檔案相關聯。檔案不存在的話,並建立。
		// 如:FileWriter fw = new
		// FileWriter("C:\\demo.txt");
		FileWriter fw = new FileWriter(fileName);

		// 建立字元輸出流類物件和已存在的檔案相關聯,並設定該該流對檔案的操作是否為續寫。
		// 如:FileWriter fw = new FileWriter("C:\\demo.txt",ture);
		// //表示在fw對檔案再次寫入時,會在該檔案的結尾續寫,並不會覆蓋掉。

		FileWriter fw1 = new FileWriter(fileName, true);

		fw.write("fileWirter天假");
		fw1.write("----後面追加");
		fw.flush();
		fw1.flush();
		fw.close();
		fw1.close();
	}

	/**
	 * BufferedWriter(緩衝流):位元組輸出緩衝流,將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。
	 * 可以指定緩衝區的大小,或者接受預設的大小。在大多數情況下,預設值就足夠大了。 該類提供了 newLine()
	 * 方法,它使用平臺自己的行分隔符概念,此概念由系統屬性 line.separator
	 * 定義。該類寫入文字的方法就是父類Writer提供的write()系列方法,在這裡我們演示他特有的newLine( )方法。
	 * 
	 * @throws IOException
	 */
	static void BufferedWriter() throws IOException {
		BufferedWriter bw = new java.io.BufferedWriter(new FileWriter(new File("F:\\java\\io\\test\\iiiiii.txt")));

		bw.write("我的哈哈哈哈哈");

		bw.newLine();

		bw.write("換到下一行");

		bw.flush();

		bw.close();
	}

	// copy檔案的幾種方式

	/**
	 * 使用轉換流copy檔案: 在這裡使用了指定編碼方式的物件,一般我們使用平臺預設編碼方式的夠造函式建立物件 
	 * InputStreamReader 與 OutputStreamWriter讀寫
	 * 
	 * @throws IOException
	 */
	static void copy1() throws IOException {
		InputStreamReader reader = new InputStreamReader(
				new FileInputStream(new File("F:\\java\\io\\test\\iiiiii.txt")));

		OutputStreamWriter writer = new java.io.OutputStreamWriter(
				new FileOutputStream(new File("F:\\java\\io\\test\\pppppp.txt")));

		int len = 0;

		// 逐個讀寫
		// while ((len = reader.read()) != -1) {
		// writer.write((char) len);
		// }

		// 緩衝讀寫
		char[] c = new char[1024];
		while ((len = reader.read(c)) != -1) {
			writer.write(c, 0, len);
			writer.flush();
		}

		writer.flush();
		writer.close();
		reader.close();
	}

	/**
	 * 使用關聯原始檔的字元流copy檔案:
	 * 
	 * @throws IOException
	 *             FileReader 與 FileWriter 讀寫
	 * 
	 */
	static void copy2() throws IOException {
		FileReader reader = new FileReader(new File("F:\\java\\io\\test\\iiiiii.txt"));
		FileWriter writer = new FileWriter(new File("F:\\java\\io\\test\\bbbbbbbbb.txt"));

		char[] c = new char[1024];
		int len = 0;

		while ((len = reader.read(c)) != -1) {
			writer.write(c, 0, len);
			writer.flush();
		}
		writer.close();
	}

	/**
	 * 使用緩衝流特定的行方法(readLine(),newLine() )實現檔案的copy
	 * 
	 * @throws IOException
	 */
	static void copy3() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(new File("F:\\java\\io\\test\\iiiiii.txt")));

		BufferedWriter wr = new BufferedWriter(new FileWriter(new File("F:\\java\\io\\test\\mmmmmmmmm.txt")));

		String str = null;
		while ((str = br.readLine()) != null) {
			wr.write(str);
			wr.newLine();
			wr.flush();
		}
		wr.close();
		br.close();
	}

	/**
	 * 位元組緩衝流+原始檔字元流實現檔案copy
	 * 
	 * @throws IOException
	 */
	static void copy4() throws IOException {
		BufferedReader br = new BufferedReader(
				new InputStreamReader(new FileInputStream(new File("F:\\java\\io\\test\\iiiiii.txt"))));

		BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(new FileOutputStream(new File("F:\\java\\io\\test\\hhhhhhhh.txt"))));

		int len = 0;
		char[] c = new char[1024];
		while ((len = br.read(c)) != -1) {
			bw.write(c, 0, len);
			bw.flush();
		}

		bw.close();
		br.close();
	}
}