我们清楚操作文件数据使用缓冲数组读取效率更高,sun公司给我们提供了一个缓冲字节流,可以让我们更高效率操作文件
缓冲输入字节流:
----------------------| InputStream 输入字节流的基类
----------------| FileInputStream 读取文件的输入字节流
----------------| BufferedInputStream 缓冲输入字节流 作用:提高读取文件的效率
注意:BufferedInputStream其实底层创建了一个8kb的字节数组,跟我们自定义创建一个字节数组实现原理一样的
构造方法:
BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
缓冲输出字节流:
----------------------| OutputStream 输出字节流的基类
----------------| FileOutputStream 写入文件的输入字节流
----------------| BufferedOutputStream 缓冲输出字节流 作用:提高我们写入数据的效率
注意:BufferedOutputStream底层也是创建了一个8kb的字节数组,当我们在使用write方法的时候,数据其实存在了字节数组中,并没有写入文件中
当我们关闭文件,或者使用flush方法,或则字节数组存满,才会把数据写入文件中
构造方法:
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
成员函数:
flush() 刷新此缓冲的输出流(也就是把字节数组中的数据写入文件中)。
注意:缓冲字节流本身并不具备读写文件能力
最后讲解一下容易混淆的一些函数(能力有限,可能说的不够明确):
fileInputStream.read(buf) 返回每次读取数据的长度,没有则返会-1
fileInputStream.read() 返回的是每次读取的数据,没有则返会-1
bufferedInputStream.read() 当读取到数据返回的是底层字符数组的数据,当没有读取到数据,会返回-1
bufferedInputStream.read(buf) 返回的是缓存到缓存数组中的字节总数(这个是父类的方法)当没有读取到数据,会返回-1
需求:拷贝图片
public class Demo1 { public static void main(String[] args) { File inputfile = new File("D:\新建文件夹\1.jpg"); File outputfile = new File("D:\新建文件夹 (2)\1.jpg"); BufferedInputStream bufferedInputStream = null; BufferedOutputStream bufferedOutputStream = null; try { FileInputStream fileInputStream = new FileInputStream(inputfile); FileOutputStream fileOutputStream = new FileOutputStream(outputfile); bufferedInputStream = new BufferedInputStream(fileInputStream); bufferedOutputStream = new BufferedOutputStream(fileOutputStream); int content = 0; while((content = bufferedInputStream.read())!=-1) { bufferedOutputStream.write(content); } }catch(IOException e) { throw new RuntimeException(e); }finally { try { bufferedOutputStream.close(); }catch(IOException e) { throw new RuntimeException(e); }finally { try { bufferedInputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } }