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

对Java IO的一些总结 (1)

    博客分类:
  • Java
阅读更多
多数程序在不获取外部数据的情况下不能顺利完成目标。数据从一个输入源获得,程序的结果被送到输出目的地。
Java程序通过流来完成输入/输出,它是生产和消费信息的抽象。流通过Java的输入/输出系统与物理设备连接,尽管与它们链接的物理设备不尽相同,但是所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备,这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台、磁盘文件或相连的网络。流是处理输入/输出的一个简捷方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是基于Java.io包定义的类层次结构的。

Java的常用输入、输出流其实都是继承自4个抽象类:
基于单字节的InputStream、OutputStream类。
public abstract class InputStream extends Object implements Closeable
public abstract class OutputStream extends Object implements Closeable, Flushable
基于双字节的Unicode代码单元的Reader,Writer类。
public abstract class Reader extends Object implements Readable, Closeable
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
一旦打开输入流后,程序就可从输入流串行地读数据。

从输入流读数据的过程一般如下:
1.open a stream
2.while more information
3.read information
4.close the stream

往输出流写数据的过程一般如下:
1.open a stream
2.while more information
3.write information
4.close the stream

File类的实例是不可变的;也就是说,一旦创建,File对象表示的抽象路径名将永不改变。
通过java.io.File类可以获取文件的属性信息,使用File类的关键点如下:
1. 相对路径:相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。如:"./temp/xx.txt"将指向当前目录的temp子目录下的xx.txt文件。
2. 绝对路径:文件的真是路径。如Linux操作系统下的"/usr/Java/xx.sh",Windows下的"c:/temp/xx.txt"。
3. File类的构造方法的参数可以是文件的相对路径,也可以是文件的绝对路径,它被当作File对象的抽象路径。
4. File类的getName方法获得文件名,该文件名不包含路径信息。
5. File类的getPath方法把抽象路径中的文件分隔符用系统默认文件分隔符替换后返回。windows下的系统默认文件分隔符是"\",linux和UNIX下默认文件分隔符是"/"。
6. File类的getAbsolutePath方法获得文件的绝对路径。
7. File类的isAbsolute方法判断File对象的抽象路径是否为绝对路径。
8. File类的toURI方法获得File对象的URI,以"file:"协议开头。
9. File对象可以指向一个目录,isDirectory方法返回它是否指向目录,isFile方法返回它是否指向一个具体文件。
10. File对象指向的文件可以不存在,exists方法返回它指向的文件是否存在。
	/**
	 * 查看文件属性
	 */
	public static String showFile(String path) {
		//如果dirName不以文件分隔符结尾,自动添加文件分隔符
		if (!path.endsWith(File.separator)) {
			path = path + File.separator;
		}
		File file = new File(path);
		if(file.exists()){
			if(!file.isDirectory()){
				StringBuffer strb = new StringBuffer();
				strb.append("File name: " + file.getName()+"\n");
				strb.append("File Abstract Path: " + file.getPath()+"\n");
				strb.append("File Absolute Path: " + file.getAbsolutePath()+"\n");
				strb.append("File Parental Path: " + file.getParent()+"\n");
				if(file.isHidden()) {
					strb.append("is a Hidden File: Yes"+"\n");
				}else{
					strb.append("is a Hidden File: No"+"\n");
				}
				if(file.canRead()) {
					strb.append("Can Read: Yes"+"\n");
				}else{
					strb.append("Can Read: No"+"\n");
				}
				if(file.canWrite()) {
					strb.append("Can Write: Yes"+"\n");
				}else{
					strb.append("Can Write: No"+"\n");
				}
				if(file.isAbsolute()) {
					strb.append("File path is Absolute Path: Yes"+"\n");
				}else{
					strb.append("File path is Absolute Path: No"+"\n");
				}
				strb.append("Abstract Path URI: " + file.toURI()+"\n");
				strb.append("Abstract Path of parent URI: " + new File(file.getParent()).toURI()+"\n");
				
				strb.append("File Last Modify Time: " + new Date(file.lastModified()) +"\n");
				strb.append("File Szie: " + file.length() + "bytes"+"\n");
				return strb.toString();
			}else{
				return "The path is \"" + path + "\" is a Directory, Not a File.";
			}
		}else{
			return "Not Found the file with this path:"+path;
		}
	}
	
	/**
	 * 查看文件夹属性
	 */
	public static String showDirectory(String path) {
		if (!path.endsWith(File.separator)) {
			path = path + File.separator;
		}
		File dir = new File(path);
		if(dir.exists()){
			if(dir.isDirectory()){
				StringBuffer strb = new StringBuffer();
				strb.append("Directory Name:" + dir.getName()+"\n");
				strb.append("Directory Abstract Path:" + dir.getPath()+"\n");
				strb.append("Directory Absolute Path:" + dir.getAbsolutePath()+"\n");
				strb.append("Directory's Parental:" + dir.getParent()+"\n");
				if(dir.isHidden()) {
					strb.append("Is Hidden Directory:Yes"+"\n");
				}else{
					strb.append("Is Hidden Directory:No"+"\n");
				}
				if(dir.isAbsolute()) {
					strb.append("Directory path is Absolute Path: Yes"+"\n");
				}else{
					strb.append("Directory path is Absolute Path: Yes"+"\n");
				}
				strb.append("Abstract Path URI: " + dir.toURI()+"\n");
				strb.append("Abstract Path of parent URI: " + new File(dir.getParent()).toURI()+"\n");
				strb.append("Directory Last Modify Time: " + new Date(dir.lastModified())+"\n");
				return strb.toString();
			}else {
				return "The path is \"" + path + "\" is a File, Not a Directory.";
			}
		}else {
			return "Not Found the Directory with this path:"+path;
		}
	}


当File对象指向一个目录时,可以通过File对象来获取目录下的文件信息。
1. File类的list方法返回该目录下所有文件(包括目录)的文件名,文件名不包含路径信息。
2. File类的listFile方法返回该目录下所有文件(包括目录)的File对象。
3. FilenameFilter是文件名过滤器接口类,所有自定义的文件名过滤器必须实现改接口的accept方法。
	/**
	 * 列出目录下所有文件包括子目录的文件路径
	 */
	public static void showAllFilesAndDirectory(String path) {
		if (!path.endsWith(File.separator)) {
			path = path + File.separator;
		}
		File dir = new File(path);
		if (!dir.exists() || (!dir.isDirectory())) {
			System.out.println("Not Found the Directory with this path:"+path);
			return;
		}
		File[] files = dir.listFiles();
		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				System.out.println(" ---File: "+files[i].getAbsolutePath());
			} else if (files[i].isDirectory()) {
				System.out.println("Directory: "+files[i].getAbsolutePath());
				showAllFilesAndDirectory(files[i].getAbsolutePath());
			}
		}
	}


创建文件和目录的关键技术点如下:
1. File类的createNewFile根据抽象路径创建一个新的空文件,当抽象路径制定的文件存在时,创建失败。
2. File类的mkdir方法根据抽象路径创建目录。
3. File类的mkdirs方法根据抽象路径创建目录,包括创建必需但不存在的父目录。
4. File类的createTempFile方法创建临时文件,可以制定临时文件的文件名前缀、后缀及文件所在的目录,如果不指定目录,则存放在系统的临时文件夹下。
5. 除mkdirs方法外,以上方法在创建文件和目录时,必须保证目标文件不存在,而且父目录存在,否则会创建失败。
	/**
	 * 创建目录
	 * @param destDirName 目标目录名
	 * @return 目录创建成功返回true,否则返回false
	 */
    public static boolean createDirectory(String dirName) {
    	File dir = new File(dirName);
    	if (dir.exists()) {
            System.out.println("Create directory \"" + dir.getName() + "\" fail."+
            		"\n" + "\"" + dir.getName() +"\" directory is already exist.");
            return false;
        }
    	if (!dirName.endsWith(File.separator)) {
    		dirName = dirName + File.separator;
        }
        if (dir.mkdirs()) {
            System.out.println("Create directory \"" + dir.getName() + "\" success");
            return true;
        } else {
            System.out.println("Create directory \"" + dir.getName() + "\" fail");
            return false;
        }
    }
	
    /**
	 * 创建单个文件
	 * @param filename 目标文件名
	 * @return 创建成功,返回true,否则返回false
	 */
    public static boolean createFile(String filename) {
        File file = new File(filename);
        if(file.exists()) {
        	System.out.println("Create file \"" + file.getName() + "\" fail."+
            		"\n" + "\"" + file.getName() +"\" is already exist.");
            return false;
        }
        if (filename.endsWith(File.separator)) {
            System.out.println("Create file \"" + file.getName() + "\" fail."+
    				"\n" + "\"" + file.getName() +"\" is a directory.");
            return false;
        }
        if(!file.getParentFile().exists()) {
            if(!file.getParentFile().mkdirs()) {
                System.out.println("Create file \"" + file.getName() + "\"'s directory fail.");
                return false;
            }
        }
        try {
        	boolean cresteFileSuccess = file.createNewFile();
            if (cresteFileSuccess) {
                System.out.println("Create file \"" + filename + "\" success.");
                return true;
            } else {
                System.out.println("Create file \"" + filename + "\" fail.");
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Create file \"" + filename + "\" with mistake." + e.getMessage());
            return false;
        }
    }


删除文件和目录关键技术点如下:
1. File的delete方法能删除文件和目录。
2. 当File指向一个目录时,只有当目录为空(没有子目录和子文件)时,才能用delete方法将其删除。
    /**
     * 删除单个文件
     * @param fileName 待删除的文件的文件名
     * @return 单个文件删除成功返回true,否则返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        if (file.exists() && file.isFile()) {
        	boolean delsuccess = file.delete();
            if (delsuccess) {
                System.out.println("delete file \"" + fileName + "\" success.");
                return true;
            } else {
                System.out.println("delete file \"" + fileName + "\" fail.");
                return false;
            }
        } else {
        	System.out.println("delete file \"" + fileName + "\" fail." + "\n" +
        			"\"" + fileName + "\" is not an file or it is not exists.");
            return false;
        }
    }
	
    /**
     * 删除目录(文件夹)以及目录下的文件
     * @param dirname 待删除目录的文件路径
     * @return 目录删除成功返回true,否则返回false
     */
    public static boolean deleteDir(String dirname) {
        if (!dirname.endsWith(File.separator)) {
            dirname = dirname + File.separator;
        }
        File dirFile = new File(dirname);
        //如果dir对应的文件不存在,或者不是一个目录,则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            System.out.println("delete \"" + dirname + "\" fail." + "\n" +
            		"\"" + dirname + "\" not exists or not an directory");
            return false;
        }
        boolean flag = true;
        //删除文件夹下所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            if(files[i].isFile()) { //删除子文件
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
            } else if (files[i].isDirectory()) { //删除子目录
                flag = deleteDir(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
            }
        }
        if (!flag) {
            System.out.println("delete \"" + dirname + "\" fail.");
            return false;
        }
        //删除当前目录
        if (dirFile.delete()) {
            System.out.println("delete \"" + dirname + "\" success.");
            return true;
        } else {
            return false;
        }
    }
分享到:
评论

相关推荐

    Java io流总结

    Java io流的总结

    Java_IO完全总结

    Java IO系统主要包括两个包:`java.io`和`java.nio`(New IO),其中`java.io`提供了一系列基于流的I/O操作接口与实现类,而`java.nio`则提供了更高效的数据访问方式,如通道和缓冲区等。 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中的Charset类提供了处理字符编码的工具,例如ISO-8859-1、UTF-8等。开发者可以通过Charset类进行字符编码和解码,确保数据在不同的系统和环境中正确传输。 六、文件操作 File类是Java IO中处理文件和目录的...

    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