flush()作用及适用场景
flush()
: 刷新缓冲区,流对象可以继续使用。
close():
先刷新缓冲区,然后通知系统关闭资源,流对象不可以再被使用。
flush()使用场景:
字符输出流:
1.创建Filewriter对象,构造方法中绑定要写入数据的地址
2.使用Filewriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
3.使用Filewriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
1.创建Filewriter对象,构造方法中绑定要写入数据的地址
2.使用Filewriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
3.使用Filewriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
使用缓冲的字节输出流:
1.创建FileOutputstream对象,构造方法中绑定要输出的地址
2.创建BufferedOutputStream对象,构造方法中传递FileOutputstream对象对象,提高FileOutputStream对象效率
3.使用Bufferedoutputstream对象中的方法write ,把数据写入到内部缓冲区中
4.使用Bufferedoutputstream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先把内存缓冲区中的数据刷新到文件中)
1.创建FileOutputstream对象,构造方法中绑定要输出的地址
2.创建BufferedOutputStream对象,构造方法中传递FileOutputstream对象对象,提高FileOutputStream对象效率
3.使用Bufferedoutputstream对象中的方法write ,把数据写入到内部缓冲区中
4.使用Bufferedoutputstream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先把内存缓冲区中的数据刷新到文件中)
使用缓冲的字符输出流:
1.创建BufferedWriter对象,构造方法中传递字符输出流
2.调用BufferedWriter中的方法write,把数据写入到内存缓冲区中
3.调用BufferedWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
以上场景,在close()之前,若不使用flush()方法,内容将无法写入硬盘文件中(保存在内存中,文件中不出现数据)。
1.创建BufferedWriter对象,构造方法中传递字符输出流
2.调用BufferedWriter中的方法write,把数据写入到内存缓冲区中
3.调用BufferedWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
以上场景,在close()之前,若不使用flush()方法,内容将无法写入硬盘文件中(保存在内存中,文件中不出现数据)。
不需使用flush()的场景:
字节输出流:
1.创建一个FileOutputStream对象,构造方法中传递写入数据的地址
2.调用FileOutputStream对象中的方法write ,把数据写入到文件中
3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)
该场景,在close()之前,若不使用flush()方法,内容可以写入硬盘文件中(文件中出现数据)。
1.创建一个FileOutputStream对象,构造方法中传递写入数据的地址
2.调用FileOutputStream对象中的方法write ,把数据写入到文件中
3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)
该场景,在close()之前,若不使用flush()方法,内容可以写入硬盘文件中(文件中出现数据)。
FileOutputStream BufferedOutputStream区别 缓冲区与字节数组的理解
先放一个对比试验,4种不同方式的字节读写方式实现复制图片:
1.利用字节流FileInputStream加每次单个字节复制文件 :共耗时4552毫秒
//利用字节流FileInputStream加单个字节复制文件
import java.io.*;
public class CopyCSDN2 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file1 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
try (InputStream inputStream = new FileInputStream(file); OutputStream outputStream = new FileOutputStream(file1)) {
int len;
while ((len = inputStream.read()) != -1) {//返回收到的实际读取的字节数len
outputStream.write(len);
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
2.利用字节流FileInputStream加字节数组复制文件 :共耗时7毫秒
//利用字节流FileInputStream加字节数组复制文件
import java.io.*;
public class CopyCSDN {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file1 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
byte[] buffer = new byte[1024];// 创建1024B的字节数组
try (InputStream inputStream = new FileInputStream(file); OutputStream outputStream = new FileOutputStream(file1)) {
int len;
while ((len = inputStream.read(buffer)) != -1) {//返回收到的实际读取的字节数len
outputStream.write(buffer, 0, len);//buffer中从0开始的len个字节,排除原buffer中的数的影响
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
3.使用BufferedOutputStream 加单个字节复制文件:共耗时24毫秒
//使用Bufferedoutputstream 加单个字节复制文件
import java.io.*;
public class CopyCSDN4 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file1 = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file2 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
try (BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file1));
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(file2));) {
int len;
while ((len = bi.read()) != -1) {
bo.write(len);
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
4.使用BufferedOutputStream 加字节数组复制文件,共耗时:3毫秒
//使用Bufferedoutputstream 加字节数组复制文件
import java.io.*;
public class CopyCSDN3 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file1 = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file2 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
try (BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file1));
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(file2));) {
byte[] bytes = new byte[1024];//创建1024B字节数组
int len;
while ((len = bi.read(bytes)) != -1) {
bo.write(bytes, 0, len);
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
实验结果表明:使用BufferedOutputStream 加字节数组复制文件更加高效,性能最差的是FileOutputStream加单个字节复制,耗时最长。其实设置字节数组和使用BufferedOutputStream均是利用较大的字节数组对需要读取或写入的数据进行缓存,同时使用两者相当于使用双重缓存,更加高效。