字節(jié)流
InputStream蒸苇、OutputStream抽象了程序的讀寫數(shù)據(jù)方式磷蛹。
EOF = END ,讀到-1就結(jié)尾
輸入流基本方法
int b = in.read();//讀一字節(jié) 無符號(hào)填充到int的低八位溪烤。-1表示EOF
in.read(byte[] buf); //將數(shù)據(jù)讀入數(shù)組味咳。
in.read(byte[] buf,int start, int size);//從start開始,讀長度為size 的長度檬嘀。
輸出流基本方法
out.write(int b);//寫一個(gè)byte槽驶,但是是b的低八位
out.write(byte[] buf); //將數(shù)組數(shù)據(jù)寫入到out流。
out.write(byte[] buf,int start, int size);//從start開始鸳兽,寫長度為size 的長度掂铐。
子類:
FileInputStream&FileOutputStream
具體實(shí)現(xiàn)了文件上的讀寫。
FileOutputStream fileOutputStream = new FileOutputStream("./fileOutPutStream.txt");
fileOutputStream.write('A');
int a = 10;
fileOutputStream.write(a>>>24);
fileOutputStream.write(a>>>16);
fileOutputStream.write(a>>>8);
fileOutputStream.write(a);
fileOutputStream.close();
System.out.println("\n-------------------------");
FileInputStream fileInputStreamNew = new FileInputStream("./fileOutPutStream.txt");
int inputByte;
while((inputByte = fileInputStreamNew.read())!= -1){
System.out.print(inputByte+" ");
}
圖片.png
public void copyFile(File srcFile,File desFile) throws IOException {
if (!srcFile.exists()){
System.out.println("srcFile is not exist");
}
if (!srcFile.isFile()){
System.out.println("srcFile is not a file");
}
FileInputStream fileInputStream = new FileInputStream(srcFile);
FileOutputStream fileOutputStream = new FileOutputStream(desFile);
byte[] bytes = new byte[20*1024];
int b = 0;
// fileInputStream.read()返回的是讀到的字節(jié)數(shù)。
while ((b = fileInputStream.read(bytes))!= -1){//-1為EOF
fileOutputStream.write(bytes,0,b) ;
}
fileInputStream.close();
fileOutputStream.close();
}
DataInputStream&DataOutputStream
對(duì)功能進(jìn)行了拓展全陨,方便的讀寫int爆班、long、字符等類型數(shù)據(jù)辱姨。只是相對(duì)FileInputStream&FileOutputStream的read進(jìn)行了包裝
例子:
// DataInputStream.readInt():
public final int readInt() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}
BufferedInputStream&BufferedOutputStream
這兩個(gè)流類為IO操作提供了緩沖區(qū)柿菩,一般文件的讀寫都會(huì)帶上緩沖,可以提高性能雨涛。
以將水導(dǎo)入水缸為例:
FileOutputStream.write():一滴滴的轉(zhuǎn)移
DataOutputStream.writeXXX():一杯杯的轉(zhuǎn)移
BufferedOutputStream.write():一杯杯的放入桶中枢舶,再從桶中倒入水缸。
ioStream.copyFileByByte(new File("./file.txt"), new File("./file2.txt"));
// Compilation completed successfully in 2s 98ms
ioStream.copyFileByBuffer(new File("./file.txt"), new File("./bufferFile.txt"));
// Compilation completed successfully in 1s 900ms
字符流
- java的文本是(char)是16位無符號(hào)整數(shù)替久,是字符的Unicode編碼(雙字節(jié)編碼)
- 文件是字節(jié)的數(shù)據(jù)序列(byte byte byte ...)
- 文本文件是文(char)按照某種編碼格式(utf-8凉泄,utf-16,gbk等)序列化為byte的存儲(chǔ)結(jié)構(gòu)蚯根。
Reader&Writer抽象了字符流的讀寫方式后众。
字符的處理以此處理一個(gè)字符,最底層依然是基本的字節(jié)序列稼锅。
子類:
InputStreamReader&OutputStreamWriter
InputStreamReader:完成byte流到char流吼具,按照編碼解析。
OutputStreamWriter:完成char流到byte流矩距,按照編碼處理拗盒。
//InputStreamReader的構(gòu)造函數(shù)可以帶編碼集
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("./texture.txt"));//默認(rèn)是項(xiàng)目的編碼
構(gòu)造函數(shù)輸入應(yīng)為 FileInputStream。
FileReader&FileWriter
不支持對(duì)編碼格式的轉(zhuǎn)換與控制
構(gòu)造函數(shù)更為簡單一些锥债,輸入直接是File陡蝇。
FileReader fileReader = new FileReader("./texture.txt");
FileWriter fileWriter = new FileWriter("./fileWriter.txt",true);//true表示追加
字符流的過濾器
BufferedReader&BufferedWriter
讀寫一整行
構(gòu)建比較復(fù)雜,好處是可以按行處理內(nèi)容哮肚,同時(shí)可以控制讀取的字符集登夫。
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File("./texture.txt")
)
)
);
String line;
while ((line = bufferedReader.readLine())!= null){
System.out.println(line);//readLine 不讀換行符
}