关于JAVA IO流中拷贝文件的几种方法
2015-09-10 17:28
525 查看
上一篇中的拷贝文件,采取的是批量的方法,还有2中方法分别是按字节拷贝和带缓冲的拷贝。带缓冲的拷贝主要是BufferedInputStream和BuferedOutputStream.
BufferedInputStream&BuffredOutputStream
这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种模式以高了IO的性能从应用程序中把输入放入文件,相当于将一缸水倒入另一缸中;
FileOutputStream--->write()方法相当于一滴一滴把水转移过去
DataOutputSream--->writeXxx()方法会方便一些,相当于一瓢一瓢把水转过去,其方法封装了FileOutputStream中write()的多次操作
BufferedOutputStream--->write方法更方便,相当于一瓢一瓢先放入捅中,再从桶中倒入缸中
按照拷贝大文件的效率来说,批量拷贝的效率高,再是带缓冲区的操作(BufferedInputStream&BuffredOutputStream),最后是FileOutputStream的按一个字节的拷贝,以下JAVA代码写出了这几种拷贝的方法:
BufferedInputStream&BuffredOutputStream
这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种模式以高了IO的性能从应用程序中把输入放入文件,相当于将一缸水倒入另一缸中;
FileOutputStream--->write()方法相当于一滴一滴把水转移过去
DataOutputSream--->writeXxx()方法会方便一些,相当于一瓢一瓢把水转过去,其方法封装了FileOutputStream中write()的多次操作
BufferedOutputStream--->write方法更方便,相当于一瓢一瓢先放入捅中,再从桶中倒入缸中
按照拷贝大文件的效率来说,批量拷贝的效率高,再是带缓冲区的操作(BufferedInputStream&BuffredOutputStream),最后是FileOutputStream的按一个字节的拷贝,以下JAVA代码写出了这几种拷贝的方法:
package com.imooc.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class IOUtil { /** * 读取指定文件内容,按照16进制输出到控制台 * 并且每输出10个byte换行 * @param fileName * 单字节读取不适合大文件,大文件效率很低 */ public static void printHex(String fileName)throws IOException{ //把文件作为字节流进行读操作 FileInputStream in = new FileInputStream(fileName); int b ; int i = 1; while((b = in.read())!=-1){ if(b <= 0xf){ //单位数前面补0 System.out.print("0"); } System.out.print(Integer.toHexString(b)+" "); if(i++%10==0){ System.out.println(); } } in.close(); } /** * 批量读取,对大文件而言效率高,也是我们最常用的读文件的方式 * @param fileName * @throws IOException */ public static void printHexByByteArray(String fileName)throws IOException{ FileInputStream in = new FileInputStream(fileName); byte[] buf = new byte[8 * 1024]; /*从in中批量读取字节,放入到buf这个字节数组中, * 从第0个位置开始放,最多放buf.length个 * 返回的是读到的字节的个数 */ int bytes = 0; int j = 1; while((bytes = in.read(buf,0,buf.length))!=-1){ for(int i = 0 ; i < bytes;i++){ System.out.print(Integer.toHexString(buf[i] & 0xff)+" "); if(j++%10==0){ System.out.println(); } } } in.close(); } /** * 文件拷贝,字节批量读取 * @param srcFile * @param destFile * @throws IOException */ public static void copyFile(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8*1024]; int b ; while((b = in.read(buf,0,buf.length))!=-1){ out.write(buf,0,b); out.flush();//最好加上 } in.close(); out.close(); } /** * 进行文件的拷贝,利用带缓冲的字节流 * @param srcFile * @param destFile * @throws IOException */ public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } BufferedInputStream bis = new BufferedInputStream( new FileInputStream(srcFile)); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile)); int c ; while((c = bis.read())!=-1){ bos.write(c); bos.flush();//刷新缓冲区 } bis.close(); bos.close(); } /** * 单字节,不带缓冲进行文件拷贝 * @param srcFile * @param destFile * @throws IOException */ public static void copyFileByByte(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); int c ; while((c = in.read())!=-1){ out.write(c); out.flush(); } in.close(); out.close(); } }
相关文章推荐
- Eclipse下svn的创建分支/合并/切换使用
- Java中getResourceAsStream的用法
- java文件上传到服务器
- Spring MVC在接收复杂集合参数
- Struts2常用标签总结
- Java中Runnable和Thread的区别
- SpringMVC 3.0 常用注解简介
- java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
- JAVA入门教程之关键字
- Spring中Quartz的配置
- spring AOP面向切面编程学习笔记
- Java总结篇系列:Java多线程(二)
- Spring+Quartz实现定时从FTP服务器读取文件并存入Oracel数据库
- Java总结篇系列:Java多线程(一)
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- 一点一点学习struts1(二)_环境搭建
- 于java里方法的内部类只能访问被final修饰的局部变量和.
- Java 设计模式——单例模式
- Wireless LCD Monitor
- Java语法中微小细节