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盘根目录的主要内容,如果未能解决你的问题,请参考以下文章

文件的基本操作---复制/移动或删除文件

Java第一天 编写java程序

JDK如何编译JAVA文件 !急!!

怎样编写程序在当前试题目录下创建一个文本文件用python?

java如何执行cmd命令

怎么把exe做成服务