Java 字符流 位元組流
1. 首先我們先來了解一個概念什么是io流
流是一種抽象概念,他代表了資料的無結構化傳遞,按照流的方式進行輸入輸出,資料被當成無結構的位元組序或字符序列,從流中取得資料的操作稱為提取操作,而從流中添加資料的操作稱為插入操作,用來進行輸入輸出操作的流稱為lo流,換句話說,io就是以流的方式經行輸入輸出

就拿我們生活中的自來水廠舉例,我們每個人家里喝的水都是自來水廠來的,自來水廠又是通過水源地來的
水是通過水管來的
那么這個水就可以理解為io流
Java中的IO操作主要是指使用java.io包下的內容進行輸入輸出操作,輸入也叫讀取資料,輸出也叫寫出資料
1.1 IO的分類
按照資料的流向分類:輸入流與輸出流
輸出流:把資料從其他設備讀取到記憶體中的流
輸出流:把資料從記憶體中寫出到其他設備上的流
格式資料的型別分:字符流和位元組流
位元組流:以位元組為單位,讀取資料的流
字符流:以字符為單位,讀取資料的流

1.2 IO流向說明圖

1.3下面我們來看看他們的頂級父類們

2.位元組流
java.io.OutputStream抽象類是表示位元組輸出流的所有超類,將指定的位元組資訊輸出到目的地,他定義了位元組輸出流的基本共性功能方法
public void close :關閉此輸出流并釋放與此流關聯的任何資源系統
public void flush() :重繪此輸出流并強制任何緩沖的輸出位元組被寫出,
public void write(byte[] b) :將 b.length位元組從指定的位元組陣列寫入此輸出流,
public void write(byte[] b, int off, int len) :從指定的位元組陣列寫入 len位元組,從偏移量 off開始輸 出到此輸出流,
public abstract void write(int b) :將指定的位元組輸出流,
當完成流的操作時,必須呼叫close()方法,釋放系統資源
2.3 FileOutputStream類
outputStream類有很多子類,我們先來介紹java.io.Fileoutputstream類是檔案輸出流,用于將資料寫到檔案
構造方法:
public FileoutputStream(File file):創建檔案輸出流寫入指定 的File物件表示的檔案
public FileOutputStream(String name) : 創建檔案輸出流以指定的名稱寫入檔案,
當你創建一個流物件時,必須傳入一個檔案路徑,該路徑下,如果沒有這個檔案,會創建該檔案,如果有這個檔案,會清空這個檔案的資料
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("a.text");
String str="程式員";
//轉換為位元組陣列
byte[] bytes = str.getBytes();
fileOutputStream.write(97);
//以陣列方式寫入
fileOutputStream.write(bytes);
fileOutputStream.close();
}
}
如果不想覆寫原檔案,想在原檔案的基礎上繼續寫,則可以用以下方法
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("a.text",true);
String str="這是續寫的內容";
//轉換為位元組陣列
byte[] bytes = str.getBytes();
//以陣列方式寫入
fileOutputStream.write("\r\n".getBytes());
fileOutputStream.write(bytes);
fileOutputStream.close();
}
}
結果

寫出換行
在windows系統中換行是\r\n
fileOutputStream.write("\r\n".getBytes());
回車符 \r 和換行符 \n :
回車符:回到一行的開頭(return),
換行符:下一行(newline),
系統中的換行:
Windows系統里,每行結尾是 回車+換行 ,即 \r\n ;
Unix系統里,每行結尾只有 換行 ,即 \n ;
Mac系統里,每行結尾是 回車 ,即 \r ,
從 Mac OS X開始與Linux統一,
位元組輸入流InputStream
java.io.InputStream抽象類表示位元組輸入流是所有類的超類,可以讀取位元組資訊到記憶體中,他定義了位元組輸入流的基本共性功能方法
public void close() 關閉此輸出流并釋放與此輸出流相關聯的任何資源系統
public abstract int read() : 從輸入流讀取資料的下一個位元組,
public int read(byte[] b) : 從輸入流中讀取一些位元組數,并將它們存盤到位元組陣列 b中 ,
java.io.FileInputStream 類是檔案輸入流,從檔案中讀取位元組,
構造方法
FileInputStream(File file) : 通過打開與實際檔案的連接來創建一個 FileInputStream ,該檔案由檔案系 統中的 File物件 file命名,
FileInputStream(String name) : 通過打開與實際檔案的連接來創建一個 FileInputStream ,該檔案由檔案 系統中的路徑名 name命名, 當你創建一個流物件時,必須傳入一個檔案路徑,該路徑下,如果沒有該檔案,會拋出 FileNotFoundException ,
構造代碼舉例
讀取a.text下的內容

package File;
import java.io.FileInputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("a.text");
byte[] bytes = new byte[1024];
int len;
while((len=fileInputStream.read(bytes))!=-1){
System.out.println(new String(bytes));
}
}
}
結果

使用一個一個位元組讀取的情況,使用位元組流無法讀取中文的檔案,會出現亂碼,所以我用英文演示
package File;
import java.io.FileInputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("a.text");
int len;
int read ;
while((read=fileInputStream.read())!=-1){
System.out.println((char)read);
}
}
}
結果

使用陣列讀取減少了io運算元,大大提高了讀寫的效率,建議開發中使用
字符流
3.字符輸入流
java.io.Reader 抽象類是表示用于讀取字符流的所有類的超類,可以讀取字符資訊到記憶體中,它定義了字符輸入 流的基本共性功能方法,
public void close() :關閉此流并釋放與此流相關聯的任何系統資源,
public int read() : 從輸入流讀取一個字符,
public int read(char[] cbuf) : 從輸入流中讀取一些字符,并將它們存盤到字符陣列 cbuf中 ,
3.1FileReader類
java.io.FileReader 類是讀取字符檔案的便利類,構造時使用系統默認的字符編碼和默認位元組緩沖區,
小貼士:
- 字符編碼:位元組與字符的對應規則,Windows系統的中文編碼默認是GBK編碼表, idea中UTF-8 2. 位元組緩沖區:一個位元組陣列,用來臨時存盤位元組資料,
構造方法
FileReader(File file) : 創建一個新的 FileReader ,給定要讀取的File物件,
FileReader(String fileName) : 創建一個新的 FileReader ,給定要讀取的檔案的名稱, 當你創建一個流物件時,必須傳入一個檔案路徑,類似于FileInputStream
File file = new File("b.text");
//使用file創建流物件
FileReader reader = new FileReader(file);
//使用檔案路徑創建流物件
FileReader reader1 = new FileReader("b.text");
讀取字符,使用read()方法,每次可以讀取一個字符的資料,提升為int型別,讀取到檔案末尾回傳-1

public class Main {
public static void main(String[] args) throws IOException {
File file = new File("a.text");
FileReader reader = new FileReader(file);
int length;
while((length=reader.read())!=-1){
System.out.println((char)length);
}
reader.close();
}
}
結果

使用陣列讀取
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("a.text");
FileReader reader = new FileReader(file);
int length;
char[] bytes = new char[2];
while((length=reader.read(bytes))!=-1){
System.out.println(new String(bytes,0,length));
}
reader.close();
}
}
結果

4.字符輸出流
java.io.Writer 抽象類是表示用于寫出字符流的所有類的超類,將指定的字符資訊寫出到目的地,它定義了位元組 輸出流的基本共性功能方法,
void write(int c) 寫入單個字符,
void write(char[] cbuf) 寫入字符陣列,
abstract void write(char[] cbuf, int off, int len) 寫入字符陣列的某一部分,off陣列的開始索引,len 寫的字符個數,
void write(String str) 寫入字串,
void write(String str, int off, int len) 寫入字串的某一部分,off字串的開始索引,len寫的字符個 數,
void flush() 重繪該流的緩沖,
void close() 關閉此流,但要先重繪它
FileWriter類
java.io.FileWriter 類是寫出字符到檔案的便利類,構造時使用系統默認的字符編碼和默認位元組緩沖區,
構造方法
FileWriter(File file) : 創建一個新的 FileWriter,給定要讀取的File物件
FileWriter(String fileName) : 創建一個新的 FileWriter,給定要讀取的檔案的名稱
代碼演示
FileWriter writer = new FileWriter("b.text");
File file = new File("b.text");
FileWriter writer1 = new FileWriter(file);
使用字串寫
public class Main {
public static void main(String[] args) throws IOException {
FileWriter writer = new FileWriter("b.text");
String str="這是字串";
writer.write(str);
writer.close();
}
}
使用字串陣列寫
public class Main {
public static void main(String[] args) throws IOException {
FileWriter writer = new FileWriter("b.text");
char[] chars = "這是字串".toCharArray();
writer.write(chars);
writer.close();
}
}
注意
字符流,只能操作文本檔案,不能操作圖片,視頻等非文本檔案, 當我們單純讀或者寫文本檔案時 使用字符流 其他情況使用位元組流
以上就是關于位元組流字符流的一些基礎知識,如有錯誤還請各位批評指正,喜歡我的可以關注點贊收藏嘻嘻

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140862.html
標籤:Java
上一篇:delphi 呼叫網頁腳本
