文件读写交替执行

文件读写的几种方式

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import org.apache.commons.io.FileUtils;

public class FileTest {

 public static void main(String[] args) throws IOException,Exception{

  long st=System.currentTimeMillis();
  String srcFile="D:\\DBW\\pig-0.14.0.tar.gz";
  String destFile="D:\\DBW\\log\\test.gz";
  
  
  
  copyFileThread(srcFile,destFile);
  
  long et=System.currentTimeMillis();
  System.out.println(et-st);
 }

 static void copyFileCommonIO(String srcFile,String destFile)throws IOException{
  FileUtils.copyFile(new File(srcFile), new File(destFile));//2546
 }
 
 static void copyFileStream(String srcFile,String destFile)throws IOException{//255
  FileInputStream fis=new FileInputStream(new File(srcFile));
  FileOutputStream fos=new FileOutputStream(new File(destFile));
  byte[] buf=new byte[8192];
  BufferedInputStream bs=new BufferedInputStream(fis);
  BufferedOutputStream bos=new BufferedOutputStream(fos);
  
  int len=0;
  
  do{
   len=bs.read(buf, 0, 8192);
   bos.write(buf, 0, len);
  }while(len==8192);
 
  bs.close();
  fis.close();
  bos.close();
  fos.close();
 }
 
 static void copyFileChannel(String srcFile,String destFile)throws IOException{//133
  FileChannel srcChl=new FileInputStream(new File(srcFile)).getChannel();
  FileChannel desChl=new FileOutputStream(new File(destFile)).getChannel();
  desChl.transferFrom(srcChl, 0, Long.MAX_VALUE);
  srcChl.close();
  desChl.close();
 }
 
 static void copyFileThread(String srcFile,String destFile)throws Exception{//480
  FileVO file=new FileVO();
  file.setSrcFile(srcFile);
  file.setDestFile(destFile);
  
  
  WriteThread w=new WriteThread(file);
  ReadThread r=new ReadThread(file);
  Thread t1=new Thread(w);
  t1.start();
  Thread t2=new Thread(r);
  t2.start();
  
  t1.join();
  t2.join();
 }
}

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ReadThread implements Runnable {
 private FileVO file;
 public ReadThread(FileVO file){
  this.file=file;
 }

 public void run() {
  FileInputStream fis=null;
  BufferedInputStream bs=null;
  try {
   fis = new FileInputStream(new File(file.getSrcFile()));
   byte[] buf=new byte[8192];
   bs=new BufferedInputStream(fis);
   int len=0;
   do{
    synchronized(file){
     len=bs.read(buf, 0, 8192);
     //System.out.println("read.."+len);
     file.setLen(len);
     file.setBuf(buf);
     file.notify();
     if(len<8192)
      break;
     file.wait();
    }
   }while(true);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e){
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  finally{
   try {
    bs.close();
    fis.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
 }

}

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class WriteThread implements Runnable {
 private FileVO file;
 public WriteThread(FileVO file){
  this.file=file;
 }
 
 public void run() {
  FileOutputStream fos=null;
  BufferedOutputStream bos=null;
  try {
   fos = new FileOutputStream(new File(file.getDestFile()));
   bos=new BufferedOutputStream(fos);
   do{
   synchronized(file){
    if(file.getLen()==0){
     file.wait();
    }
    //System.out.println("write.."+file.getLen());
    bos.write(file.getBuf(), 0, file.getLen());
    if(file.getLen()<8192)
     break;
    file.setLen(0);
    file.notify();
   }
   }while(true);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e){
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  finally{
   try{
   bos.close();
   fos.close();
   }catch(IOException e){
    e.printStackTrace();
   }
  }
 }

}

public class FileVO {
 private String srcFile;
 private String destFile;
 //private volatile int len;
 private int len;
 private byte[] buf;
 
 public String getSrcFile() {
  return srcFile;
 }
 public void setSrcFile(String srcFile) {
  this.srcFile = srcFile;
 }
 public String getDestFile() {
  return destFile;
 }
 public void setDestFile(String destFile) {
  this.destFile = destFile;
 }
 public int getLen() {
  return len;
 }
 public void setLen(int len) {
  this.len = len;
 }
 public byte[] getBuf() {
  return buf;
 }
 
 
 public void setBuf(byte[] buf) {
  this.buf = buf;
 }
 
 
}

猜你喜欢

转载自zw7534313.iteye.com/blog/2211941
今日推荐