- 所有文件的储存是都是字节(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");
}
}