Java IO 实现文件复制 -Java 学习笔记 (25)

Java中的输入输出操作是由Stream(流)来实现的。这个C#,C++这些OO语言是一样的。
Stream是一种很形象的说法。数据在进行IO操作时就像水一样 由这一端流向另一端。 我们在API Docs中可以看到java.io包里面有许多这样名称以Stream结尾的流类。
文件复制源文件

// Coding by zhaohongliang
import  java.io. * ;
public   class  FileCopy  {
    
public static void main(String[] args) {
        String usage 
= "Usage:SourceFile DestinationFile";
        
if(args.length != 2{
            System.out.println(usage);
            System.exit(
-1);
        }

        FileInputStream is 
= null;
        FileOutputStream os 
= null;
        
try {
            
//Stream Construction
            is = new FileInputStream(args[0]);
            os 
= new FileOutputStream(args[1]);
        }

        
catch (FileNotFoundException e) {
            System.out.println(
"Error:File not found");
            System.out.println(usage);
            System.exit(
-1);
        }

        
int temp;
        
//Stream operation
        try {
            
while ((temp=is.read()) != -1{
                os.write(temp);
            }

            is.close();
            os.close();
        }

        
catch (IOException e) {
            System.out.println(
"Error:File copy failed.");
            System.out.println(usage);
            System.exit(
-1);
        }

        System.out.println(
"Copy Complete.");
    }

}

这里有一个问题,CPU处理速度远大于IO速度,以上程序中CPU每处理一个字节就要进行一次IO操作,这样降低了系统效率,而且过于频繁的IO操作对外存储器是一种严峻的考验。所以引入buffer缓冲区是很有必要的。缓冲区就是一段内存空间,当读入Stream时,并没有直接对其进行处理,而是先把Stream数据放入buffer中,等到buffer满后或是进行flush操作再一次性进行处理。这样就大大减少了IO操作的次数。我们在API Docs看到的Buffered开头的Stream类就是带缓冲区Buffer的类。
改造后的代码:

// Coding by nyzhl
import  java.io. * ;
public   class  FileCopy  {
    
public static void main(String[] args) {
        String usage 
= "Usage:SourceFile DestinationFile";
        
if(args.length != 2{
            System.out.println(usage);
            System.exit(
-1);
        }

        
//Stream defination
        BufferedInputStream is = null;
        BufferedOutputStream os 
= null;
        
try {
            
//Stream construction
            FileInputStream fis = new FileInputStream(args[0]);
            FileOutputStream fos 
= new FileOutputStream(args[1]);
            is 
= new BufferedInputStream(fis);
            os 
= new BufferedOutputStream(fos);
        }

        
catch (FileNotFoundException e) {
            System.out.println(
"Error:File not found");
            System.out.println(usage);
            System.exit(
-1);
        }

        
int temp;
        
//Stream operation
        try {
            
while ((temp=is.read()) != -1{
                os.write(temp);
            }

            is.close();
            os.close();
        }

        
catch (IOException e) {
            System.out.println(
"Error:File copy failed.");
            System.out.println(usage);
            System.exit(
-1);
        }

        System.out.println(
"Copy Complete.");
    }

}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值