File 类
不管是文件,还是目录都是使用File来操作的,File能新建,删除和重命名文件和目录,File不能访问文件内容本身。如果需要访问文件内容,需要使用输入/输出流。
File类可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径,默认运行java虚拟机时所在的路径。
程序范例:
- package TestDemo;
- import java.io.File;
- public class FileTest
- {
- public static void main(String[] args)
- {
- //以当前路径来创建一个File对象
- File file = new File(".");
- //直接获取文件名,输出一点
- System.out.println(file.getName());
- //获取相对路径的父路径可能出错,下面代码输出null
- System.out.println(file.getParent());
- //获取绝对路径
- System.out.println(file.getAbsoluteFile());
- //在当前路径下创建一个临时文件
- 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();
- String[] fileList = file.list();
- //使用list方法来列出当前路径下的所有文件和路径
- System.out.println("====当前路径下所有文件和路径如下====");
- for(String fileName : fileList)
- {
- System.out.println(fileName);
- }
- //listRoots静态方法列出所有的磁盘根路径。
- File[] roots = File.listRoots();
- System.out.print("====系统所有根路径如下====");
- for(File root : roots)
- {
- System.out.println(root);
- }
- }
- }
- /*
- 结果:newFile对象是否存在:false
====当前路径下所有文件和路径如下====
.classpath
.project
.settings
1352804494328
aaa2845250731390905188.txt
bin
src
====系统所有根路径如下====C:\
D:\
E:\ - */
文件过滤器
FilenameFilter接口里包含了一个accept(File dir,String name)方法,该方法讲一次对指定
File的所有子目录,子文件夹进行迭代,如果该方法返回true,则list方法会列出该子目录或者子
文件夹。
程序范例:
- package TestDemo;
- import java.io.File;
- import java.io.FilenameFilter;
- public class FilenameFilterTest
- {
- public static void main(String[] args)
- {
- File file = new File(".");
- String[] nameList = file.list(new MyFilenameFilter());
- for(String name:nameList)
- {
- System.out.println(name);
- }
- }
- }
- class MyFilenameFilter implements FilenameFilter
- {
- public boolean accept(File dir,String name)
- {
- //如果文件名以.java结尾,或者文件对应一个路径,返回true
- return name.endsWith(".java")||new File(name).isDirectory();
- }
- }
节点流和处理流
可以从/向一个特定的IO设备(如磁盘、网络)读/写数据的流,称为节点流。(低级流)
当使用节点流来进行输入/输出时,程序直接连接到实际的数据源,和实际的输入/输出节点连接。
处理流用于对一个已存在的流进行连接或封装,通过封装后流来实现数据读/写功能。(高级流)
当使用处理流来进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入/输出节点连接。
通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入/输出功能。因此处理流也被称为包装流。
字节流和字符流
InputStream和Reader都是抽象类,本身不能创建实例,但他们分别有一个用于读取文件的输入流:FileInputStream 和 FileReader,他们都是节点流-------会直接和指定文件关联。
程序范例:
- package TestDemo;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- public class FileInputStreamTest
- {
- public static void main(String[] args) throws IOException
- {
- //创建字节输入流
- FileInputStream fis = new FileInputStream("FileInputStreamTest.java");
- // 创建一个长度为1024的”竹筒“
- byte[] bbuf = new byte[1024];
- //用于保存实际读取的字节数
- int hasRead = 0;
- //使用循环来重复”取水“过程
- while((hasRead = fis.read(bbuf))>0)
- {
- //取出”竹筒“中水滴(字节),将字节数组转换成字符串输入
- System.out.println(new String(bbuf,0,hasRead));
- }
- //关闭文件输入流,放在finally块里更安全
- fis.close();
- }
- }
- /*
- * 结果:输出这个程序的源码
- * */
- package TestDemo;
- import java.io.FileReader;
- import java.io.IOException;
- public class FileReaderTest
- {
- public static void main(String[] args) throws IOException
- {
- FileReader fr = null;
- try
- {
- //创建字符输入流
- fr = new FileReader("FileReaderTest.java");
- //创建一个长度为32的“竹筒”
- char[] cbuf = new char[32];
- //用于保存实际读取的字符数
- int hasRead = 0;
- //使用循环来重复“取水”过程
- while((hasRead = fr.read(cbuf))>0)
- {
- //取出“竹筒”中的水滴(字节),将字符数转换成字符串输入
- System.out.println(new String(cbuf,0,hasRead));
- }
- }
- catch(IOException ioe)
- {
- ioe.printStackTrace();
- }
- finally
- {
- //使用finally块来关闭文件输入流
- if(fr != null)
- {
- fr.close();
- }
- }
- }
- }
- package TestDemo;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- public class FileOutputStreamTest
- {
- public static void main(String[] args) throws IOException
- {
- FileInputStream fis = null;
- FileOutputStream fos = null;
- try
- {
- //创建字节输入流
- fis = new FileInputStream("FileOutputStreamTest.java");
- //创建字节输出流
- fos = new FileOutputStream("newFile.txt");
- byte [] bbuf = new byte[32];
- int hasRead = 0;
- //循环从输入流中取出数据
- while((hasRead = fis.read(bbuf))>0)
- {
- //每读取一次,即写入文件输出流,读了多少,就写多少
- fos.write(bbuf,0,hasRead);
- }
- }
- catch(IOException ioe)
- {
- ioe.printStackTrace();
- }
- finally
- {
- if(fis != null)
- {
- fis.close();
- }
- if(fos != null)
- {
- fos.close();
- }
- }
- }
- }
- package TestDemo;
- import java.io.FileWriter;
- import java.io.IOException;
- public class FileWriterTest
- {
- public static void main(String[] args) throws IOException
- {
- FileWriter fw = null;
- try
- {
- //创建字符输出流
- fw = new FileWriter("poem.txt");
- fw.write("蛋疼\r\n");
- fw.write("你蛋疼吗?\r\n");
- }
- catch(IOException ioe)
- {
- ioe.printStackTrace();
- }
- finally
- {
- if(fw != null)
- {
- fw.close();
- }
- }
- }
- }
- /*
- * "/r/n"是Windows平台的换行符,可以让输出内容换行。如果是Unix/Linux/BSD
- * 平台,只要使用\n就可以了
- * */
处理流的用法:
- package J1114;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.PrintStream;
- /*
- * 使用PrintStream处理流来包装InputStream
- * */
- public class PrintStreamTest
- {
- public static void main(String[] args)throws IOException
- {
- PrintStream ps = null;
- try
- {
- //创建一个节点输出流:FileOutputStream
- FileOutputStream fos = new FileOutputStream("test.txt");
- //以PrintStream来包装FileOutputStream输出流
- ps = new PrintStream(fos);
- //使用PrintStream执行输出
- ps.println("普通字符串");
- //直接使用PrintStream输出对象
- ps.println(new PrintStreamTest());
- }
- catch(IOException ioe)
- {
- ioe.printStackTrace();
- }
- finally
- {
- ps.close();
- }
- }
- }
从前面代码可以看出,程序使用处理流非常简单,通常只需要在创建处理流时传入一个节点流构造参数即可,这样创建的处理流就是包装了该节点的处理流。
当我们使用处理流来包装底层节点流之后,关闭输入输出流资源时,只要关闭最上层的处理流即可。关闭最上层的处理流时,系统会自动关闭被该处理流包装的节点流。
转载于:https://blog.51cto.com/chengxuyuan/1059291