java写入流怎么写,JAVA-IO之写入流(output)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。

程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

Java中流分两种

字节流

InputStream、OutputStream,常用子类有FileInputStream、FileOutputStream,BufferedOutputStream

字符流

Write、Reader,常用子类有FileWirter、FileReader跟BufferedReader、BufferedWriter等

--------------------------------------------------------------------------------------------------------

不同写法,应用不同的场景,同时会产生不同的效率问题,到底哪种情况,我们改用哪种写法呢?

今天我们来测试一下一个文件5种写法的效率问题:

/**

*

* ClassName: FileTest

* @Description: TODO

* @author chencl

* @date 2017-10-16

*/

public class FileTest {

static FileOutputStream out = null;

static BufferedOutputStream Buff=null;

static int count=1000;//写文件行数

static FileWriter fw = null;

static BufferedWriter bfw=null;

static DataOutputStream dos = null;

public FileTest() {

}

/**

*

* @Description: TODO 基于字节流的封装类fileOutputStream

* @param

* @return void

* @throws

* @author chencl

* @date 2017-10-16

*/

public static void testWriteByFileOut(){

try{

out = new FileOutputStream(new File("d://test1.txt"));

long begin1 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {

out.write("测试java 文件操作\r\n".getBytes());

}

out.close();

long end1 = System.currentTimeMillis();

System.out.println("FileOutputStream执行耗时:" + (end1 - begin1) + " 豪秒");

}catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}

/**

*

* @Description: TODO 还是基于字节流的封装类fileOutputStream,增加 buffer缓冲区

* 每写一次数据,磁盘就有一个写操作,性能很差如果加了缓冲,那么会等到缓冲满了以后才会有写操作,效率和性能都有很大提高

* @param

* @return void

* @throws

* @author chencl

* @date 2017-10-16

*/

public static void testWriteByBufferFileOut(){

try {

out = new FileOutputStream(new File("d://test2.txt"));

Buff=new BufferedOutputStream(out);

long begin2 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {

Buff.write("测试java 文件操作\r\n".getBytes());

}

Buff.flush();

out.close();

Buff.close();

long end2 = System.currentTimeMillis();

System.out.println("BufferedOutputStream执行耗时:" + (end2 - begin2) + " 豪秒");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

*

* @Description: TODO 基于字符流的封装类fileWriter

*

* @param

* @return void

* @throws

* @author chencl

* @date 2017-10-16

*/

public static void testWriteByFileWrite(){

try {

fw = new FileWriter("d://test3.txt");

long begin3 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {

fw.write("测试java 文件操作\r\n");

}

fw.close();

long end3 = System.currentTimeMillis();

System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

*

* @Description: TODO 基于字符流的封装类fileWriter,增加缓冲区bufferedWriter,

* 每写一次数据,磁盘就有一个写操作,性能很差如果加了缓冲,那么会等到缓冲满了以后才会有写操作,效率和性能都有很大提高

* @param

* @return void

* @throws

* @author chencl

* @date 2017-10-16

*/

public static void testWriteByBufferedFileWrite(){

try {

fw = new FileWriter("d://test4.txt");

bfw=new BufferedWriter(fw);

long begin3 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {

bfw.write("测试java 文件操作\r\n");

}

bfw.flush();

fw.close();

bfw.close();

long end3 = System.currentTimeMillis();

System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

*

* @Description: TODO 将java基本数据类型写入数据输出流中。并可以通过数据输入流DataInputStream将数据读入。

* 核心意义在于,使数据流操作有了java的基本数据类型。

* @param

* @return void

* @throws

* @author chencl

* @date 2017-10-16

*/

public static void testWriteByDataOut(){

try {

out = new FileOutputStream(new File("d://add5.txt"));

dos = new DataOutputStream(out);

long begin4 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {

dos.write("测试java 文件操作\r\n".getBytes());

}

out.close();

dos.close();

long end4 = System.currentTimeMillis();

System.out.println("DataOutputStream执行耗时:" + (end4 - begin4) + " 豪秒");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

// 相同的文件的四种不同方式写文件,看看效率.

public static void main(String[] args) {

testWriteByFileOut();

testWriteByBufferFileOut();

testWriteByFileWrite();

testWriteByBufferedFileWrite();

testWriteByDataOut();

}

if count=1000;

FileOutputStream执行耗时:15 豪秒

BufferedOutputStream执行耗时:9 豪秒

FileWriter执行耗时:9 豪秒

FileWriterBuffered执行耗时:3 豪秒

DataOutputStream执行耗时:13 豪秒

if count=100000;

FileOutputStream执行耗时:400 豪秒

BufferedOutputStream执行耗时:40 豪秒

FileWriter执行耗时:100 豪秒

FileWriterBuffered执行耗时:29 豪秒

DataOutputStream执行耗时:316 豪秒

结论:

1,但数据文件很小的写入操作,不同写法耗时的差值可以忽略不计

2,当数据文件很大的写入操作,FileWriterBuffered>BufferedOutputStream>FileWriter>DataOutputStream>FileOutputStream

3,对于文本的操作,字符流整体性能和效率比字节流要高出很多,加上buffered缓冲区,性能还会再一步提升。

原理:字节流是由字节组成的,字符流是由字符组成的.Java里字符由两个字节组成,字节流每写一次数据,磁盘就有一个写操作,性能很差,如果加了缓冲,那么会等到缓冲满了以后才会有写操作,效率和性能都有很大提高

适用场景:

字节流主要是处理二进制数据,所以针对图片,网络传输,多数采用字节流。

字符流主要是处理文本数据,所以写文件等文本操作会比较适用

ps:java代码粘贴复制就能运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值