现在的位置: 首页 > 综合 > 正文

20110830 java IO处理学习—-一个自写文件复制类

2018年05月11日 ⁄ 综合 ⁄ 共 2278字 ⁄ 字号 评论关闭

要说java 的IO处理因为有了很多类看起来是很方便的,虽然都封装好了很多算法细节,但是如果只看JDK 文档的说明还是十分困惑的,比如说BufferedReader类里面的readLine()方法,刚开始的时候光看名字我一直以为是读取行可以间接读取的,其实是不可以间接读取的,在自写的实现类似功能的模仿类的时候,因为想实现异步的读取行操作所以做了很多无谓的工作,还是没办法写出来比较好的方法。

为什么很难写出来比较好的方法呢?

有一部分原因是基于这个IO系统本身的复杂性,如果说 C语言的话虽然很多功能需要自己算法实现,但是还算简单,如果你一开始莫名其妙的不知道该用哪个类的话,我觉得这是一点也不奇怪的,还有十分古怪的装饰模式,我认为这是个很好的东西,但是就我自己说的话还是太复杂了,不过这倒和java的庞大特性很符合,其实我一直在追求的是内在的东西,如果不去探索内在只是每天学别人的代码敲来敲去,我认为是完全没有意义的,所以我尽量让自己的小练习里面有点自己设计的东西在里面。

但是做的还是不太好,因为写的时候感觉不很自信,有没好设计,不过过度阶段还是难免的,先上程序吧。

我想考SCJP啊!上帝保佑!

/*
*20110830作业
*简单实现了一个文件复制的操作,目前设计不到位的地方是不可以复制目录,没有写嵌套复制操作,而且File 类不太好用
×实现目标目录建立的时候不好操作,具体使用方法见主方法
*另外对参数类型的判断也不是特别到位,以后改进
×Younger.shen 申延刚 
×younger.x.shen@gmail.com
*blog: http://blog.csdn.net/hack2me
*/


import java.io.*;

public class CopyFileDemon{

	private File source = null;
	private File destination = null;
	private FileInputStream fis = null;
	private FileOutputStream fos = null;
	private String destPath = null;
	private byte[] buffer = new byte[1024*5];

	

	public CopyFileDemon(String s , String dPath,String d){
	
		source = new File(s);
		destPath = dPath;
		destination = new File(d);
	}

	private void copyFile(){
	
		//int length = 0;

		try{

			fis = new FileInputStream(source);
			//length = fis.available();
		
		}catch(IOException e){
		
			e.printStackTrace();
			System.out.println("读取失败或文件不存在");
			
			if(fis != null){
				try{
				
					fis.close();
				}catch(IOException ex){
				
					System.out.println("close file error");
				}
			}
			System.exit(0);
		}
			
		
			try{	
				//System.out.println("fun");

				if(!destination.exists()){
					
				
					File temp = new File(destPath);
					temp.mkdirs();

				}
			
				try{
				
					fos = new FileOutputStream(destPath+destination.getName());
				
				}catch(FileNotFoundException e){
					
						System.out.println("创建文件失败,可能是由于目录名和文件名冲突,请重新尝试");
				}
			
				int c = 0;
				long sum = 0;
				while((c=fis.read(buffer))!=-1){
					
					sum += c;

					try{
					
						fos.write(buffer, 0, c);
						long length = source.length();
						System.out.print((sum*100/length)+"%");
						System.out.print( "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");

						//System.out.println((int)(sum/length)+"%");

					}catch(NullPointerException e){
					
						
					}
				}



			}catch(Exception e){
			
				e.printStackTrace();
		
			}finally{
				
				try{
					if(fos!=null)
					fos.close();
					if(fis!=null)
						fis.close();
				}catch(IOException e){
				
					System.out.println("close file error");
				}
			}
	}

	

	public static void main(String[] args){
	
		if(args.length ==3){
		
				CopyFileDemon index = new CopyFileDemon(args[0],args[1],args[2]);
				index.copyFile();
			
		}else{
			
			System.out.println("请使用完全路径,第一个参数是原文件");
			System.out.println("第二个参数是目标文件的目录 ");
			System.out.println("第三个参数是目标文件名 ");
			System.out.println("java CopyFileDemon  c:/1.txt d:/ 2.txt ");
		
	}


}
	}

抱歉!评论已关闭.