The File Class in I/O

场景

I/O流之文件的创建与过滤


代码

一、文件的创建

/**
 * Project Name:thinkinginjava
 * File Name:FileCreator.java
 * Package Name:com.sourcecode.java.thread
 * Date:2016年2月19日下午8:34:54
 * Copyright (c) 2016, [email protected] All Rights Reserved.
 *
 */
package com.sourcecode.java.thread;

import java.io.File;
import java.io.IOException;

/**
 * ClassName: FileCreator <br/>
 * Reason: TODO IO流学习之创建一个新文件 <br/>
 * Function:JDK中相关术语解释
 * File :即指文件或者路径   pathname:文件或者路径名称
 * date: 2016年2月19日 下午8:34:54 <br/>
 *
 * @author Ivy Peng
 * @version 1.0
 * @since JDK 1.6
 */
public class FileCreator
{
	/**
	 * 文件路径 : '.'表示当前路径下;也可以是 F://等具体目录
	 */
	public static final String FILE_PATH = ".";
	
	/**
	 * 文件过滤正则
	 */
	public static final String FILE_NAME = "IO.java";
	
	public static void main(String[] args)
	{
		creatNewFile();
	}
	
	/**
	 * TODO 创建新文件.<br/>
	 * (一)所在代码行只会在内存中生成一个空文件,不会写到磁盘上去(除非后来往文件写东西-这一点有待验证)
	 * @since JDK 1.6
	 */
	public static void creatNewFile()
	{
		File filepath = new File(FILE_PATH);// ...(一)
		if(!filepath.exists())
		{
			try
			{
				filepath.createNewFile();
			}
			catch (IOException e)
			{
				throw new RuntimeException(e);
			}
		}
		
		File file = new File(filepath,FILE_NAME);
		if(!file.exists())
		{
			try
			{
				if(file.createNewFile())
				{
					System.out.println("success to creat file");
				}
			} catch (IOException e)
			{
				throw new RuntimeException(e);
			}
		}
	}
}

二、文件的过滤

/**
 * Project Name:thinkinginjava
 * File Name:FileFilter.java
 * Package Name:com.sourcecode.java.thread
 * Date:2016年2月19日下午7:27:20
 * Copyright (c) 2016, [email protected] All Rights Reserved.
 *
 */
package com.sourcecode.java.thread;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;

/**
 * ClassName: FileFilter <br/>
 * Function: 通过三种方式获取正则过滤后某一目录下的所有文件(这里的文件也包括目录)名称  <br/>
 * 方法(二)、(三):内部类的使用,使代码更向高内聚,然后可读性降低。
 * Reason: TODO IO流学习 之 文件过滤 <br/>
 * date: 2016年2月19日 下午7:27:20 <br/>
 *
 * @author Ivy Peng
 * @version 1.0
 * @since JDK 1.6
 */
public class FileFilter
{
	/**
	 * 文件路径 : '.'表示当前路径下;也可以是 F://等具体目录
	 */
	public static final String FILE_PATH = ".";
	
	/**
	 * 文件过滤正则
	 */
	public static final String FILE_FILT_RGX = ".*";
	
	/**
	 * function:根据给定的正则表达式,在控制台打印过滤后某一目录下的文件名称 (一)
	 * @param regexs 过滤正则表达式 
	 * @since JDK 1.6
	 */
	public static void filtFile(String regexs)
	{
		File file = new File(FILE_PATH);
		String[] filenames = null;
		if(regexs == null)
		{
			filenames = file.list();
		}
		else
		{
			//方法一:单独写一个文件过滤器类(非内部类),来实现文件的过滤
			filenames = file.list(new FileNameFilter(regexs));
		}
		
		Arrays.sort(filenames,String.CASE_INSENSITIVE_ORDER);
		for (String filename : filenames)
		{
			System.out.println(filename);
		}
	}
	
	/**
	 * function:根据给定的正则表达式,在控制台打印过滤后某一目录下的文件名称(二)
	 * @param regexs 过滤正则表达式 
	 * @since JDK 1.6
	 */
	public static void filtFileWithInnerClass(String regexs)
	{
		File file = new File(FILE_PATH);
		String[] filenames = null;
		if(regexs == null)
		{
			filenames = file.list();
		}
		else
		{
			//方法二:写个匿名内部类来实现文件过滤
			filenames = file.list(filter(regexs));
		}
		
		Arrays.sort(filenames,String.CASE_INSENSITIVE_ORDER);
		for (String filename : filenames)
		{
			System.out.println(filename);
		}
	}
	
	/**
	 * function:根据给定的正则表达式,在控制台打印过滤后某一目录下的文件名称(三)
	 * @param regexs 过滤正则表达式 
	 * @since JDK 1.6
	 */
	public static void filtFileWInnerClazSmaller(String regexs)
	{
		File file = new File(FILE_PATH);
		String[] filenames = null;
		if(regexs == null)
		{
			filenames = file.list();
		}
		else
		{
			//方法三:写个抽象匿名内部类(哈哈,原创名字)来实现文件过滤
			filenames = file.list(new FilenameFilter()
					{
						Pattern pattern = Pattern.compile(regexs);
						@Override
						public boolean accept(File dir, String name)
						{
							return pattern.matcher(name).matches();
						}
					});
		}
		
		Arrays.sort(filenames,String.CASE_INSENSITIVE_ORDER);
		for (String filename : filenames)
		{
			System.out.println(filename);
		}
	}
	
	/**
	 * TODO 文件过滤. 这里书上说"the argument to filter must be final,which is 
	 * required by the anonymous inner class so that it can use an object from
	 * outside its scope".---不加 final关键字 修饰 String regex 也可以正常运行啊<br/>
	 * @param regex 
	 * @return FilenameFilter 文件过滤器
	 * @since JDK 1.6
	 */
	private static FilenameFilter filter(final String regex)
	{
		return new FilenameFilter()
		{
			private Pattern pattern = Pattern.compile(regex);
			
			@Override
			public boolean accept(File dir, String name)
			{
				return pattern.matcher(name).matches();
			}
		};
	}
	

	public static void main(String[] args)
	{
		filtFile(FILE_FILT_RGX);
		System.out.println("--------coding4fun--------");
		filtFileWithInnerClass(FILE_FILT_RGX);
		System.out.println("--------coding4fun--------");
		filtFileWInnerClazSmaller(FILE_FILT_RGX);
	}
}

/**
 * 
 * ClassName: FileNameFilter <br/>
 * Function: 文件过滤器  <br/>
 * date: 2016年2月19日 下午7:31:29 <br/>
 *
 * @author Administrator
 * @since JDK 1.6
 */
class FileNameFilter implements FilenameFilter
{
	private Pattern pattern;
	
	FileNameFilter(String regex)
	{
		this.pattern = Pattern.compile(regex);
	}
	public boolean accept(File dir,String name)
	{
		return pattern.matcher(name).matches();
	}
}



参考文献

《thinking in java》 by Bruce Eckel

你可能感兴趣的:(The File Class in I/O)