`
精神分裂
  • 浏览: 29344 次
  • 性别: Icon_minigender_1
  • 来自: 二次元世界
社区版块
存档分类
最新评论

对Java IO的一些总结 (2)

    博客分类:
  • Java
阅读更多
注:文中使用部分方法请参考《对Java IO的一些总结 (1) 》

移动文件和目录的关键技术如下:
1. File的renameTo方法能移动文件。
2. 当目标文件存在,或者目标的父目录不存在时,renameTo方法返回false。
    /**
	 * 移动单个文件
	 * @param srcFileName 待移动的源文件名
	 * @param targetFileName 目标文件名
	 * @param overlay 如果目标文件存在,是否覆盖
	 * @return 文件移动成功返回true,否则返回false
	 */
	public static boolean moveFile(String srcFileName, String targetFileName, boolean overlay) {
		File srcFile = new File(srcFileName);
		if (!srcFile.exists()) {
			System.out.println("The \"" + srcFileName + "\" is not exists.");
			return false;
		} else if (!srcFile.isFile()) {
			System.out.println("The \"" + srcFileName + "\" is not an file.");
			return false;
		}
		File tarFile = new File(targetFileName);
		if (tarFile.exists()) { //目标文件存在
			// 如果允许文件覆盖
			if (overlay) {
				if (!delete(targetFileName)) {
					System.out.println("Delete target file \"" + targetFileName + "\" fail.");
					return false;
				}
			} else {
				System.out.println("Target file \"" + targetFileName + "\" already exists.");
				return false;
			}
		} else { //目标文件所在的目录不存在,则创建目录
			if (!tarFile.getParentFile().exists()) {
				if (!tarFile.getParentFile().mkdirs()) {
					System.out.println("Create directory of file \"" + targetFileName + "\" fail.");
					return false;
				}
			}
		}
		// 移动源文件至目标文件
		if (srcFile.renameTo(tarFile)) {
			System.out.println("Move file \"" + srcFileName + "\" to \"" + targetFileName + "\" success.");
			return true;
		} else {
			System.out.println("Move file \"" + srcFileName + "\" to \"" + targetFileName + "\" fail.");
			return false;
		}
	}


	/**
	 * 移动目录
	 * @param srcDirName 待移动的源目录名
	 * @param tarDirName 目标目录名
	 * @param ovelay 如果目标目录存在,是否覆盖
	 * @return 目录移动成功返回true,否则返回false
	 */
	public static boolean moveDirectory(String srcDirName, String tarDirName, boolean overlay) {
		File srcDir = new File(srcDirName);
		if (!srcDir.exists()) {
			System.out.println("The \"" + srcDirName + "\" not exists.");
			return false;
		} else if (!srcDir.isDirectory()) {
			System.out.println("The \"" + srcDirName + "\" is not an directory.");
			return false;
		}
		// 如果目标文件夹名不是以文件分隔符结尾,自动添加文件分隔符
		if (!tarDirName.endsWith(File.separator)) {
			tarDirName = tarDirName + File.separator;
		}
		File tarDir = new File(tarDirName);
		// 如果目标文件存在
		if (tarDir.exists()) {
			if (overlay) {
				// 允许覆盖则删除已存在的目标目录
				if (!delete(tarDirName)) {
					System.out.println("Delete target directory \"" + tarDirName + "\" fail.");
					return false;
				} else {
					System.out.println("Target directory \"" + tarDirName + "\" already exists.");
					return false;
				}
			}
		} else {
			// 创建目标目录
			if (!tarDir.mkdirs()) {
				System.out.println("Create directory \"" + tarDirName + "\" fail.");
				return false;
			}
		}
		boolean flag = true;
		// 移动源目录下的文件和子目录到目标目录下
		File[] files = srcDir.listFiles();
		for (int i = 0; i < files.length; i++) {
			// 移动子文件
			if (files[i].isFile()) {
				flag = moveFile(files[i].getAbsolutePath(),
						tarDirName + files[i].getName(), overlay);
				if (!flag) {
					break;
				}
			} else if (files[i].isDirectory()) {// 移动子目录
				flag = moveDirectory(files[i].getAbsolutePath(),
						tarDirName + files[i].getName(), overlay);
				if (!flag) {
					break;
				}
			}
		}
		if (!flag) {
			System.out.println("Move directory \"" + srcDirName + "\" to \"" + tarDirName + "\" fail.");
			return false;
		}
		// 删除原目录
		if (deleteDir(srcDirName)) {
			System.out.println("Move directory \"" + srcDirName + "\" to \"" + tarDirName + "\" success.");
			return true;
		} else {
			System.out.println("Move directory \"" + srcDirName + "\" to \"" + tarDirName + "\" fail.");
			return false;
		}
	}


复制文件和目录的关键技术点如下:
1. FileInputStream类是文件输入流,根据文件路径可以构造一个FileInputStream对象。
2. FileInputStream的read实例方法从文件输入流中读取数据,即读取文件内容。
3. FileOutputStream类是文件输出流,根据文件路径可以构造一个FileOutputStream对象。
4. FileOutputStream的write实例方法将数据写入到输出流中,即往文件中写内容。
5. 读写文件结束后,需要关闭文件输入、输出流。
	/**
	 * 复制单个文件
	 * @param srcFileName 待复制的文件名
	 * @param tarFileName 目标文件名
	 * @param overlay 如果目标文件存在是否覆盖
	 * @return 如果复制成功返回true,否则返回false
	 */
	public static boolean copyFile(String srcFileName, String tarFileName, boolean overlay) {
		//判断源文件是否存在
		File srcFile = new File(srcFileName);
		if (!srcFile.exists()) {
			System.out.println("The \"" + srcFileName + "\" is not exists.");
			return false;
		} else if (!srcFile.isFile()) {
			System.out.println("The \"" + srcFileName + "\" is not an file.");
			return false;
		}
		
		//判断目标文件是否存在
		File tarFile = new File(tarFileName);
		if (tarFile.exists()) { //如果目标文件存在,而且复制时允许覆盖
			if (overlay) {
				//删除已存在的目标文件,无论目标文件是目录还是单个文件
				if (!delete(tarFileName)) {
					System.out.println("Delete target file \"" + tarFileName + "\" fail.");
					return false;
				}
			} else {
				System.out.println("Target file \"" + tarFileName + "\" already exists.");
				return false;
			}
		} else { //如果目标文件存在,查看其所在目录是否存在
			if (!tarFile.getParentFile().exists()) { //如果目标文件所在的目录不存在,则创建目录
				if (!tarFile.getParentFile().mkdirs()) {
					System.out.println("Create directory of file \"" + tarFileName + "\" fail.");
					return false;
				}
			}
		}
		int byteread = 0; //读取的字节数
		InputStream in = null;
		OutputStream out = null;
		try {
			in = new FileInputStream(srcFile);
			out = new FileOutputStream(tarFile);
			byte[] buffer = new byte[1024];
			//一次读取1024个字节,当byteread为-1时表示文件已经读完
			while ((byteread = in.read(buffer)) != -1) {
				out.write(buffer, 0, byteread); //将读取的字节流写入输出流
			}
			System.out.println("Copy file \"" + srcFileName + "\" to \"" + tarFileName + "\" success.");
			return true;
		} catch (Exception e) {
			System.out.println("Copy file \"" + srcFileName + "\" to \"" + tarFileName + "\" fail." 
					+ "\"n" + e.getMessage());
			return false;
		} finally { //关闭输入输出流,注意先关闭输出流,再关闭输入流
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}


	/**
	 * 复制整个目录的内容
	 * @param srcDirName 待复制的目录名
	 * @param tarDirName 目标目录名
	 * @param overlay 如果目标文件存在,是否覆盖
	 * @return 如果复制成功返回true,否则返回flase
	 */
	public static boolean copyDirectory(String srcDirName, String tarDirName, boolean overlay) {
		// 判断源目录是否存在
		File srcDir = new File(srcDirName);
		if (!srcDir.exists()) {
			System.out.println("The \"" + srcDir + "\" is not exists.");
			return false;
		} else if (!srcDir.isDirectory()) {
			System.out.println("The \"" + srcDir + "\" is not an directory.");
			return false;
		}
		if (!tarDirName.endsWith(File.separator)) {
			tarDirName = tarDirName + File.separator;
		}
		File tarDir = new File(tarDirName);
		if (tarDir.exists()) {
			if (overlay) {
				if (!delete(tarDirName)) {
					System.out.println("Delete target directory \"" + tarDirName + "\" fail.");
					return false;
				}
			} else {
				System.out.println("Target directory \"" + tarDirName + "\" already exists.");
				return false;
			}
		}
		boolean flag = true;
		File[] files = srcDir.listFiles();
		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				flag = copyFile(files[i]
						.getAbsolutePath(), tarDirName + files[i].getName());
				if (!flag) {
					break;
				}
			}
			if (files[i].isDirectory()) {
				flag = copyDirectory(files[i]
						.getAbsolutePath(), tarDirName + files[i].getName());
				if (!flag) {
					break;
				}
			}
		}
		if (!flag) {
			System.out.println("Copy directory \"" + srcDirName + "\" to \"" + tarDirName + "\" fail.");
			return false;
		}
		System.out.println("Copy directory \"" + srcDirName + "\" to \"" + tarDirName + "\" success.");
		return true;
	}
分享到:
评论

相关推荐

    Java io流总结

    Java io流的总结

    Java_IO完全总结

    2. **层次结构**:Java IO系统采用层次化的结构设计,使得用户可以根据需求选择合适的流进行组合使用。 3. **可扩展性**:通过装饰器模式和过滤器模式,可以轻松地扩展流的功能。 4. **灵活性**:Java IO系统提供了...

    JavaIO总结

    有关Java输入输出流的总结有关Java输入输出流的总结有关Java输入输出流的总结

    JAVA_IO流学习总结

    JAVA_IO流学习总结

    Java IO流 总结

    Java IO流总结 Java IO流是Java语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...

    JavaIO流详细总结

    下面是对Java IO流的详细总结: 1. 流的概念: 流是一种抽象的数据传输方式,可以将数据从一个地方传输到另一个地方。Java中的流分为输入流和输出流,分别用于读取和写入数据。流按照处理数据的不同类型,又可以...

    Java IO流总结

    除了基本的读写操作,Java IO流还支持缓冲流,如BufferedInputStream和BufferedReader,它们可以提高读写效率,减少对底层资源的频繁调用。此外,还有过滤流,如DataInputStream和PrintStream,它们提供了额外的功能...

    JAVA的IO流总结

    java的IO流总结:包含Inputstream,OutputStream,writer和reader

    JAVAIO流学习总结(转)

    这是别人总结的很有实用价值的javaIO流教程。

    java_IO完全总结

    Java IO完全总结的知识点: 一、历史背景: 1. IO系统设计的困难性:对于编程语言设计人员来说,设计一个功能完善的输入输出系统是非常有挑战性的。需要考虑各种不同的因素,如文件、控制台、网络、内存等的读取方式...

    《JAVA_IO流学习总结》

    总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...

    java IO.chm

    这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...

    JAVAIO操作总结

    本文将对Java IO中的节点流和处理流进行详细的总结。 首先,我们来看一下Java IO的基础——节点流。节点流直接与数据源或数据接收器相连,它们直接处理数据源(如文件、数组或字符串)。Java中的基本节点流分为两大...

    java io惯用总结

    JAVA IO惯用总结_编程大全_优良自学吧

    java IO操作总结

    ### Java IO操作总结 Java IO(输入/输出)是Java编程语言中用于处理数据输入和输出的核心机制。本文档全面总结了Java IO的各种操作,旨在为开发者提供一个深入理解并熟练掌握Java IO技术的资源。 #### 一、临时...

    javaIO流知识大总结

    在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...

    java中的IO操作总结(四)

    java中的IO操作总结(四) 前面已经把java io的主要操作讲完了 这一节我们来说说关于java io的其他内容 Serializable序列化 实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23...

    “Java IO”总结

    这篇文章将对"Java IO"进行深入的总结,涵盖其核心概念、类库和实用技巧。 Java IO系统是Java平台中用于处理输入输出的重要部分,它包括一系列的类和接口,使得程序能够读取和写入各种数据流。Java IO API的设计...

    Java IO_NIO

    总结来说,Java NIO提供了一种更高效、更适合处理并发的IO模型,尤其在服务器端开发中,如高并发的网络应用,NIO的优势更为明显。理解和掌握Java IO与NIO的使用,对于提升Java应用程序的性能和可扩展性至关重要。

Global site tag (gtag.js) - Google Analytics