编程语言的基础——搞定JavaIO (2)

Java I/O类库需要多种不同功能的组合,存在filter类的原因就是抽象类filter是所有装饰器类的基类,装饰器必须具有和它所装饰对象相同的接口。FilterInputStream和FilterOutputStream是用来提供装饰器类接口以控制特定输入流(InputStream)和输出流(OutputStream)的两个类,他们的名字并不是很直观,包括DataInput/OutputStream, BufferedInput/OutputStream,LineNumberInputStream, PushbackInputStream,PrintStream等,这些过滤流类在下面都会有详细介绍。FilterInputStream和FilterOutputStream分别自I/O类库中的基类InputStream和OutputStream派生而立,这两个类是装饰器的必要条件(以便能为所有正在被修饰的对象提供通用接口)。

一、File / 文件流 / RandomAccessFile

节点流是直接与数据源相连,进行IO操作,文件是数据源中最常见的,下面介绍文件相关的内容。

1.File

File类可以表示文件也可以表示文件夹目录,直接展示一段代码,就懂了。

package javaS.IO; +import java.io.File; /** * 基于磁盘IO操作的类 java.io.File * * 可以表示文件,也可以表示文件夹目录 * * @author Evsward * */ public class FileS extends IOBaseS { @Test public void testFileMethods() throws IOException { logger.info("Start testing file methods."); File file = new File(root); if (!file.exists()) /** * 创建目录 mkdir(); */ file.mkdir(); if (file.isDirectory()) { File file1 = new File(root+"/UME.txt"); File file2 = new File(root+"/HongXing.txt"); /** * 创建文件 createNewFile(); */ file1.createNewFile(); file2.createNewFile(); File file3 = new File(root+"/Cinema"); file3.mkdir(); /** * 列出文件路径下的所有文件(包括文件和目录) */ File[] files = file.listFiles(); for (File f : files) { /** * 判断该文件路径是否为目录 */ if (f.isDirectory()) { logger.info("The directory in 'Files' is: " + f.getName()); } else { logger.info("The file in 'Files' is: " + f.getName()); } logger.info("Whose path is: " + f.getAbsolutePath()); } } else { logger.info("FileS is not a directory!"); } logger.info("Complete testing file methods."); /** * 输出: * 15:12:56[testFileMethods]: Start testing file methods. * 15:12:56[testFileMethods]: The file in 'Files' is: HongXing.txt * 15:12:56[testFileMethods]: Whose path is: /home/work/github/mainbase/resource/StudyFile/HongXing.txt * 15:12:56[testFileMethods]: The directory in 'Files' is: Cinema * 15:12:56[testFileMethods]: Whose path is: /home/work/github/mainbase/resource/StudyFile/Cinema * 15:12:56[testFileMethods]: The file in 'Files' is: UME.txt * 15:12:56[testFileMethods]: Whose path is: /home/work/github/mainbase/resource/StudyFile/UME.txt * 15:12:56[testFileMethods]: Complete testing file methods. */ } }

为了下面测试方便,我们在FileS类中加入一个静态方法,用来初始化目录:

/** * 清空一个文件,以便于我们测试使用 * * @param filePath * @throws IOException */ public static void initEV(String filePath) throws IOException { File f = new File(filePath); if (f.exists()) f.delete(); f.createNewFile(); }

然后,File还支持过滤器的功能,例如我们想要列出某目录下的所有文本文件的名字。

/** * 测试文件目录过滤器,例如列出目录下所有"*.txt" */ public void testFileFilter() { logger.info("start testing file filter."); String filterStr = "(./*)+(txt)$"; File file = new File(root); String list[] = file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return Pattern.matches(filterStr, name); } }); for (String s : list) logger.info(s); } /** * 输出: * * 12:57:17[testFileFilter]: start testing file filter. * * 12:57:17[testFileFilter]: HuaYi.txt * * 12:57:17[testFileFilter]: HongXing.txt * * 12:57:17[testFileFilter]: UME.txt */

正常的String list[] = file.list(); 我们都能用到,它的意思是列出该目录下的所有文件名,如果我们想过滤这些文件名列出我们只想要的文本文件名,则需要通过匿名内部类创建一个FilenameFilter接口的实现类对象,创建时必须实现其方法accept方法,该方法是一个回调函数,每一个查找出来的文件名都要回调该方法,是否能够通过全靠accept的布尔返回值所决定,这也是策略模式的体现,因为在accept方法体的具体实现留给了我们去自定义,所以这个函数更加有了一个“漏斗”的作用。我们只想得到文本文件名,那么定义一个正则表达式去过滤即可。

关于java的正则表达式,未来会写博文专门细说。

File其他方法的测试:

public void testFileTool() { File file = new File(root); PPrint.pprint(file.listFiles()); // 转为List @SuppressWarnings("unused") List<File> fl = Arrays.asList(file.listFiles()); logger.info("file.length(): " + file.length()); logger.info("file.getName(): " + file.getName()); logger.info("file.getParent(): " + file.getParent()); // file.renameTo(new File("resource/S"));// 重命名文件 logger.info("file.canRead(): " + file.canRead()); logger.info("file.canWrite(): " + file.canWrite()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS:SSS"); Date a = new Date(file.lastModified()); logger.info("file.lastModified(): " + sdf.format(a)); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxpgs.html