JAVA编写程序,把C盘根目录的文本test.dat复制到D盘根目录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA编写程序,把C盘根目录的文本test.dat复制到D盘根目录相关的知识,希望对你有一定的参考价值。
使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢?java NIO 性能提升.
第一种方法:古老的方式
Java代码
public static long forJava(File f1,File f2) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
byte[] buffer=new byte[length];
while(true)
int ins=in.read(buffer);
if(ins==-1)
in.close();
out.flush();
out.close();
return new Date().getTime()-time;
else
out.write(buffer,0,ins);
public static long forJava(File f1,File f2) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
byte[] buffer=new byte[length];
while(true)
int ins=in.read(buffer);
if(ins==-1)
in.close();
out.flush();
out.close();
return new Date().getTime()-time;
else
out.write(buffer,0,ins);
方法的2参数分别是原始文件,和拷贝的目的文件.这里不做过多介绍.
实现方法很简单,分别对2个文件构建输入输出流,并且使用一个字节数组作为我们内存的缓存器, 然后使用流从f1 中读出数据到缓存里,在将缓存数据写到f2里面去.这里的缓存是2MB的字节数组
第2种方法:使用NIO中的管道到管道传输
Java代码
public static long forTransfer(File f1,File f2) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
int i=0;
while(true)
if(inC.position()==inC.size())
inC.close();
outC.close();
return new Date().getTime()-time;
if((inC.size()-inC.position())<20971520)
length=(int)(inC.size()-inC.position());
else
length=20971520;
inC.transferTo(inC.position(),length,outC);
inC.position(inC.position()+length);
i++;
public static long forTransfer(File f1,File f2) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
int i=0;
while(true)
if(inC.position()==inC.size())
inC.close();
outC.close();
return new Date().getTime()-time;
if((inC.size()-inC.position())<20971520)
length=(int)(inC.size()-inC.position());
else
length=20971520;
inC.transferTo(inC.position(),length,outC);
inC.position(inC.position()+length);
i++;
实现方法:在第一种实现方法基础上对输入输出流获得其管道,然后分批次的从f1的管道中像f2的管道中输入数据每次输入的数据最大为2MB
方法3:内存文件景象写(读文件没有使用文件景象,有兴趣的可以回去试试,,我就不试了,估计会更快)
Java代码
public static long forImage(File f1,File f2) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
RandomAccessFile out=new RandomAccessFile(f2,"rw");
FileChannel inC=in.getChannel();
MappedByteBuffer outC=null;
MappedByteBuffer inbuffer=null;
byte[] b=new byte[length];
while(true)
if(inC.position()==inC.size())
inC.close();
outC.force();
out.close();
return new Date().getTime()-time;
if((inC.size()-inC.position())<length)
length=(int)(inC.size()-inC.position());
else
length=20971520;
b=new byte[length];
inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);
inbuffer.load();
inbuffer.get(b);
outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);
inC.position(b.length+inC.position());
outC.put(b);
outC.force();
public static long forImage(File f1,File f2) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
RandomAccessFile out=new RandomAccessFile(f2,"rw");
FileChannel inC=in.getChannel();
MappedByteBuffer outC=null;
MappedByteBuffer inbuffer=null;
byte[] b=new byte[length];
while(true)
if(inC.position()==inC.size())
inC.close();
outC.force();
out.close();
return new Date().getTime()-time;
if((inC.size()-inC.position())<length)
length=(int)(inC.size()-inC.position());
else
length=20971520;
b=new byte[length];
inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);
inbuffer.load();
inbuffer.get(b);
outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);
inC.position(b.length+inC.position());
outC.put(b);
outC.force();
实现方法:跟伤2个例子不一样,这里写文件流没有使用管道而是使用内存文件映射(假设文件f2在内存中).在循环中从f1的管道中读取数据到字节数组里,然后在像内存映射的f2文件中写数据.
第4种方法:管道对管道
Java代码
public static long forChannel(File f1,File f2) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
ByteBuffer b=null;
while(true)
if(inC.position()==inC.size())
inC.close();
outC.close();
return new Date().getTime()-time;
if((inC.size()-inC.position())<length)
length=(int)(inC.size()-inC.position());
else
length=2097152;
b=ByteBuffer.allocateDirect(length);
inC.read(b);
b.flip();
outC.write(b);
outC.force(false);
注:参数中的File可以这样定义:
FIle f1 = new File("C:\\test.dat");
File f2 = new File("D:\\test.dat"); 参考技术A 代码没有给你个思路:
1,创建2个文件操作流一个读,一个写。
2,先创建要生成的文件,然后开始循环读源文件,然后每次将读到的数据写到生成的文件里去。
3,关闭2个文件流。 参考技术B import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class CopyFile
public static void main(String[] args) throws FileNotFoundException, IOException
Copy("D://a.java","D://text.txt");//第一个是目标文件的目录,第二个是你想拷贝的目录
public static void Copy(String F,String D) throws IOException, FileNotFoundException
String file = F;
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "GBK"));
PrintWriter w = new PrintWriter(new OutputStreamWriter(
new FileOutputStream(D), "utf-8"));
// .readLine(); 每次读取一行, 到 \n,\r为止
// 如果到文件末尾, 返回null
String str;
while ((str = in.readLine()) != null)
System.out.println(str);
w.write(str + "\n");
in.close();
w.close();
Java第一天 编写java程序
记事本编写,源文件后缀.java;
使用编译器(compiler)javac编译为字节码文件(.class, 系统无关); //"e:"到e盘根目录,"dir"显示目录, 输入"javac Helloworld.java"编译成功后,目录下多了一个.class文件(可以直接打开,乱码)
使用解释器(interpreter)java命令去解释字节码文件; //输入"java Helloworld", java命令是解释工具,后面的文件不能加后缀;直接执行。
得到运行结果。
以上是关于JAVA编写程序,把C盘根目录的文本test.dat复制到D盘根目录的主要内容,如果未能解决你的问题,请参考以下文章