- 输入和输出
写在前面的:Java中的输入和输出还是比较重要的,之前我都没想整理IO和多线程的,但是在研究后面的好多东西时候,经常要读取资源文件,这个时候就不得不回过头来整理IO了。要玩熟Java的输入和输入,就必须先玩熟一个类:File。然后在就是Java.io包下的类和接口了。Java的IO主要包括了输入和输出2种流,每种输入和输出又分为字节流和字符流。值得注意和研究的是Java的IO流使用了一种装饰器设计模式,它将IO流分成底层节点流和上层处理流。除此之外,还要研究2个东西:1,Java对象的序列化机制;2,全新API,Java的nio。
- File类
File类是Java.io包下代表与平台无关的文件和目录,注意:不管是文件还是目录都可以使用File类操作,但是File类不能访问文件内容本身。如果需要访问文件内容本身,就要使用输入和输出流。具体的方法在这里就不列出了,用到的时候查JDK就好了。值得注意的一点是:他有一个静态属性separator。这个属性表示与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。因为windows的路径分隔符使用反斜线(\),而Java程序中的反斜线表示转义字符,所以如果需要在windows中路径下包括反斜线,应该用2条反斜线,比如:C:\\java\\LinkinPark.txt,或者直接使用斜线也可以,Java支持将斜线当成与平台无关的路径分隔符。
具体的演示代码如下:
import java.io.File; public class Linkin { public static void main(String[] args) throws Exception { // 以当前路径来创建一个File对象 File file = new File("."); // 直接获取文件名,输出一点 System.out.println(file.getName()); // 获取相对路径的父路径可能出错,下面代码输出null System.out.println(file.getParent()); // 获取绝对路径 System.out.println(file.getAbsoluteFile()); // 获取上一级路径 System.out.println(file.getAbsoluteFile().getParent()); // 在当前路径下创建一个临时文件 File tmpFile = File.createTempFile("aaa", ".txt", file); // 指定当JVM退出时删除该文件 tmpFile.deleteOnExit(); // 以系统当前时间作为新文件名来创建新文件 File newFile = new File(System.currentTimeMillis() + ""); System.out.println("newFile对象是否存在:" + newFile.exists()); // 以指定newFile对象来创建一个文件 newFile.createNewFile(); // 以newFile对象来创建一个目录,因为newFile已经存在, // 所以下面方法返回false,即无法创建该目录 newFile.mkdir(); // 使用list()方法来列出当前路径下的所有文件和路径 String[] fileList = file.list(); System.out.println("====当前路径下所有文件和路径如下===="); for (String fileName : fileList) { System.out.println(fileName); } // listRoots()静态方法列出所有的磁盘根路径。 File[] roots = File.listRoots(); System.out.println("====系统所有根路径如下===="); for (File root : roots) { System.out.println(root); } } }
- 文件过滤器
File类有2个重载的list方法,返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。其中一个可以接受FilenameFilter参数,用来过滤文件。FilenameFilter接口只有accept一个方法,用来测试指定文件是否应该包含在某一文件列表中。
以下代码列出了当前路径下所有*.java和文件夹。
import java.io.File; import java.io.FilenameFilter; /** * * @version 1L * @author LinkinPark * @since 2014-12-30 * @motto 梦似烟花心似水,同学少年不言情 * @desc ^这里用到了典型的command设计模式。Java不支持传一段代码块进方法,所以这里使用accept来封装相关过滤的代码块。 */ public class Linkin { public static void main(String[] args) { File file = new File("."); String[] nameList = file.list(new MyFilenameFilter()); for (String name : nameList) { System.out.println(name); } } } // 实现自己的FilenameFilter实现类 class MyFilenameFilter implements FilenameFilter { public boolean accept(File dir, String name) { // 如果文件名以.java结尾,或者文件对应一个路径,返回true return name.endsWith(".java") || new File(name).isDirectory(); } }