通过缓冲区来提高文件读写效率
方式1:字节数组
如果被读取的二进制文件非常大,一个一个字节来读会很浪费时间降低代码的执行效率,我们一次性尽可能多的读取数据,然后再一次性写入某个文件或者将其输出:设定一个字节数组,将读取的数据先存放在这个数组中,然后将这和数组中的数据一次性写入某个文件或者将其输出,用available()方法来预估数据文件的大小,方法的返回值是一个整形数字,看例子:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileBuffeDome {
public static void main(String[] args) {
FileInputStream f=null;
FileOutputStream f1=null;
try {
f=new FileInputStream("F:/JAVA/IO/123.jfif");
f1=new FileOutputStream("bb/c.jfif");
byte[] buff=new byte[f.available()]; //预估123.jfif文件的大小作为数组缓冲确定长度
f.read(buff); //一次性读入
f1.write(buff); //一次性写出
f1.flush();
}catch (Exception e) {
e.printStackTrace();
}finally {
try {FileInputStream fis=null;
FileOutputStream fos=null;
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
fis=new FileInputStream("F:/JAVA/IO/123.jfif");
bis=new BufferedInputStream(fis); //完成流的对接
fos=new FileOutputStream("bb/c1.jfif");
bos=new BufferedOutputStream(fos); //完成流的对接
int temp=0;
while((bis.read())!=-1)
{
bos.write(temp);
}
bos.flush();
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
//关闭流顺序:先开的后关
if(bis!=null){
bis.close();
}
if(fis!=null){
fis.close();
}
if(bos!=null){
bos.close();
}
if(fos!=null){
fos.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
if(f !=null)
{
f.close();
}
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
这样代码的执行效率会提高很多。
方式2:字节缓冲流
当频繁的进行数据的读写时,效率比较低,这时如果使用缓冲流就能更高效的读取读写信息。
工作方式:将 数据先存起来,然后当缓存区存满后挥着手动刷新时再一次性的读取到程序或者写入目的地。
BufferedInputStream和BufferedOutputStream
Java的文件缓冲流本身不提供IO流的输入输出功能的,只是再别的流(节点流或者其他处理流)上加上缓冲功能提高效率,就像时别的流包装起来一样,因此缓冲流也是一种处理流(包装流)。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileBufferedStream {
public static void main(String[] args) {
FileInputStream fis=null;
FileOutputStream fos=null;
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
fis=new FileInputStream("F:/JAVA/IO/123.jfif");
bis=new BufferedInputStream(fis); //完成流的对接
fos=new FileOutputStream("bb/c1.jfif");
bos=new BufferedOutputStream(fos); //完成流的对接
int temp=0;
while((bis.read())!=-1)
{
bos.write(temp);
}
bos.flush();
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
//关闭流顺序:先开的后关
if(bis!=null){
bis.close();
}
if(fis!=null){
fis.close();
}
if(bos!=null){
bos.close();
}
if(fos!=null){
fos.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
这样代码的只想效率会更高。
文件copy工具的定义
我们经常会用到文件的读和写,那我们可以自己定义一个数据文件的copy的工具,这样就不用每次使用时都写一遍:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileCopyTools {
public static void copyFile(String src,String des)
{
FileInputStream fis=null;
FileOutputStream fos=null;
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
bis=new BufferedInputStream(new FileInputStream(src)); //完成流的对接
bos=new BufferedOutputStream(new FileOutputStream(des)); //完成流的对接
int temp=0;
while((bis.read())!=-1)
{
bos.write(temp);
}
bos.flush();
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
//关闭流顺序:先开的后关
if(bis!=null){
bis.close();
}
if(fis!=null){
fis.close();
}
if(bos!=null){
bos.close();
}
if(fos!=null){
fos.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
这样就完成了一个一个copy工具的定义,方法的参数是源文件的地址和要copy到的地址。