JAVA_IO流四大家族(2)
JAVA_IO流四大家族體系:
JAVA_IO流四大家族(1)
JAVA_IO流四大家族(2)
文章目錄
- JAVA_IO流四大家族體系:
- JAVA_IO流四大家族(1)
- JAVA_IO流四大家族(2)
- FileReader
- 實現代碼
- 查看一下讀取出來的每個字符輸出:
- FileWriter
- 直接寫入字符串:
- FileReader和FileWriter實現普通文本文件拷貝
- 執行前:
- 執行后:
- BufferedReader
- 第一種(直接塞入字符流,不需轉換)
- 簡介
- 構造方法
- 代碼
- 常識普及
- 注意點:
- 第二種(塞入一個字節流,經過轉換成為字符流)
- 細看構造函數
- 轉換問題
- 解決轉換問題
- 實現代碼
- 轉換代碼合并
- 注意
- BufferedWriter
- 第一種(直接塞入字符流,不需轉換)
- 第二種(塞入一個字節流,經過轉換成為字符流)
- DataOutputStream
- 簡介
- 實現代碼
- DataInputStream
- 簡介
- 注意
- 讀取代碼
- PrintStream
- 輸出控制臺如何實現的呢?
- 注意:
- 改變標準輸出流的輸出方向
- 如何寫一個日志
這里主要跟FileInputStream和FileOutputStream用法一樣,這里就不在多多贅述,詳情請看 JAVA_IO流四大家族,直接上代碼
FileReader
實現代碼
package FileReader;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class FileReaderTest01 {public static void main(String[] args) {FileReader reader=null;try {//創建文件reader=new FileReader("src//tempfile");//開始讀char [] chars=new char[4];//一次性讀取4個字符int readCount=0;while((readCount=reader.read(chars))!=-1){System.out.print(new String(chars,0,readCount));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(reader!=null){try {reader.close();} catch (IOException e) {e.printStackTrace();}}}} }查看一下讀取出來的每個字符輸出:
package FileReader;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class FileReaderTest01 {public static void main(String[] args) {FileReader reader=null;try {//創建文件reader=new FileReader("src//tempfile");//準備一個char數組char [] chars=new char[4];//往char數組中讀取reader.read(chars);for(char c:chars){System.out.println(c);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(reader!=null){try {reader.close();} catch (IOException e) {e.printStackTrace();}}}} }FileWriter
FileWriter: 文件字符輸出流,寫只能輸出普通文本
package FileWriter;import java.io.FileWriter; import java.io.IOException;public class FileWriterTest {public static void main(String[] args) {FileWriter out=null;try {out=new FileWriter("src//tempfile");//開始寫char[]chars={'中','國','最','棒'};out.write(chars);//刷新out.flush();} catch (IOException e) {e.printStackTrace();}finally {if(out!=null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}} }直接寫入字符串:
package FileWriter;import java.io.FileWriter; import java.io.IOException;/* * FileWriter: * 文件字符輸出流,寫 * 只能輸出普通文本 * */ public class FileWriterTest {public static void main(String[] args) {FileWriter out=null;try {out=new FileWriter("src//tempfile");//開始寫out.write("我是一名大學生,沖沖沖");//刷新out.flush();} catch (IOException e) {e.printStackTrace();}finally {if(out!=null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}} }
換行:
FileReader和FileWriter只能沒辦法讀聲音,圖片,視頻等這些流媒體文件,只能讀普通文本,切記:Word不是普通文本
FileReader和FileWriter實現普通文本文件拷貝
java文件是普通文本文件(能用記事本編輯的都是普通文本文件),普通文本文件和后綴無關
package Filecopy01;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class copy02 {public static void main(String[] args) {FileReader in=null;FileWriter out=null;try {in=new FileReader("src//tempfile");out=new FileWriter("tempfile");//一邊讀一邊寫:char []chars=new char[1024*512];//1MBint readCount=0;while((readCount=in.read(chars))!=-1){out.write(chars,0,readCount);}//刷新out.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(in!=null){try {in.close();} catch (IOException e) {e.printStackTrace();}}if(out!=null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}} }執行前:
執行后:
BufferedReader
第一種(直接塞入字符流,不需轉換)
簡介
BufferedReader:
帶有緩沖區的字符輸入流,使用這個流的時候不需要自定義char數組,或者說不需要自定義byte數組。自帶緩沖區
構造方法
代碼
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader;public class BufferedReaderTest01 {public static void main(String[] args) throws Exception {FileReader reader=new FileReader("src//Filecopy01//copy02.java");BufferedReader br=new BufferedReader(reader);//讀一行String line=null;while((line=br.readLine())!=null){//當讀到最后一行的下一行時,返回值為null(即讀不到數據就返回為null)System.out.println(line);//記住,讀出來的時候,并沒有把換行符讀取出來}br.close();//關閉流//對于包裝流來說,只需要關閉最外層流就行,里面的節點流會自動關閉(可以自己看源代碼)} } BufferedReader br=new BufferedReader(reader);這個reader被bufferedReader當做一個成員變量
注意:因為Reader是一個抽象類,沒辦法實例化,所以只能挑選繼承了Reader 的類來進行實例化
對于包裝流來說,只需要關閉最外層流就行,里面的節點流會自動關閉(可以自己看下圖)
常識普及
當一個流的構造方法中需要一個流的時候,這個被傳進來的流叫做:節點流,外部負責包裝的這個流,叫做包裝流,還有一個名字叫做處理流,像當前這個程序來說:FileReader就是一個節點流,BufferedReader就是包裝流/處理流。
注意點:
第二種(塞入一個字節流,經過轉換成為字符流)
細看構造函數
轉換問題
這個構造函數只能傳入一個字符流,如果要想傳入一個字節流的話,那么有沒有辦法呢?看下圖:
解決轉換問題
通過轉換流轉換,把inputStream字節流轉換為字符流
FileInputStream in=new FileInputStream("src//Filecopy01//Copy01.java");InputStreamReader reader=new InputStreamReader(in);InputStreamReader將字節流轉換成字符流
BufferedReader br=new BufferedReader(reader);實現代碼
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader;public class BufferedReaderTest02 {public static void main(String[] args) throws Exception {//字節流FileInputStream in=new FileInputStream("src//Filecopy01//Copy01.java");//通過轉換流轉換(InputStreamReader將字節流轉換成字符流)//in是節點流,reader是包裝流InputStreamReader reader=new InputStreamReader(in);BufferedReader br=new BufferedReader(reader);String line=null;while((line=br.readLine())!=null){System.out.println(line);}//關閉最外層br.close();} }轉換代碼合并
BufferedReader br1=new BufferedReader(new InputStreamReader(new FileInputStream("src//Filecopy01//Copy01.java"))) ;注意
關閉流時,只需要關閉最外層即可
//關閉最外層br.close();BufferedWriter
第一種(直接塞入字符流,不需轉換)
import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.OutputStreamWriter;public class BufferedWriterTest01 {public static void main(String[] args)throws Exception {BufferedWriter out=new BufferedWriter(new FileWriter("copy",true));out.write("hello world");out.write("\n");out.write("hello kitty");//刷新out.flush();//關閉最外層out.close();} }第二種(塞入一個字節流,經過轉換成為字符流)
import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.OutputStreamWriter;public class BufferedWriterTest01 {public static void main(String[] args)throws Exception {BufferedWriter out=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("copy",true)));out.write("hello world");out.write("\n");out.write("hello kitty");//刷新out.flush();//關閉最外層out.close();} }DataOutputStream
簡介
java.io.DataOutputStream:數據專屬的流, 這個流可以將數據連同數據的類型一并寫入文件, 注意:這個文件不是普通文本文檔(用記事本打不開)
需要傳入一個OutputStream,OutputStream是一個抽象類,我們沒法new,只能去找繼承它的子類,可以new一個FileOutputStream("data");
實現代碼
import java.io.DataOutputStream; import java.io.FileOutputStream;public class DataOutputStreamTest {public static void main(String[] args)throws Exception {DataOutputStream dos=new DataOutputStream(new FileOutputStream("data"));//寫數據byte b=100;short s=200;int i=300;long l=400L;float f=3.0f;double d=3.14;boolean sex=false;char a='e';dos.writeByte(b);//把數據以及數據的類型一并寫入文件當中dos.writeShort(s);dos.writeInt(i);dos.writeLong(l);dos.writeFloat(f);dos.writeDouble(d);dos.writeBoolean(sex);dos.writeChar(a);//刷新dos.flush();//關閉dos.close();} }
用記事本打開之后,顯示如下
印證了:這個文件不是普通文本文檔(用記事本打不開) ,讀取出來的話,需要借助DataInputStream
DataInputStream
簡介
java.io.DataOutputStream:數據專屬的流,這個流可以將數據連同數據的類型一并寫入文件,注意:這個文件不是普通文本文檔(用記事本打不開)
注意
使用DataInputStream時,DataOutputStream這個流的存儲順序必須已知,否則沒法讀取,存儲順序如下:
dos.writeByte(b);//把數據以及數據的類型一并寫入文件當中dos.writeShort(s);dos.writeInt(i);dos.writeLong(l);dos.writeFloat(f);dos.writeDouble(d);dos.writeBoolean(sex);dos.writeChar(a);讀取代碼
import java.io.DataInputStream; import java.io.FileInputStream;public class DataInputStreamTest01 {public static void main(String[] args)throws Exception {DataInputStream dis=new DataInputStream(new FileInputStream("data"));//開始讀byte b=dis.readByte();short s=dis.readShort();int i=dis.readInt();long l=dis.readLong();float f=dis.readFloat();double d=dis.readDouble();boolean sex=dis.readBoolean();char a=dis.readChar();dis.close();System.out.println(b);System.out.println(s);System.out.println(i);System.out.println(l);System.out.println(f);System.out.println(d);System.out.println(sex);System.out.println(a);} }PrintStream
輸出控制臺如何實現的呢?
聯合寫:
System.out.println("hello biaobiao");分開寫:
PrintStream ps=System.out;ps.println("hello liu");ps.println("hello world");注意:
標準輸出流不需要手動close
改變標準輸出流的輸出方向
import java.io.FileOutputStream; import java.io.PrintStream;public class PrintStreamTest01 {public static void main(String[] args)throws Exception {//標準輸出流不再指向控制臺,指向“log”文件PrintStream psm=new PrintStream(new FileOutputStream("log"));//修改輸出方向,將輸出方向修改到log文件System.setOut(psm);//再輸出System.out.println("hello world66666666");} }如何寫一個日志
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date;public class LogUtil {public static void log(String msg){ /* * 記錄日志的方法 * */try {//指向一個日志文件PrintStream out =new PrintStream(new FileOutputStream("log.txt",true));//改變輸出方向System.setOut(out);//日期當前時間Date nowTime=new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");String strTime=sdf.format(nowTime);System.out.println(strTime+":"+msg);} catch (FileNotFoundException e) {e.printStackTrace();}} }main方法:
public class LogTest {public static void main(String[] args) {//測試工具類是否好用LogUtil.log("調用了System類的gc()方法,建議啟動垃圾回收");LogUtil.log("調用了UserService的dosome()方法");LogUtil.log("用戶嘗試進行登錄,驗證失敗");} }總結
以上是生活随笔為你收集整理的JAVA_IO流四大家族(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FileInputStream和File
- 下一篇: JAVASE——File类