为了账号安全,请及时绑定邮箱和手机立即绑定

关于BufferedOutStream 到底怎么写文件的

https://img1.sycdn.imooc.com//5ba8527500015d3006050225.jpg

视频中不是说

 FileOutputStream-->write()方法相当于一滴一滴地把水"转移"过去

 DataOutputStream-->wtireXxx()方相当于一瓢一瓢把水"转移"过去

 BufferedOutputStream-->write方法相当于一瓢一瓢先放入桶中,在从桶中倒入到另一个缸中,性能提高


那按照while中的代码,怎么还是感觉是一个字节一个字节读的,没有体现出瓢和桶的概念啊?不懂

正在回答

4 回答

FileOutputStream的write(int)是直接把字节写到磁盘文件上,相当于直接从这个山头的缸中取了一滴水,然后爬到另一个山头放入那个缸中。

FileOutputStream的write(byte[])是直接把字节先写到字节数组中,然后统一写到磁盘文件上,相当于直接从这个山头的缸中舀一瓢水,然后爬到另一个山头倒入那个缸中。

DataOutputStream的writeXxx()理解跟FileOutputStream的write(byte[])差不多

BufferedOutputStream的write(int)方法相当于把字节一个一个放入一个缓冲区中,再一次性将缓冲区中的内容写到磁盘文件上。相当于将这个山头的水缸中的水一滴一滴放入铁桶中,当这个水缸的水放完了,你再抱着这个铁桶一次性的将水倒入另一个山头的缸中。

BufferedOutputStream的write(byte[])方法是最牛逼的,把字节一部分一部分的拿出,每次拿出都放入字节数组,再将字节数组放入缓冲区中,再一次性将缓冲区中的内容写到磁盘文件上。相当于从这个山头的水缸中一瓢一瓢的舀水放入铁桶中,当这个水缸舀完了,你再抱着这个铁桶一次性的将水倒入另一个山头的缸中。

你说哪个方法走的路少比较轻松? 下面是我的代码,DataOutputStream的没有写。你比较下

package com.imooc.io;

import java.io.*;

public class IOUtil {

public static void copyFileByByte(File sourceFile,File destinationFile) throws IOException{

if( !sourceFile.exists() ) {

throw new IllegalArgumentException(sourceFile+"文件不存在");

}

if( !sourceFile.isFile() ) {

throw new IllegalArgumentException(sourceFile+"不是文件");

}

FileInputStream fis=new FileInputStream(sourceFile);

FileOutputStream fos=new FileOutputStream(destinationFile);

int b;

while( (b=fis.read())!=-1 ) {

fos.write(b);

fos.flush(); //最好加上

}

fis.close();

fos.close();

}

public static void copyFileByByteArray(File sourceFile,File destinationFile) throws IOException{

if( !sourceFile.exists() ) {

throw new IllegalArgumentException(sourceFile+"文件不存在");

}

if( !sourceFile.isFile() ) {

throw new IllegalArgumentException(sourceFile+"不是文件");

}

FileInputStream fis=new FileInputStream(sourceFile);

FileOutputStream fos=new FileOutputStream(destinationFile);

byte[] buf=new byte[16*1024];

int b;

while( (b=fis.read(buf,0,buf.length))!=-1 ) {

fos.write(buf,0,b);

fos.flush(); //最好加上

}

fis.close();

fos.close();

}

public static void copyFileByBufferByByte(File sourceFile,File destinationFile) throws IOException{

if( !sourceFile.exists() ) {

throw new IllegalArgumentException(sourceFile+"文件不存在");

}

if( !sourceFile.isFile() ) {

throw new IllegalArgumentException(sourceFile+"不是文件");

}

BufferedInputStream bis=new BufferedInputStream( new FileInputStream(sourceFile) );

BufferedOutputStream bos=new BufferedOutputStream( new FileOutputStream(destinationFile) );

int b=0;

while( (b=bis.read())!=-1 ) {

bos.write(b);

}

bos.flush();

bis.close();

bos.close();

}

public static void copyFileByBufferByByteArray(File sourceFile,File destinationFile) throws IOException{

if( !sourceFile.exists() ) {

throw new IllegalArgumentException(sourceFile+"文件不存在");

}

if( !sourceFile.isFile() ) {

throw new IllegalArgumentException(sourceFile+"不是文件");

}

BufferedInputStream bis=new BufferedInputStream( new FileInputStream(sourceFile) );

BufferedOutputStream bos=new BufferedOutputStream( new FileOutputStream(destinationFile) );

byte[] buf=new byte[16*1024];

int b=0;

while( (b=bis.read(buf,0,buf.length))!=-1 ) {

bos.write(buf,0,buf.length);

}

bos.flush();

bis.close();

bos.close();

}

}


3 回复 有任何疑惑可以回复我~

同问 有人能解答吗

0 回复 有任何疑惑可以回复我~

他们提供的方法

read 或者write 是一个一个字节的读写;

readXxx 或者writeXxx是一次性写入

readline或者writerline 是一行一行的读写


0 回复 有任何疑惑可以回复我~

read 或者write 是一个一个字节的读写;

readXxx 或者writeXxx是一次性写入

readline或者writerline 是一行一行的读写

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
文件传输基础——Java IO流
  • 参与学习       133755    人
  • 解答问题       1030    个

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

进入课程

关于BufferedOutStream 到底怎么写文件的

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信