`
qqdwll
  • 浏览: 136678 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 通过流, nio 移动文件或者文件夹

    博客分类:
  • Java
阅读更多
我们用例子说明java怎样通过不同的方式移动文件或文件夹。

首先, 我们先介绍通过流的例子,你可以很容易把指定的源文件或文件夹移动到目标文件夹中。
程序中, 你需要指定源文件/文件夹和目标文件夹的绝对路径。  如果指定的源文件(夹)不存在, 程序打印出提示信息"File or directory does not exist.", 然后从控制台中推出程序。 如果指定的目标文件夹不存在,程序会提示你是否创建一个新的文件夹。 通过输入"y", 程序就会为你创建一个新的文件夹并且把源文件全部移动到目标文件夹中。 当目标文件夹存在时, 它会征询你是否替换掉已经存在的文件夹。
package io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

import javax.swing.JOptionPane;

public class MovingFile {

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

		int a = 0;

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		System.out
				.print("Enter the file or directory name that has to be moved : ");

		String src = in.readLine();

		if (src.equals("")) {

			System.out.println("Invalid directory or file name.");

			System.exit(0);

		}

		File source = new File(src);

		if (!source.exists()) {

			System.out.println("File or directory does not exist.");

			System.exit(0);

		}

		System.out
				.print("Enter the complete path where file or directory has to be moved: ");

		String dest = in.readLine();

		if (dest.equals("")) {

			System.out.println("Invalid directory or file name.");

			System.exit(0);

		}

		File destination = new File(dest);

		if (!destination.exists()) {

			System.out
					.print("Mentioned directory does not exist. \nDo you want to create a new directory(Y/N)? ");

			String chk = in.readLine();

			if (chk.equals("Y") || chk.equals("y")) {

				destination.mkdir();

				copyDirectory(source, destination);

				a = 1;

			}

			else if (chk.equals("N") || chk.equals("n")) {

				System.exit(0);

			}

			else {

				System.out.println("Invalid Entry!");

				System.exit(0);

			}

		}

		else {

			int num = JOptionPane
					.showConfirmDialog(null,
							"Given file or folder name already exists. \nDo you want to replace now?");

			if (num == 0) {

				copyDirectory(source, destination);

				a = 1;

			}

		}

		if (a == 1) {

			System.out.println("File or directory moved successfully.");

			if (!delete(source)) {

				throw new IOException("Unable to delete original folder");

			}

		} else if (a == 0) {

			System.exit(0);

		}

	}

	public static void copyDirectory(File sourceDir, File destDir)
			throws IOException {

		if (!destDir.exists()) {

			destDir.mkdir();

		}

		File[] children = sourceDir.listFiles();

		for (File sourceChild : children) {

			String name = sourceChild.getName();

			File destChild = new File(destDir, name);

			if (sourceChild.isDirectory()) {

				copyDirectory(sourceChild, destChild);

			}

			else {

				copyFile(sourceChild, destChild);

			}

		}

	}

	public static void copyFile(File source, File dest) throws IOException {

		if (!dest.exists()) {

			dest.createNewFile();

		}

		InputStream in = null;

		OutputStream out = null;

		try {

			in = new FileInputStream(source);

			out = new FileOutputStream(dest);

			byte[] buf = new byte[1024];

			int len;

			while ((len = in.read(buf)) > 0) {

				out.write(buf, 0, len);

			}

		}

		finally {

			in.close();

			out.close();

		}

	}

	public static boolean delete(File resource) throws IOException {

		if (resource.isDirectory()) {

			File[] childFiles = resource.listFiles();

			for (File child : childFiles) {

				delete(child);

			}

		}

		return resource.delete();

	}

}



File object 有个方法叫renameTo, 但这个方法是平台相关的。 我在windows 平台上测试过可以成功。 但没在linux上测试, 所以不清楚这个方法在其它平台上运行的结果。 要是有测试过的朋友, 可以给我留言。 谢谢。
如果可以用这个方法的话, 那方法 copyFile(File source, File dest)  就很简单了, 只需写成:

public static void copyFile(File source, File dest) throws IOException {	
		source.renameTo(dest);
	}



通过NIO的方。
流移动文件, 有个潜在的性能问题, 主要是缓存的原因。 在实际情况下, 需要优化缓存的大小以达到最优的情况。 一般文件不是很大的情况, 在windons下, 2k比较快。NIO就不需要人为的设置缓存了。 但nio的话, 对于超大文件, 几百M或者上G的话, 性能不是很乐观。 但小文件的话, 如果流的缓存没有配置好。nio 的性能是很快的。下面我们用nio的方式新建一个方法替换 copyFile(File source, File dest):
public static void copyFileWithNIO(File sourceFile, File destFile)
			throws IOException {

		if (!destFile.exists()) {
			destFile.createNewFile();
		}

		FileChannel source = null;
		FileChannel destination = null;
		long count = 0;
		try {
			source = new FileInputStream(sourceFile).getChannel();
			long size = source.size();
			destination = new FileOutputStream(destFile).getChannel();
			while( (count += destination.transferFrom(source, count, size-count)) < size );
		} finally {
			if (source != null) {
				source.close();
			}
			if (destination != null) {
				destination.close();
			}
		}

	}
  

但是, Windows, based on configuration, uses either executes a native copy or does the Stream-based copy. Solaris and AIX always uses the Channel implementation.
所以, 对于移动大文件的话, 最好是用流的方式。 那我们干脆判断一下, 如果是大文件, 就用流, 否则就用nio的方式。 我们对copyDirectory(File sourceDir, File destDir)方法改造下:
public static void copyDirectory(File sourceDir, File destDir)
			throws IOException {

		if (!destDir.exists()) {

			destDir.mkdir();

		}

		File[] children = sourceDir.listFiles();

		for (File sourceChild : children) {

			String name = sourceChild.getName();

			File destChild = new File(destDir, name);

			if (sourceChild.isDirectory()) {

				copyDirectory(sourceChild, destChild);

			}

			else {
				long fileSize = sourceChild.length();

				// for larger files (20Mb) use streams
				if ( fileSize > 20971520l )
					copyFile(sourceChild, destChild);
				else
					copyFileWithNIO (sourceChild, destChild);
			}

		}

	}





0
0
分享到:
评论

相关推荐

    java移动文件夹下所有文件

    在Java编程语言中,移动文件夹下所有文件是一项常见的任务,尤其在处理文件系统操作时。这个场景描述了一个程序能够遍历指定文件夹中的所有文件,并将它们移动到另一个目标文件夹,同时保持原有的文件结构。这样的...

    java操作文件、文件夹

    根据提供的文件标题、描述、标签以及部分内容,我们可以总结出以下几个重要的Java知识点,这些知识点与文件操作密切相关: ### 1. 文件和目录的基本操作 #### 1.1 创建目录(文件夹) ```java public static void...

    java 移动指定目录下的文件

    在处理这些文件时,确保正确地读取、写入或移动它们,通常需要使用`InputStream`和`OutputStream`进行字节流操作,或者使用`Files.copy()`方法。 总之,Java提供的API使得移动指定目录下的文件变得简单而直观。通过...

    java编写的命令行文件/文件夹管理程序

    Java编写的命令行文件/文件夹管理程序是一个实用工具,它允许用户通过命令行界面执行常见的文件操作。这种程序在开发、系统管理或者需要高效批量处理文件的场景中非常常见。下面将详细介绍这个程序可能涉及的主要...

    读取文件夹中所有文件中的内容

    为了读取文件夹下的所有文件,我们可以使用`java.nio.file.Files`类中的`newDirectoryStream`方法。该方法可以获取文件夹下的所有子项,并遍历这些子项进行进一步的操作。 ```java Path path = new File(pathname)....

    java文件夹的拷贝

    `copyFile.java`源码文件为我们提供了一个基础的实现,通过理解和扩展这个代码,我们可以根据实际需求构建更强大、更高效的文件拷贝功能。在开发过程中,理解并掌握这些核心概念和方法,对于任何Java开发者来说都是...

    spring boot文件夹文件监听程序

    总的来说,"spring boot文件夹文件监听程序"是一个结合了Java文件系统监听和Spring Boot自动化功能的实用工具,它可以实时监控指定目录,及时响应文件变化,对于文件管理、数据同步等场景具有很高的价值。通过理解并...

    用java实现服务器上多个文件先打包,然后下载

    1. **文件操作**:Java中的`java.io`和`java.nio`包提供了丰富的文件操作API,包括读取、写入、移动和删除文件。 2. **文件打包**:Java的`java.util.zip`包提供了`ZipOutputStream`类,可以用来创建ZIP格式的压缩...

    打开指定的文件以及文件夹的例子

    为了实现"打开指定的文件以及文件夹"的功能,开发者通常会使用操作系统提供的API,如Windows的Shell32库,或者是跨平台的库如Python的`os`和`shutil`模块,或者是Java的`java.io`和`java.nio`包。这些API允许程序...

    Java程序_复制文件.jar

    Java程序“Java程序_复制文件.jar”是一个基于Java平台的实用工具,主要目的是演示如何在Java中实现文件的复制和移动操作。这个程序对于正在学习Java输入/输出(IO)和Swing GUI库的学生来说是一个很好的参考实例。...

    java实现windows文件系统操作监控

    Java的`java.nio.file`包提供了丰富的文件操作接口,如`Files.setPosixFilePermissions()`和`Files.newFileChannel()`,可以用来设置权限和创建文件通道进行锁定。 7. **文件自动加密**:文件加密通常涉及对文件...

    java文件传输工具

    2. **用户界面交互**:用户可以通过简单的拖放操作或选择菜单来上传文件或文件夹。这种直观的交互方式使得文件传输过程对非技术人员也十分友好。 3. **NIO技术**:Java的New IO (NIO) API提供了一种非阻塞的I/O模型...

    NIO2基础介绍

    Path类是java.nio.file包中的一个抽象类,提供了许多方法来操作文件和文件夹。Path类可以在任何文件系统和存储空间上操作文件,默认情况下,Path类引用默认文件系统的文件,但NIO2也是完全模块化的,可以在网络环境...

    java命令行文件管理器

    这个管理器利用Java语言的强大功能,通过命令行界面提供了一系列基本的文件和目录操作,如复制、移动、删除等。在没有图形用户界面(GUI)的情况下,这样的工具对于远程服务器或自动化脚本场景尤其有用。 首先,让...

    Java文件操作源码大全

    3. **删除文件**:`delete()`方法用于删除文件,但只有文件为空或者文件已被关闭时才能成功删除。 4. **删除文件夹**:`delete()`方法同样可以删除空文件夹,非空文件夹则需要递归删除其中的所有文件后再删除。 5....

    JavaFile文件操作

    Java标准库没有直接提供剪切(剪切后移动)文件或文件夹的功能。但可以通过先复制目标,然后删除源文件或文件夹来实现类似的效果。需要注意处理可能出现的异常,如文件正在被使用导致无法删除等。 ```java ...

    java编写的文件管理系统

    这样的系统通常包括一系列核心功能,如文件的创建、读取、更新和删除,以及目录(文件夹)的操作,如创建、浏览和移动。以下是关于Java文件管理系统的一些关键知识点: 1. **Java I/O流**:Java I/O流是文件管理...

    java swing文件管理

    对于更复杂的文件操作,如复制、移动或删除文件,可以使用`java.nio.file`包中的`Files`类。例如,复制一个文件: ```java Path source = Paths.get("source_file_path"); Path target = Paths.get("target_file_...

    文件夹拷贝

    在Java编程语言中,"文件夹拷贝"是一项...通过递归遍历目录和使用流操作拷贝文件,我们可以轻松地在不同位置之间移动或复制文件夹结构。这个过程在软件开发中是不可或缺的,尤其是在涉及到大量数据转移或备份的场景下。

    jsp文件管理器

    这意味着系统可能使用了Java的文件I/O流来读取、创建、删除和移动文件,比如`java.io.File`类用于文件操作,`java.nio`包提供非阻塞I/O功能,使得在处理大量文件时更加高效。同时,系统可能使用了文件夹遍历的递归...

Global site tag (gtag.js) - Google Analytics