JavaIO流的使用(筆記詳解)

一、IO流概述及體系

  • IO流用來處理設備之間的數據傳輸。
  • Java對數據的操作是通過流(系統資源)的方式。
  • Java用於操作流的對象都在Java.io包中。
  • 流按照操作數據分爲兩種:字節流,字符流。
  • 流按照流向分爲:輸入流,輸出流。
    在這裏插入圖片描述

二、Java字符流的使用

關於緩衝區:

  • 緩衝區,提高了對數據的讀寫效率。
  • 對應類:BufferedWriter和BufferedReader。
  • 緩衝區要結合流纔可以使用,在流的基礎上對流的功能進行了增強。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 使用帶緩衝區的字符流實現文件copy
 *
 */
public class Demo {
	public static void main(String[] args) {
		BufferedReader source = null;
		BufferedWriter target = null;
		try {
			// new用讀取流緩衝(new建立讀取流對象(new建立源文件對象))
			source = new BufferedReader(new FileReader(new File("D:\\Demo1\\a.txt")));
			// new用寫入流緩衝(new建立寫入流對象(new建立目標文件對象)
			target = new BufferedWriter(new FileWriter(new File("D:\\Demo2\\b.txt")));
			String line = null;
			while ((line = source.readLine()) != null) {
				target.write(line);
				target.newLine();
				target.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (source != null) {
					source.close();
				}
			} catch (IOException e) {
				throw new RuntimeException("讀取流關閉出問題了.");
			}

			try {
				if (target != null) {
					target.close();
				}
			} catch (IOException e) {
				throw new RuntimeException("寫入流關閉出問題了.");
			}
		}
	}
}

三、Java字節流的使用

在這裏插入圖片描述

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用帶緩衝區的字節流實現文件copy
 *
 */
public class Demo {

	public static void main(String[] args) throws IOException {
		BufferedInputStream souce = null;
		BufferedOutputStream target = null;
		try {
			souce = new BufferedInputStream(new FileInputStream("D:\\Demo1\\a.txt"));
			target = new BufferedOutputStream(new FileOutputStream("D:\\Demo2\\b.txt"));

			byte[] b = new byte[1024];
			int len = 0;
			while ((len = souce.read(b)) != -1) {
				target.write(b, 0, len);
				target.flush();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (souce != null) {
				souce.close();
			}
			if (target != null) {
				target.close();
			}
		}
	}
}

四、Java轉換流的使用

爲什麼要有轉換流?

  • InputStreamReader和OutputStreamWriter,方便字符流與字節流之間的操作,是字符流與字節流之間的橋樑。
  • 應用:當字節流中的數據都是字符時,轉換成字符流操作更高效。
    在這裏插入圖片描述
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 使用帶緩衝區的轉換流實現文件copy
 *
 */
public class Demo {
	public static void main(String[] args) throws IOException {
		BufferedReader source = null;
		BufferedWriter target = null;
		try {
//			source = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\Demo1\\a.txt")));
			source = new BufferedReader(new FileReader("D:\\Demo1\\a.txt"));
//			target = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\Demo2\\b.txt"), "utf-8"));
			target = new BufferedWriter(new FileWriter("D:\\Demo2\\b.txt"));

			String line = null;
			while ((line = source.readLine()) != null) {
				target.write(line);
				target.newLine();
				target.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (source != null) {
				source.close();
			}
			if (target != null) {
				target.close();
			}
		}
	}
}

五、標準輸入輸出流的使用

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

/**
 * 使用標準輸入輸出流進行輸入輸出
 *
 */
public class 標準輸入輸入流 {
	public static void main(String[] args) throws IOException {
		// InputStream in = System.in;
		// PrintStream out = System.out;
		BufferedReader source = null;
		BufferedWriter target = null;

		try {
			source = new BufferedReader(new InputStreamReader(System.in));
			target = new BufferedWriter(new OutputStreamWriter(System.out));
			String line = null;
			while ((line = source.readLine()) != null) {
				if ("over".equals(line)) {
					break;
				}
				target.write(line.toUpperCase());// 讀取的同時將小寫字母轉換爲大寫
				target.newLine();
				target.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (source != null) {
				source.close();
			}
			if (target != null) {
				target.close();
			}
		}
	}
}

六、打印流的使用

  • printWriter和printStream分別是字符打印流和字節打印流,可以直接操作輸入流和文件。
  • printStream爲其它輸出流添加了功能,使它們能夠方便的打印各種數據值表示形式。
	/**
	 * 字節打印流測試
	 */
	@Test
	public void test1() throws IOException {
		PrintStream ps = new PrintStream("a.txt");
		ps.write(97);// write方法自動轉化爲a
		ps.print(97);// print方法原樣輸出
		ps.flush();
		ps.close();
	}
	/**
	 * 字符打印流測試
	 * 
	 */
	@Test
	public void test2() throws IOException {
		PrintStream out = System.out;
		PrintWriter pw = new PrintWriter(out);
		pw.print('a');
		pw.flush();
		pw.close();
	}

七、對象流的使用

如何使用對象流?

  • 被操作的對象需要實現Serializable(標記接口),儘量顯示生成序列號(版本號)。
  • 將內存彙總的對象寫入磁盤,從而進行持久化操作。(即序列化過程)
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 org.junit.Test;

public class 對象流 {

	/**
	 * 序列化過程 將內存中的對象寫入磁盤
	 * 
	 * @throws IOException
	 */
	@Test
	public void test1() throws IOException {
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c.txt"));
		out.writeObject(new Person("zs", 20));
		out.flush();
		out.close();
	}

	/**
	 * 反序列化過程 將磁盤中的對象讀出到內存
	 * 
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	@Test
	public void test2() throws IOException, ClassNotFoundException {
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("c.txt"));
		Object readObject = in.readObject();
		Person p = (Person) readObject;
		System.out.println(p.getName());
		in.close();
	}

}

// Person類實現Serializable接口
class Person implements Serializable {
	String name;
	int age;

	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

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