java.IO字节流和字符流详解
IO流的分類
在學習字節流和字符流之前因該先學習IO流的分類,效果會更好
一種方式是按照流的方向進行分類: 以內存作為參照物,
往內存中去,叫做輸入(Input)。或者叫做讀(Read)。
從內存中出來,叫做輸出(Output)。或者叫做寫(Write)。
有的流是按照字節的方式讀取數據,一次讀取1個字節byte,等同于一次讀取8個二進制位。這種流是萬能的,什么類型的文件都可以讀取。包括:文本文件,圖片,聲音文件,視頻文件等…
假設文件file1.txt,采用字節流的話是這樣讀的:a中國bc張三fe第一次讀:一個字節,正好讀到'a'第二次讀:一個字節,正好讀到'中'字符的一半。第三次讀:一個字節,正好讀到'中'字符的另外一半。有的流是按照字符的方式讀取數據的,一次讀取一個字符,這種流是為了方便讀取普通文本文件而存在的,這種流不能讀取:圖片、聲音、視頻等文件。只能讀取純文本文件,連word文件都無法讀取。假設文件file1.txt,采用字符流的話是這樣讀的:a中國bc張三fe第一次讀:'a'字符('a'字符在windows系統中占用1個字節。)第二次讀:'中'字符('中'字符在windows系統中占用2個字節。)流的分類 : 輸入流、輸出流 字節流、字符流
java的輸入流主要以InputStream和Reader作為基類,而輸出流主要以OutputStream和writer作為基類。(他們都是抽象基類,無法創建)
java IO流這塊有四大家族:
四大家族的首領:
java.io.InputStream 字節輸入流
java.io.OutputStream 字節輸出流
字節流和字符流
字節流的操作單元是——字節
字符流的操作單元是——字符
InputStream和Reader
InputStream和Reader是所有的輸入流的抽象基類,它們本身并不能用來創建實例執行輸入,但是他們都有實現類,用于讀取文件的輸入流:FileInputStream和FileReader.
InputStream接口中的相關方法:
Reader接口中的相關方法:
相應方法的詳解:
分析程序讀取文件的原理:
程序通過調用read()方法每次讀取一個字節或者字符,但是這樣效率太低,也可以通過read(char[]
cbuf)或者read(byte[]
b)的方法來一次讀取多個字節或者字符。當使用數組來讀取文件的時候可以理解為要讀取的文件是一個大缸中的水,而數組是一個瓢一次最多只能讀取
數組.lengt的字節或者字符,所以需要通過循環連續取水,直到最后,當文件全部去除的時候read()方法會返回-1,即表明輸入流結束,這個可以用來判斷文件是否全部取出的標志。
注解:因為異常繼承了AutoClousable接口或者是Closeable接口,所以可以使用java9新增強的資源自動回收機制。
創建一個新的String對象將數組中的字節轉換成默認色字符集:
OuterputStream和Writer
OutputStream和wirter是所有的輸入流的抽象基類,它們本身并不能用來創建實例執行輸入,但是他們都有實現類,用于讀取文件的輸入流:FileOutputStream和FileWriter.
eg:實現文件的輸入和輸出
public class FileOutputStreamTest {public static void main(String[] args) throws FileNotFoundException {//創建字節輸入流FileInputStream fileinput=new FileInputStream("C:\\java File\\undefined\\src\\網課\\IO\\FileOutputStreamTest.java");//創建字節輸出流FileOutputStream fileoutput= new FileOutputStream("F:\\MySQL\\test.java");try(fileinput;fileoutput){byte[] by=new byte[1024*1024];int hasNext=0;while((hasNext=fileinput.read(by))!=-1){//一邊讀取一邊寫入fileoutput.write(by,0,hasNext);}} catch (IOException e) {e.printStackTrace();}} }運行程序可以看到在相應的文件夾下面多了一個文件,
注意:
使用java的IO流執行的時候,不要忘記關閉輸出流,關閉輸出流可以保證流的物理資源被回收,還可以將輸出流緩沖其中的數據flush()到物理節點里,(因為程序會在執行Close()方法之前自動的執行輸出流中的flush()方法)。
public class text05 {public static void main(String[] args) {FileOutputStream fos=null;try {fos=new FileOutputStream("F:\\text.TXT");byte[] by=new byte[]{35,24,5,44,45,51,5};//如果當前寫盤的路徑不存在,系統會自動新建//這種方式會將源文件先清空在重新寫入;fos.write(by);//寫完之后一定要刷新文件fos.flush();//以追加的方式寫入文件fos=new FileOutputStream("F:\\text.TXT",true);fos.write(by);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally{}} }如果希望直接輸出字符則選用文件字符輸出流效果更好;
eg: public class FireWritertest {public static void main(String[] args) throws IOException {FileWriter filewriter =new FileWriter("F:\\MySQL\\FireWriter.java",true);try(filewriter){filewriter.write("日出而作,日入而息。");filewriter.write(" 鑿井而飲,耕田而食。");filewriter.write("帝力于我何有哉!");}} } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java.IO字节流和字符流详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java线程的创建和启动深度解析
- 下一篇: MYSQL储存过程和储存函数和变量