文件读写的几种方式
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;
}
}