- 所有文件的儲存是都是字節(byte)的儲存
- 字節流可用於任何類型的對象,包括二進制對象
- 字節流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符
- 程序中的輸入輸出都是以流的形式保存的,流中保存的實際上全都是字節文件
-
字節流和字符流使用是非常相似的,那麼除了操作代碼的不同之外,還有哪些不同呢?
字節流在操作的時候本身是不會用到緩衝區(內存)的,是與文件本身直接操作的,而字符流在操作的時候是使用到緩衝區的
字節流在操作文件時,即使不關閉資源(close方法),文件也能輸出,但是如果字符流不使用close方法的話,則不會輸出任何內容,說明字符流用的是緩衝區,並且可以使用flush方法強制進行刷新緩衝區,這時才能在不close的情況下輸出內容
那開發中究竟用字節流好還是用字符流好呢?
在所有的硬盤上保存文件或進行傳輸的時候都是以字節的方法進行的,包括圖片也是按字節完成,而字符是只有在內存中才會形成的,所以使用字節的操作是最多的。
如果要java程序實現一個拷貝功能,應該選用字節流進行操作(可能拷貝的是圖片),並且採用邊讀邊寫的方式(節省內存)
package webservices;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Copy {
/*
* 用字符流緩衝寫文本文件
*/
public static void buferCopyTxt(String form,String to) throws IOException{
//字符流
BufferedReader bReader=null;
BufferedWriter writer=null;
bReader=new BufferedReader(new FileReader(form));
writer=new BufferedWriter(new FileWriter(to));
String line;
while((line=bReader.readLine())!=null){
writer.write(line);
writer.flush();
}
System.out.println("從form中拷貝文件到to");
if(bReader!=null){
bReader.close();
}if(writer!=null){
writer.close();
}
}
/**
* 字節流緩衝複製文件
* 支持照片
* @throws IOException
*
*/
public static void bufferCopyImage(String from,String to) throws IOException{
BufferedInputStream iStream=null;
BufferedOutputStream bStream=null;
iStream = new BufferedInputStream(new FileInputStream(from));
bStream = new BufferedOutputStream(new FileOutputStream(to));
byte [] bytes =new byte [1024];
int num = 0;
while((num=iStream.read(bytes)) != -1){
bStream.write(bytes,0,num);
bStream.flush();
}
System.out.println("從form中拷貝圖片到to");
if(iStream!=null){
iStream.close();
}if(bStream!=null){
bStream.close();
}
}
public static void main(String[] args) throws IOException {
//
// File fileForm =new File(dirForm,fileName);
// if(!fileForm.getParentFile().exists()){
// fileForm.getParentFile().mkdirs();
// }
// fileForm.createNewFile();
//
// File fileTo =new File(dirTo);
// if(!fileTo.isDirectory()){
// fileTo.mkdirs();
// }
Copy.buferCopyTxt("D:\\form\\test.txt", "D:\\to\\a.txt");
bufferCopyImage("D:\\form\\11.png", "D:\\to\\22.png");
}
}