单个字节读写
public class FileIOTest { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("aa.txt"); FileOutputStream fos = new FileOutputStream("bbb.txt", true);// FileOutputStream()后面加true指文件后面可追加 long start = System.currentTimeMillis();// int b;// while ((b = fis.read()) != -1) {// fos.write(b);// } int len; byte[] arr = new byte[1024 * 8];// 自定义字节数组 while ((len = fis.read(arr)) != -1) { fos.write(arr, 0, len);// 写出字节数组写出有效个字节个数 } long end = System.currentTimeMillis(); System.out.PRintln(end - start); fis.close();// 一定记得关闭流,养成好习惯 fos.close(); }}BufferedInputStream与BufferedOutputStream
理解下缓冲思想字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,所以提供了字节缓冲区流BufferedInputStream内置了一个缓冲区(数组),从BufferedInputStream中读取一个字节时,BufferedInputStream会一次性从文件中读取8k字节, 存在缓冲区中, 返回给程序一个,程序再次读取时, 就不用找文件了, 直接从缓冲区中获取,直到缓冲区中所有的都被使用过, 才重新从文件中读取8k个BufferedOutputStream也内置了一个缓冲区(数组),程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中,直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里public class FileIOTest2 { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("aa.txt"); FileOutputStream fos = new FileOutputStream("bbb.txt", true);// FileOutputStream()后面加true指文件后面可追加 BufferedInputStream bis = new BufferedInputStream(fis); // 使用装饰模式,把fis装饰进去bis中。使用缓冲读取速度变快 BufferedOutputStream bos = new BufferedOutputStream(fos); long start = System.currentTimeMillis(); int b; while ((b = bis.read()) != -1) { bos.write(b); } long end = System.currentTimeMillis(); System.out.println(end - start); bis.close();// 一定记得关闭流,养成好习惯 bos.close(); }}面试题
1、通过以上两个例子分析:小数组读写和buffered读写哪个更快?
定义小数组如果是8192个字节大小和Buffered比较的话,定义小数组会略胜一筹,因为读和写操作的是同一个数组,而Buffered操作的是两个数组
2、区别下flush()与close()
flush()方法: 用来刷新缓冲区的,刷新后可以再次写出
close()方法:用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
3、能否用字符流复制文件
字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节。不可以拷贝非纯文本的文件,在转换过程中,可能找不到对应的字符,就会用?代替
参考文章:
http://www.cnblogs.com/biehongli/p/6074713.html
新闻热点
疑难解答