公眾號文章匯總
809
2025-04-01
緩沖流
緩沖流概述
緩沖流也稱為高效流、或者高級流。之前學習的字節(jié)流可以稱為原始流。
作用:緩沖流自帶緩沖區(qū)、可以提高原始字節(jié)流、字符流讀寫數(shù)據(jù)的性能
緩沖流自帶緩沖區(qū)、可以提高原始字節(jié)流、字符流讀寫數(shù)據(jù)的性能
字節(jié)緩沖流
字節(jié)緩沖流自帶8KB緩沖區(qū),可以提高原始字節(jié)流、字符流讀寫數(shù)據(jù)的性能
字節(jié)緩沖輸入流:BufferedInputStream,提高字節(jié)輸入流讀取數(shù)據(jù)的性能,讀寫功能上并無變化。
字節(jié)緩沖輸出流:BufferedOutputStream,提高字節(jié)輸出流讀取數(shù)據(jù)的性能,讀寫功能上并無變化。
構造器
說明
public?BufferedInputStream (InputStream?is)
可以把低級的字節(jié)輸入流包裝成一個高級的緩沖字節(jié)輸入流管道,從而提高字節(jié)輸入流讀數(shù)據(jù)的性能
public?BufferedOutputStream(OutputStream?os)
可以把低級的字節(jié)輸出流包裝成一個高級的緩沖字節(jié)輸出流,從而提高寫數(shù)據(jù)的性能
建議使用字節(jié)緩沖輸入流、字節(jié)緩沖輸出流,結(jié)合字節(jié)數(shù)組的方式,目前來看是性能最優(yōu)的組合。
public class BufferInputTest1 { public static void main(String[] args) { try { InputStream is = new FileInputStream("D:\test\outputTest.txt"); BufferedInputStream bis = new BufferedInputStream(is); OutputStream os = new FileOutputStream("D:\test\outputTest3.txt"); OutputStream bos = new BufferedOutputStream(os); } catch (Exception e) { e.printStackTrace(); } } }
字符緩沖流
字符緩沖流自帶8K緩沖區(qū) 可以提高原始字符流讀寫數(shù)據(jù)的性能
字符緩沖輸入流:BufferedReader,性能提升了,多了readLine()按照行讀取的功能
作用:提高字符輸入流讀取數(shù)據(jù)的性能,除此之外多了按照行讀取數(shù)據(jù)的功能。
字符緩沖輸出流:BufferedWriter,? 性能提升了,多了newLine()換行的功能
作用:提高字符輸出流寫取數(shù)據(jù)的性能,除此之外多了換行功能
構造器
說明
public?BufferedReader(Reader?r)
可以把低級的字符輸入流包裝成一個高級的緩沖字符輸入流管道,從而提高字符輸入流讀數(shù)據(jù)的性能
public?BufferedWriter (Writer?w)
可以把低級的字符輸出流包裝成一個高級的緩沖字符輸出流管道,從而提高字符輸出流寫數(shù)據(jù)的性能
import java.io.*; public class BufferReaderTest2 { public static void main(String[] args) { //1.創(chuàng)建一個字符輸入流管道與文件接通 try (Reader f = new FileReader("D:\test\outputTest.txt"); //包裝包裝成一個高級的緩沖字符輸入流管道 BufferedReader bf = new BufferedReader(f); ){ String s; while ((s = bf.readLine()) != null) System.out.println(s); } catch (Exception e) { e.printStackTrace(); } } }
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.Writer; public class BufferWriterTest3 { public static void main(String[] args) { //1.創(chuàng)建一個字符輸出流管道與目標接通 // 覆蓋管道,每次啟動都會清空文件之前的數(shù)據(jù) true---追加數(shù)據(jù),不覆蓋 try (Writer f = new FileWriter("D:\test\outputTest3.txt", true); //包裝 BufferedWriter bf = new BufferedWriter(f); ){ bf.write("我愛中國!"); bf.newLine(); //換行操作 bf.write("我愛中國!!"); bf.newLine(); bf.write("我愛中國!!!"); bf.newLine(); } catch (Exception e) { e.printStackTrace(); } } }
轉(zhuǎn)換流
可以解決亂碼問題
使用字符輸入轉(zhuǎn)換流
可以提取文件(GBK)的原始字節(jié)流,原始字節(jié)不會存在問題。
然后把字節(jié)流以指定編碼轉(zhuǎn)換成字符輸入流,這樣字符輸入流中的字符就不亂碼了
import java.io.*; public class InputS { public static void main(String[] args) { //代碼是utf-8格式-----讀取其他格式會亂碼 File f = new File("D:\test\Read-GBK.txt"); try (BufferedReader br = new BufferedReader(new FileReader(f)) ) { String line; while ((line = br.readLine()) != null) System.out.println(line); } catch (Exception e) { e.printStackTrace(); } } }
字符輸入轉(zhuǎn)換流
字符輸入轉(zhuǎn)換流:InputStreamReader,可以把原始的字節(jié)流按照指定編碼轉(zhuǎn)換成字符輸入流。
public?InputStreamReader(InputStream?is)
可以把原始的字節(jié)流按照代碼默認編碼轉(zhuǎn)換成字符輸入流。幾乎不用,與默認的FileReader一樣。
public?InputStreamReader(InputStream?is?,String?charset)
可以把原始的字節(jié)流按照指定編碼轉(zhuǎn)換成字符輸入流,這樣字符流中的字符就不亂碼了
import java.io.*; public class InputS2 { public static void main(String[] args) { //代碼是utf-8格式-----讀取其他格式會亂碼 //使用字符輸入轉(zhuǎn)換流解決亂碼問題 File f = new File("D:\test\Read-GBK.txt"); try (InputStream is = new FileInputStream(f); Reader isr = new InputStreamReader(is, "GBK"); BufferedReader br = new BufferedReader(isr) ) { String line; while ((line = br.readLine()) != null) System.out.println(line); } catch (Exception e) { e.printStackTrace(); } } }
字符輸出轉(zhuǎn)換流
字符輸出轉(zhuǎn)換流:OutputStreamWriter,可以把字節(jié)輸出流按照指定編碼轉(zhuǎn)換成字符輸出流
可以把字符以指定編碼獲取字節(jié)后再使用字節(jié)輸出流寫出去: “我愛你中國”.getBytes(編碼)
也可以使用字符輸出轉(zhuǎn)換流實現(xiàn)。
public?OutputStreamWriter(OutputStream?os)
可以把原始的字節(jié)輸出流按照代碼默認編碼轉(zhuǎn)換成字符輸出流。幾乎不用。
public?OutputStreamWriter(OutputStream?os,String?charset)
可以把原始的字節(jié)輸出流按照指定編碼轉(zhuǎn)換成字符輸出流
import java.io.*; public class OutputS3 { public static void main(String[] args) throws Exception { //字節(jié)輸出流 OutputStream os = new FileOutputStream("D:\test\Read-GBK.txt", true); //以設定格式寫入 Writer osw = new OutputStreamWriter(os, "GBK"); //包裝成高級的字符緩沖流 BufferedWriter bw = new BufferedWriter(osw); bw.write("中國我愛你!!!"); bw.close(); } }
序列化對象
對象序列化
作用:以內(nèi)存為基準,把內(nèi)存中的對象存儲到磁盤文件中去,稱為對象序列化。對象必須實現(xiàn)序列化接口
對象序列化: 使用到的流是對象字節(jié)輸出流:ObjectOutputStream
構造器
說明
public?ObjectOutputStream(OutputStream?out)
把低級字節(jié)輸出流包裝成高級的對象字節(jié)輸出流
方法名稱
說明
public?final?void?writeObject(Object?obj)
把對象寫出去到對象序列化流的文件中去
import java.io.Serializable; //對象要序列化,必須要實現(xiàn)Serializable接口 public class People implements Serializable { private static final long serialVersionUID = 1; //聲明序列化的版本號 private String name; private int age; // private transient int passwd; //transient修飾的變量不參與序列化 public People(String name, int age) { this.name = name; this.age = age; } public People(){ } 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; } @Override public String toString() { return "People{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class ObjectOutputS { public static void main(String[] args) throws Exception { People p = new People("小明", 20); //對象序列化 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\test\outputTest4.txt")); //調(diào)用序列化方法 oos.writeObject(p); //資源釋放 oos.close(); } }
對象反序列化
作用:以內(nèi)存為基準,把存儲到磁盤文件中去的對象數(shù)據(jù)恢復成內(nèi)存中的對象,稱為對象反序列化。
使用到的流是對象字節(jié)輸入流:ObjectInputStream
構造器
說明
public?ObjectInputStream(InputStream?out)
把低級字節(jié)輸如流包裝成高級的對象字節(jié)輸入流
方法名稱
說明
public?Object?readObject()
把存儲到磁盤文件中去的對象數(shù)據(jù)恢復成內(nèi)存中的對象返回
import java.io.FileInputStream; import java.io.ObjectInput; import java.io.ObjectInputStream; public class ObjectInputS2 { public static void main(String[] args) throws Exception { //1.創(chuàng)建對象字節(jié)輸入流 ObjectInput is = new ObjectInputStream(new FileInputStream("D:\test\outputTest4.txt")); //2.使用對象字節(jié)輸入流的反對象序列化 People p = (People) is.readObject(); is.close(); System.out.println(p); } }
打印流
PrintStream、PrintWriter
作用:打印流可以實現(xiàn)方便、高效的打印數(shù)據(jù)到文件中去。兩者在打印功能上都是使用方便,性能高效(核心優(yōu)勢)
打印流一般是指:PrintStream,PrintWriter兩個類。
PrintStream繼承自字節(jié)輸出流OutputStream,支持寫字節(jié)
PrintWrite繼承自字符輸出流Writer,支持寫字符
可以實現(xiàn)打印什么數(shù)據(jù)就是什么數(shù)據(jù),例如打印整數(shù)97寫出去就是97,打印boolean的true,寫出去就是true。
構造器
說明
public?PrintStream(OutputStream?os)
打印流直接通向字節(jié)輸出流管道
public?PrintStream(File??f)
打印流直接通向文件對象
public?PrintStream(String?filepath)
打印流直接通向文件路徑
方法
說明
public?void?print(Xxx?xx)
打印任意類型的數(shù)據(jù)出去
import java.io.PrintStream; public class PrintS { public static void main(String[] args) throws Exception { //1.創(chuàng)建一個打印流對象 PrintStream ps = new PrintStream("D:\\test\\outputTest5.txt"); ps.println(111); ps.println("aaaaa"); ps.println("看到這句話的都是大哥"); ps.close(); } }
輸出語句的重定向
屬于打印流的一種應用,可以把輸出語句的打印位置改到文件
PrintStream ps = new PrintStream("文件地址"); System.setOut(ps);
import java.io.PrintStream; public class PrintS2 { public static void main(String[] args) throws Exception { PrintStream ps = new PrintStream("D:\\test\\outputTest6.txt"); System.setOut(ps); System.out.println("你好!!"); System.out.println("我是xxx!!"); System.out.println("啦啦啦啦!!"); System.out.println("啦啦啦!!"); System.out.println("啦啦!!"); ps.close(); } }
在此頁面也可查看
https://blog.csdn.net/weixin_57780057/article/details/124571294?spm=1001.2014.3001.5501
Java
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。