IO流 字节流拷贝 自定义FileUtil

1 文件读取, 主要看注释部分的总结

/**
 * 文件的读取
 * 1、建立联系   File对象
	2、选择流     文件输入流  InputStream FileInputStream
	3、操作  : byte[] car =new byte[1024];  +read+读取大小
              输出  将读取到的内容都打印出来 
	4、释放资源 :关闭
    5、File类相当建立程序和物理磁盘的一个管道,  InputSteam  OutputStream 相当于电泵,将文件里的东西推出去或者拉进来,
    而in还是out是相对于程序而言,因此如果是数据从文件到程序,就使用InputSteam, 如果是数据从程序到文件,就使用 OutputStream
 * @author Administrator
 *
 */
public class Demo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//1、建立联系   File对象
		File src =new File("e:/xp/test/a.txt");
		//2、选择流
		InputStream is =null; //提升作用域
		try {
			is =new FileInputStream(src);
			//3、操作 不断读取 缓冲数组
			byte[] car =new byte[1024];
			int len =0; //接收 实际读取大小
			//循环读取
			StringBuilder sb =new StringBuilder();
			while(-1!=(len=is.read(car))){
				//输出  字节数组转成字符串
				String info =new String(car,0,len);
				sb.append(info);
			}
			System.out.println(sb.toString());
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.out.println("文件不存在");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("读取文件失败");
		}finally{
			try {
				//4、释放资源
				if (null != is) {
					is.close();
				}
			} catch (Exception e2) {
				System.out.println("关闭文件输入流失败");
			}
		}
	}

}

2  内容从一个文件写到另一个文件:

/**
 1、建立联系   File对象   源头 目的地
2、选择流     
	 文件输入流  InputStream FileInputStream
	  文件输出流  OutputStream FileOutputStream
3、操作  :  拷贝
	 byte[] flush =new byte[1024]; 
	 int len =0;
	  while(-1!=(len=输入流.read(flush))){  
		 输出流.write(flush,0,len)
	  }
             输出流.flush
4、释放资源 :关闭 两个流
 
 
 * @author Administrator
 *
 */
public class CopyFileDemo {

	/**
	 * @param args
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) {
		String src ="E:/xp/test";
		String dest="e:/xp/test/4.jpg";
		try {
			copyFile(src,dest);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.out.println("文件不存在");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("拷贝文件失败|关闭流失败");
		}
	}
	/**
	 * 文件的拷贝
	 * @param  源文件路径
	 * @param  目录文件路径
	 * @throws FileNotFoundException,IOException
	 * @return 
	 */
		public static void copyFile(String srcPath,String destPath) throws FileNotFoundException,IOException {
			//1、建立联系 源(存在且为文件) +目的地(文件可以不存在) 
			File src =new File(srcPath);
			File dest =new File(destPath);
			if(! src.isFile()){ //不是文件或者为null
				System.out.println("只能拷贝文件");
				throw new IOException("只能拷贝文件");
			}
			//2、选择流
			InputStream is =new FileInputStream(src);
			OutputStream os =new FileOutputStream(dest);
			//3、文件拷贝   循环+读取+写出
			byte[] flush =new byte[1024];
			int len =0;
			//读取
			while(-1!=(len=is.read(flush))){
				//写出
				os.write(flush, 0, len); // 将真实得到的len长度写出去
			}
			os.flush(); //强制刷出
			
			//关闭流  先打开的后关闭 
			os.close();
			is.close();
		}

}

3 文件拷贝工具类:  注意体会里面的注释

/**
 * 文件操作
 * 1、文件拷贝
 * 2、文件夹拷贝  拒绝自己拷贝给自己
 * @author Administrator
 *
 */
public class FileUtil {
	/**
	 * 拷贝文件夹
	 * @param src 源路径
	 * @param dest 目标路径
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void copyDir(String  srcPath,String destPath) throws FileNotFoundException, IOException{
		//拒绝自己拷贝给自己
		if(srcPath.equals(destPath)){
			return ;
		}
		File src=new File(srcPath);
		File dest =new File(destPath);
		copyDir(src,dest);		
	}
	
	
	
	/**
	 * 拷贝文件夹
	 * @param src 源File对象
	 * @param dest 目标File对象
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void copyDir(File src,File dest) throws FileNotFoundException, IOException{
		if(src.isDirectory()){ //文件夹
			dest =new File(dest,src.getName()); // 如果源是文件夹,则在目标dest下在追加源的文件夹名
			if(dest.getAbsolutePath().contains(src.getAbsolutePath())){
				System.out.println("父目录不能拷贝到子目录中");// e:/test/a  不能拷到 e:/test/a/b下
				return;
			}
		}		
        if(dest.exists()) { // 目标文件夹已经存在了  w文件夹不能直覆盖 文件可以  文件夹内可以有东西 因此不能直接覆盖
			System.out.println("目标文件夹已经存在了");
			return;
		}
		copyDirDetail(src,dest);
	}
	
	/**
	 * 拷贝文件夹细节
	 * @param src
	 * @param dest
	 */
	public static void copyDirDetail(File src,File dest) throws FileNotFoundException,IOException{
		if(src.isFile()){ //文件
			try {
				FileUtil.copyFile(src, dest);
			} catch (FileNotFoundException e) {
				//e.printStackTrace();
				throw e;
			} catch (IOException e) {
				//e.printStackTrace();
				throw e;
			}
		}else if(src.isDirectory()){ //文件夹
			//确保目标文件夹存在
			dest.mkdirs();
			//获取下一级目录|文件
			for(File sub:src.listFiles()){
				copyDirDetail(sub,new File(dest,sub.getName()));
			}
		}
	}
	
	
	/**
	 * 文件的拷贝
	 * @param  源文件路径
	 * @param  目录文件路径
	 * @throws FileNotFoundException,IOException
	 * @return 
	 */
	public static void copyFile(String srcPath,String destPath) throws FileNotFoundException,IOException {
		//1、建立联系 源(存在且为文件) +目的地(文件可以不存在) 
		copyFile(new File(srcPath),new File(destPath));
	}
	/**
	 * 文件的拷贝
	 * @param  源文件File对象
	 * @param  目录文件File对象
	 * @throws FileNotFoundException,IOException
	 * @return 
	 */
	public static void copyFile(File src,File dest) throws FileNotFoundException,IOException {
		if(! src.isFile()){ //不是文件或者为null
			System.out.println("只能拷贝文件");
			throw new IOException("只能拷贝文件");
		}
		//dest为已经存在的文件夹,不能建立于文件夹同名的文件
		if(dest.isDirectory()){
			System.out.println(dest.getAbsolutePath()+"不能建立于文件夹同名的文件");
			throw new IOException(dest.getAbsolutePath()+"不能建立于文件夹同名的文件");
		}
		
		
		//2、选择流
		InputStream is =new BufferedInputStream(new FileInputStream(src));
		OutputStream os =new BufferedOutputStream(new FileOutputStream(dest));
		//3、文件拷贝   循环+读取+写出
		byte[] flush =new byte[1024];
		int len =0;
		//读取
		while(-1!=(len=is.read(flush))){
			//写出
			os.write(flush, 0, len);
		}
		os.flush(); //强制刷出
		
		//关闭流
		os.close();
		is.close();
	}
}

 FileUtil 追加方法: 关闭流公共方法

	/**
	 * 工具类关闭流
	 * 可变参数: ...  只能形参最后一个位置,处理方式与数组一致
	 */
	public static void close(Closeable ... io){
		for(Closeable temp:io){
			try {
				if (null != temp) {
					temp.close();
				}
			} catch (Exception e) {
			}
		}
		
	}
	
	/**
	 * 使用泛型方法
	 */
	public static <T extends Closeable> void closeAll(T ... io){
		for(Closeable temp:io){
			try {
				if (null != temp) {
					temp.close();
				}
			} catch (Exception e) {
			}
		}
	}

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2400593
今日推荐