J-基礎-I/O流-緩衝流、轉換流、序列化流、列印流
技術標籤:java
緩衝流
提高讀寫效率。四個基本的流的增強,分為:
位元組緩衝流:BufferedInputStream,BufferedOutputStream
字元緩衝流:BufferedReader,BufferedWriter
原理:
建立流物件時,建立一個內建的預設大小的緩衝區,通過緩衝區讀寫,減少系統IO次數,提高讀寫效率。
1.位元組緩衝流
構造方法:
public BufferedInputStream(InputStream in):建立一個新的緩衝輸入流。
public BufferedOutputStream(OutputStream out):建立一個新的緩衝輸出流。
import java.io.*; public class Main { public static void main(String[] args){ //普通方法 copy1(); //位元組緩衝流 copy2(); //帶陣列的位元組緩衝流 copy3(); } /*1--普通方法*/ private static void copy1(){ long start = System.currentTimeMillis(); try (FileInputStream fis = new FileInputStream("D:\\測試資料夾\\1\\西遊記.txt"); FileOutputStream fos = new FileOutputStream("D:\\測試資料夾\\1\\西遊記1.txt"); ){ int b; while ((b = fis.read())!=-1){ fos.write(b); } }catch (IOException e){ e.printStackTrace(); } // 記錄結束時間 long end = System.currentTimeMillis(); System.out.println("普通流複製時間:"+(end - start)+" 毫秒"); } /*2--位元組緩衝流*/ private static void copy2() { long start = System.currentTimeMillis(); try (BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\測試資料夾\\1\\西遊記.txt")); BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("D:\\測試資料夾\\1\\西遊記2.txt")); ){ int b; while ((b = fis.read())!=-1){ fos.write(b); } }catch (IOException e){ e.printStackTrace(); } // 記錄結束時間 long end = System.currentTimeMillis(); System.out.println("位元組緩衝流複製時間:"+(end - start)+" 毫秒"); } /*3--帶資料的位元組緩衝流*/ private static void copy3() { long start = System.currentTimeMillis(); try (BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\測試資料夾\\1\\西遊記.txt")); BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("D:\\測試資料夾\\1\\西遊記3.txt")); ){ int b; byte[] bytes = new byte[100]; while ((b = fis.read(bytes))!=-1){ fos.write(bytes,0,b); } }catch (IOException e){ e.printStackTrace(); } // 記錄結束時間 long end = System.currentTimeMillis(); System.out.println("帶陣列的位元組緩衝流複製時間:"+(end - start)+" 毫秒"); } }
2.字元緩衝流
構造方法:
public BufferedReader(Reader in):建立一個閒的緩衝流。
public BufferedWriter(Writer out):建立一個新的緩衝輸出流。
特有方法:
BufferedReader:public String readLine():讀一行文字。
BufferedWriter:public void newLine():寫一行分隔符,由系統屬性定義符號。
特殊方法:
1.BufferedReader:public String readLine():讀一行文字。
2.BufferedWriter:public void newLine():寫一行行分割符,由系統屬性定義符號。
import java.io.*;
public class Main {
public static void main(String[] args){
// //位元組-普通方法
// copy1();
// //位元組-緩衝流
// copy2();
// //帶陣列的位元組-緩衝流
// copy3();
//字元-普通方法
// copy2_1();
// copy2_2();
// copy2_3();
//特殊
//BufferedReader: public String readLine() : 讀一行文字。
//BufferedWriter: public void newLine() : 寫一行行分隔符,由系統屬性定義符號。
readLine();
}
/*2--字元-普通方法*/
private static void copy2_1() {
long start = System.currentTimeMillis();
try (FileReader fr = new FileReader("D:\\測試資料夾\\1\\西遊記.txt");
FileWriter fw = new FileWriter("D:\\測試資料夾\\1\\西遊記4.txt");
){
int b;
while ((b = fr.read())!=-1){
// System.out.println("---"+(char)b);
fw.write(b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
/*2--字元-緩衝流*/
private static void copy2_2() {
long start = System.currentTimeMillis();
try (BufferedReader fr = new BufferedReader(new FileReader("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("D:\\測試資料夾\\1\\西遊記5.txt"));
){
int b;
while ((b = fr.read())!=-1){
// System.out.println("---"+(char)b);
fw.write(b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
/*2--帶陣列的字元-緩衝流*/
private static void copy2_3() {
long start = System.currentTimeMillis();
try (BufferedReader fr = new BufferedReader(new FileReader("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("D:\\測試資料夾\\1\\西遊記6.txt"));
){
int b;
char[] chars = new char[100];
while ((b = fr.read(chars)) != -1){
// System.out.println("---"+new String(chars,0,b));
fw.write(chars,0,b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
/*3--readLine-讀取一行,和一行分割符*/
private static void readLine() {
long start = System.currentTimeMillis();
try (BufferedReader fr = new BufferedReader(new FileReader("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("D:\\測試資料夾\\1\\西遊記7.txt"));
){
String line = null;
while ((line = fr.readLine())!= null){
// System.out.println(line);
fw.write(line);
fw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
}
合
import java.io.*;
public class Main {
public static void main(String[] args){
// //位元組-普通方法
// copy1();
// //位元組-緩衝流
// copy2();
// //帶陣列的位元組-緩衝流
// copy3();
//字元-普通方法
// copy2_1();
// copy2_2();
// copy2_3();
//特殊
//BufferedReader: public String readLine() : 讀一行文字。
//BufferedWriter: public void newLine() : 寫一行行分隔符,由系統屬性定義符號。
readLine();
}
/*1--位元組-普通方法*/
private static void copy1(){
long start = System.currentTimeMillis();
try (FileInputStream fis = new FileInputStream("D:\\測試資料夾\\1\\西遊記.txt");
FileOutputStream fos = new FileOutputStream("D:\\測試資料夾\\1\\西遊記1.txt");
){
int b;
while ((b = fis.read())!=-1){
fos.write(b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
/*2--位元組-緩衝流*/
private static void copy2() {
long start = System.currentTimeMillis();
try (BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("D:\\測試資料夾\\1\\西遊記2.txt"));
){
int b;
while ((b = fis.read())!=-1){
fos.write(b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("位元組緩衝流複製時間:"+(end - start)+" 毫秒");
}
/*3--帶陣列的位元組-緩衝流*/
private static void copy3() {
long start = System.currentTimeMillis();
try (BufferedInputStream fis = new BufferedInputStream(new FileInputStream("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("D:\\測試資料夾\\1\\西遊記3.txt"));
){
int b;
byte[] bytes = new byte[100];
while ((b = fis.read(bytes))!=-1){
fos.write(bytes,0,b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("帶陣列的位元組緩衝流複製時間:"+(end - start)+" 毫秒");
}
/*2--字元-普通方法*/
private static void copy2_1() {
long start = System.currentTimeMillis();
try (FileReader fr = new FileReader("D:\\測試資料夾\\1\\西遊記.txt");
FileWriter fw = new FileWriter("D:\\測試資料夾\\1\\西遊記4.txt");
){
int b;
while ((b = fr.read())!=-1){
// System.out.println("---"+(char)b);
fw.write(b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
/*2--字元-緩衝流*/
private static void copy2_2() {
long start = System.currentTimeMillis();
try (BufferedReader fr = new BufferedReader(new FileReader("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("D:\\測試資料夾\\1\\西遊記5.txt"));
){
int b;
while ((b = fr.read())!=-1){
// System.out.println("---"+(char)b);
fw.write(b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
/*2--帶陣列的字元-緩衝流*/
private static void copy2_3() {
long start = System.currentTimeMillis();
try (BufferedReader fr = new BufferedReader(new FileReader("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("D:\\測試資料夾\\1\\西遊記6.txt"));
){
int b;
char[] chars = new char[100];
while ((b = fr.read(chars)) != -1){
// System.out.println("---"+new String(chars,0,b));
fw.write(chars,0,b);
}
}catch (IOException e){
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
/*3--readLine-讀取一行,和一行分割符*/
private static void readLine() {
long start = System.currentTimeMillis();
try (BufferedReader fr = new BufferedReader(new FileReader("D:\\測試資料夾\\1\\西遊記.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("D:\\測試資料夾\\1\\西遊記7.txt"));
){
String line = null;
while ((line = fr.readLine())!= null){
// System.out.println(line);
fw.write(line);
fw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("普通流複製時間:"+(end - start)+" 毫秒");
}
}
轉換流
字元編碼
編碼:計算機中儲存的資訊都是用二進位制數表示的,而我們在螢幕上看到的數字、英文、標點符號、漢字等字元是二進位制 數轉換之後的結果。按照某種規則,將字元儲存到計算機中,稱為編碼 。
解碼:將儲存在計算機中的二進位制數按照 某種規則解析顯示出來,稱為解碼 。
字元編碼 Character Encoding : 就是一套自然語言的字元與二進位制數之間的對應規則。
字符集
字符集 Charset :也叫編碼表。是一個系統支援的所有字元的集合,包括各國家文字、標點符號、圖形符 號、數字等。
計算機要準確的儲存和識別各種字符集符號,需要進行字元編碼,一套字符集必然至少有一套字元編碼。常見字元 集有ASCII字符集、GBK字符集、Unicode字符集等。
InputStreamReader類
轉換流java.io.InputStreamReader ,是Reader的子類,是從位元組流到字元流的橋樑。它讀取位元組,並使用指定 的字符集將其解碼為字元。它的字符集可以由名稱指定,也可以接受平臺的預設字符集。
構造方法:
InputStreamWriter(InputStream in):建立一個使用預設字符集的字元流。
InputStreamReader(InputStream in,String charsetName):建立一個指定字符集的字元流。
OutputStreamWriter類:
轉換流 java.io.OutputStreamWriter ,是Writer的子類,是從字元流到位元組流的橋樑。使用指定的字符集將字元 編碼為位元組。它的字符集可以由名稱指定,也可以接受平臺的預設字符集。
構造方法:
OutputStreamWriter(OutputStream in):建立一個使用預設字符集的字元流。
OutputStreamWriter(OutputStream in,String charsetName):建立一個指定字符集的字元流。
import java.io.*;
public class Main {
public static void main(String[] args) {
//輸入轉換流
inputStreamReader();
//輸出轉換流
outputStreamWriter();
}
/*輸入轉換流*/
private static void inputStreamReader() {
try (InputStreamReader isr1 = new InputStreamReader(new FileInputStream("D:\\測試資料夾\\1\\ff.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("D:\\測試資料夾\\1\\ff.txt"),"GBK");
){
//UTF-8解碼
int read;
while ((read = isr1.read())!=-1){
System.out.println("UTF-8:"+(char)read);
}
//GBK解碼
int read2;
while ((read2 = isr2.read())!=-1){
System.out.println("GBK:"+(char)read2);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/*輸出轉換流*/
private static void outputStreamWriter() {
try (OutputStreamWriter osr1 = new OutputStreamWriter(new FileOutputStream("D:\\測試資料夾\\1\\轉換流.txt"),"UTF-8");
OutputStreamWriter osr2 = new OutputStreamWriter(new FileOutputStream("D:\\測試資料夾\\1\\轉換流2.txt"),"GBK");
){
String wenzi = "氨基酸困難111111及納稅登記時看的見女浮動反饋等方面都開了個貸款房管局";
//UTF-8解碼
osr1.write(wenzi);
//GBK解碼
osr2.write(wenzi);
} catch (IOException e) {
e.printStackTrace();
}
}
}
序列化
Java 提供了一種物件序列化的機制。用一個位元組序列可以表示一個物件,該位元組序列包含該 物件的資料 、 物件的 型別 和 物件中儲存的屬性 等資訊。位元組序列寫出到檔案之後,相當於檔案中持久儲存了一個物件的資訊。
反之,該位元組序列還可以從檔案中讀取回來,重構物件,對它進行反序列化。 物件的資料 、 物件的型別 和 物件中 儲存的資料 資訊,都可以用來在記憶體中建立物件。看圖理解序列化:
ObjectOutputStream類,序列化
java.io.ObjectOutputStream 類,將Java物件的原始資料型別寫出到檔案,實現物件的持久儲存。
構造方法:
public ObjectOutputStream(OutputStream out):建立一個指定OutputStream的ObjectOutputStream。
條件:
①該類必須實現 java.io.Serializable 介面, Serializable 是一個標記介面,不實現此介面的類將不會使任 何狀態序列化或反序列化,會丟擲 NotSerializableException 。
② 該類的所有屬性必須是可序列化的。如果有一個屬性不需要可序列化的,則該屬性必須註明是瞬態的,使用 transient 關鍵字修飾。
public class Employee implements java.io.Serializable {
}
方法:
public final void writeObject (Object obj)
ObjectInputStream類,反序列化
ObjectInputStream反序列化流,將之前使用ObjectOutputStream序列化的原始資料恢復為物件。
構造方法:
public ObjectInputStream(InputStream in):建立一個指定InputStream的ObjectInputStream。
注:
對於JVM可以反序列化物件,它必須是能夠找到class檔案的類。如果找不到該類的class檔案,則丟擲一個 ClassNotFoundException 異常。
import java.io.*;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
//序列化
xulihua();
//反序列化
fanxuliehua();
}
/*序列化*/
private static void xulihua() {
Stu stu = new Stu("張三","nan",20);
Stu stu2 = new Stu("李四","女",11);
Stu stu3 = new Stu("王五","男",33);
Stu stu4 = new Stu("趙六","女",22);
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\測試資料夾\\1\\序列化.txt"))
){
out.writeObject(stu);
// out.writeObject(stu2);
// out.writeObject(stu3);
// out.writeObject(stu4);
} catch (IOException e) {
e.printStackTrace();
}
}
/*反序列化*/
private static void fanxuliehua() {
// ArrayList<Stu> stuList = null;
Stu stu = null;
try (ObjectInputStream out = new ObjectInputStream(new FileInputStream("D:\\測試資料夾\\1\\序列化.txt"))
){
// ArrayList<Stu> stu = (ArrayList<Stu>) out.readObject();
stu = (Stu) out.readObject();
System.out.println("學生:"+stu);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
PrintStream類 列印流
構造方法:
public PrintStream(String fileName) : 使用指定的檔名建立一個新的列印流。