怎样使用java编程实现文件的剪切/移动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样使用java编程实现文件的剪切/移动相关的知识,希望对你有一定的参考价值。

一种方法是先用Stream复制,再删除旧文件,可这样很慢啊
对于windows中同磁盘下的文件剪切有什么优化方案么
(win下剪切100G+的文件都可以很快啊)

或者C/C++也可
我看了大家的方法,低层仍然使用的流来完成
而我听说win是另一种方法来优化(针对同磁盘下):
文件并不移动,而只是将指向文件的路径换成新的(这个同一个磁盘下才有效)
这样不管文件有多大移动都会很快(因为文件实际上没移动,只是路径被修改了)
JVM能实现上面的功能么,还是要C之类和Win更紧密的语言来实现

可以通过BufferedReader 流的形式进行流读取,之后通过readLine方法获取到的内容,之后通过if判断来实现在某些特定位置的内容的剪切和移动操作。
举例:
BufferedReader bre = null;
OutputStreamWriter pw = null;//定义一个流
try
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
pw = new OutputStreamWriter(new FileOutputStream(“D:/test.txt”),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.txt”实例
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环

if(str.indexOf("排除")<0)//判断是否需要舍弃
pw.write(str);//将要写入文件的内容,可以多次write


bre.close();//关闭流
pw.close();//关闭流
解释:以上方法是实现的删除,if中的条件改变下,即可实现其余的功能。
备注:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
参考技术A

ok,我也是刚刚整完了一个小的需求,改变了同一块磁盘上的文件的目录结构,需要使用到所谓的剪切的问题。

Java移动文件的话很简单, 使用File类的renameTo(File file)方法就能搞定

例如:原文件在C:\\\\User\\\\Program\\\\System\\\\nihao.txt,想把它移动到D:/Source文件夹中

class Test

public static void main(String[] arr)

//原文件路径

String source="C:\\\\User\\\\Program\\\\System\\\\nihao.txt";

//原文件File类对象

File sourceFile=new File(source);

//目标文件夹路径

String targetDir="D:\\\\Source";

//获取原文件的名字 ,此时是nihao.txt

String docName=sourceFile.getName();

//拼接目标的文件夹全路径

String targetPath=targetDir+"\\\\"+sourceFile.getName();

//创建目标文件夹的File类,并判断是否存在,如果不存在则创建对应的文件夹

File targetFile=new File(targetDir);

if(!targetFile.exists()) 

targetFile.mkdirs();

//重命名即可以实现对应的功能

sourceFile.renameTo(new File(targetPath));


总结:

    上述代码只是简单的移动操作,没有实现文件夹的复制移动,当然实现起来很简单,使用递归就可以完成对应的操作;

    当然可以将上述代码再写一个递归整理成一个方法,以后直接用就行,也可以写一个properties文件控制对应的原文件路径以及目标路径

    同磁盘,比如都是C盘的移动很快,但是不同磁盘之间传输大文件会使用很多IO资源

    曾有人说用多线程的方式实现,但是一台电脑的话没有必要,多线程的话会频繁使用磁头寻址,效率会低于单线程。因为此时的瓶颈并不是CPU而是磁盘IO。

参考技术B 用多线程啊。
如果是多个文件,就每个线程处理一个文件。如果文件体积较大,但数目不大的话,就用多个线程分段读取文件的部分。再写入到相应的位置。
参考技术C 如果是Windows平台的话,可以用DOS命令行控制。。。这是一种方法。。。记得是Runtime这个包吧。。。最近学了JavaWeb Swing都快忘光了。。。 楼上的也是一个好方法。但是如果没教到可能有点难掌握吧。。追问

是用java调用dos命令么,是哪个类?
如果你是指cmd窗口下输入命令恐怕就有问题,因为我还要先用程序进行判断

追答

可以动态更改命令的。。。你把需要变动的字符串用StringBuffer保存,然后用append方式附加上去,最后再执行。。。
调用命令行:Process proc = Runtime.getRuntime().exec(command);

感觉没那么容易做到。。。而且你要的是速度吧。。但这样可能就丢失多平台的应用了饿。。。

我知道Windows是这样做的。。。同盘下只是更改文件表的路径而不变动文件的位置,这样能快一点,但是复制好像就不是这样了。复制还是生成一份新的再记录进文件表里的。。当改到这样一个文件(也就是多个副本)时其他的文件中的内容才不会跟着一起改变。。。不知道我说的清不清楚。。
其实我也不大懂这种技术,只是以前看过相关的资料才知道的。。。

本回答被提问者采纳
参考技术D 使用 FileChannel的transferTo方法。

jdk 7的java.nio.file.Files 类提供了一个 move方法移动文件。

java实现文件或文件夹赋值剪切

java中将文件复制到另一个路径,实际上就是通过io流把文件读取到另一路径下。而剪切则是复制完成后删除原文件,可用以下代码实现。

<pre name="code" class="java">/**
 * @param origPath 需复制的文件路径
 * @param newPath  复制到相应位置的文件路径
 * @description 复制文件
 */
public static boolean copyFile(String origPath, String newPath)
	File o = new File(origPath);
	try
		if(o.isFile())
			copy(o, newPath,false);
		
	catch(Exception e)
		e.printStackTrace();
	
	return false;


/**
 * 
 * @param origPath 需复制的文件夹名
 * @param newPath 复制到文件夹名
 * @return boolean 是否复制成功
 * @description 复制文件夹
 */
public static boolean copyDirectiory(String origPath, String newPath)
	File o = new File(origPath);
	try
		if(o.isDirectory())
			copy(o, newPath,false);
		
	catch(Exception e)
		e.printStackTrace();
	
	return false;



/**
 * @param origPath 需剪切的文件路径
 * @param newPath 剪切到相应位置的文件路径
 * @description 剪切文件
 */
public static boolean cutFile(String origPath, String newPath)
	File o = new File(origPath);
	try
		if(o.isFile())
			copy(o, newPath,true);
		
	catch(Exception e)
		e.printStackTrace();
	
	return false;


/**
 * 
 * @param origPath 剪切制的文件夹名
 * @param newPath 剪切到文件夹名
 * @return boolean 剪切复制成功
 * @description 剪切文件夹
 */
public static boolean cutDirectiory(String origPath, String newPath)
	File o = new File(origPath);
	try
		if(o.isDirectory())
			copy(o, newPath,true);
		
	catch(Exception e)
		e.printStackTrace();
	
	return false;


/**
 * @param origPath 需复或剪切制的文件File对象
 * @param newPath 需复或剪切到路径
 * @param isCut 是否剪切
 * @throws IOException
 * @description 需复或剪切
 */
public static void copy(File o, String newPath,boolean isCut) throws IOException
	InputStream is = null;
	OutputStream os = null;
	try
		File n = new File(newPath);
		File p = n.getParentFile();
		//复制位置父目录是否存在,不存在则创建
		if(!p.exists())
			p.mkdirs();
		//复制对象为文件夹
		if(o.isDirectory())
			if(!n.exists())
				n.mkdir();
			//获取文件下所有子对象
			File[] files = o.listFiles();
			for (File file : files) 
				String path = newPath;
				if(!path.endsWith(File.separator))
					path += File.separator;
				path += file.getName();
				copy(file, path,isCut);
			
		
		//复制对象为文件
		else
			if(!n.exists())
				n.createNewFile();
			is = new FileInputStream(o);
			os = new FileOutputStream(n);
			byte[] b = new byte[1024];
			while(is.read(b) != -1)
				os.write(b);
			
			os.flush();
		
	finally
		try 
			if(is != null)
				is.close();
			
			if(os != null)
				os.close();
			
			//若isCut为true,复制完成对象后删除原对象
			if(isCut)
				o.delete();
			
		 catch (IOException e) 
			e.printStackTrace();
		
	


/**
 * @param origPath 需复或剪切制的文件路径
 * @param newPath 需复或剪切到路径
 * @param isCut 是否剪切
 * @throws IOException
 * @description 需复或剪切
 */
public static void copy(String origPath, String newPath,boolean isCut) throws IOException
	InputStream is = null;
	OutputStream os = null;
	File o = new File(origPath);
	try
		File n = new File(newPath);
		File p = n.getParentFile();
		//复制位置父目录是否存在,不存在则创建
		if(!p.exists())
			p.mkdirs();
		//复制对象为文件夹
		if(o.isDirectory())
			if(!n.exists())
				n.mkdir();
			//获取文件下所有子对象
			File[] files = o.listFiles();
			for (File file : files) 
				String path = newPath;
				if(!path.endsWith(File.separator))
					path += File.separator;
				path += file.getName();
				copy(file.getPath(), path,isCut);
			
		
		//复制对象为文件
		else
			if(!n.exists())
				n.createNewFile();
			is = new FileInputStream(o);
			os = new FileOutputStream(n);
			byte[] b = new byte[1024];
			while(is.read(b) != -1)
				os.write(b);
			
			os.flush();
		
		//若isCut为true,复制完成对象后删除原对象
		if(isCut)
			o.delete();
	finally
		try 
			if(is != null)
				is.close();
			
			if(os != null)
				os.close();
			
			//若isCut为true,复制完成对象后删除原对象
			if(isCut)
				o.delete();
			
		 catch (IOException e) 
			e.printStackTrace();
		
	
 

以上代码实现多种方式复制或剪切文件或文件夹。

以上是关于怎样使用java编程实现文件的剪切/移动的主要内容,如果未能解决你的问题,请参考以下文章

(JAVA)通过keylistener移动剪切区域

我想用java编一个计算器,面向对象编程

.net编程中BLL/DAL/Model等这些层是干啥的,怎样实现他们的相互连接!

java 的一个小系统编好后,怎么打包??

JAVA操作PDF的几个问题,是高手的进。

java中如何读取json文件,在本地有E:/a.json文件,想读取这个json文件里面的内容,怎样实现