首页 > 代码库 > Java File操作汇总
Java File操作汇总
作者:卿笃军
原文地址:http://blog.csdn.net/qingdujun/article/details/41223841
本文通过大量的示例,介绍和讲解了Java File操作。
1)创建文件 2)删除文件 3)判断文件是否存在 4)创建文件夹 5)文件类型判断 6)获取文件信息
7)获取目录下文件名 8)递归打印所有文件名 9)递归删除整个文件夹 10)Properties类
11)SequenceInputStream类:连接多个流 12)对象序列化实现Serializable接口 13)管道流
14)RandomAccessFile类 15)DataStream类 16)ByteArrayStream类
1、创建文件
1)boolean java.io.File.createNewFile() throws IOException用来创建文件,如果文件存在,创建失败,返回false;
2)new File("a.txt");并不创建文件实体,只是创建一个指向“a.txt”的引用。
3)路径分隔符:File.separator
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { //new File()就相当于是C语言中定义一个指向“a.txt”的文件指针 File f1 = new File("a.txt"); try { //创建文件:boolean java.io.File.createNewFile() throws IOException boolean b = f1.createNewFile(); //第二次将会创建失败false,这里和流不一样 System.out.println(b); } catch (Exception e) { // TODO: handle exception } //目录分隔符:File.separator,相当于“\\”跨平台。 //File f2 = new File("E:\\tmp","b.txt"); File f2 = new File("E:"+File.separator+"tmp","b.txt"); System.out.println(f2); } }2、删除文件
1)delete():删除文件成功返回true,删除失败返回false( boolean java.io.File.delete() )
2)deleteOnExit():程序退出时,自动删除文件。一般用于对程序创建的临时文件进行操作,退出时删除。( void java.io.File.deleteOnExit() )
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { File f1 = new File("a.txt"); try { boolean b = f1.createNewFile(); //删除文件:boolean java.io.File.delete() f1.delete(); //程序退出时,自动删除:void java.io.File.deleteOnExit() //f1.deleteOnExit(); } catch (Exception e) { // TODO: handle exception } } }3、判断文件是否存在
exists():判断文件是否存在( boolean java.io.File.exists() )
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { File f1 = new File("not.txt"); //判断文件是否存在:boolean java.io.File.exists() boolean b = f1.exists(); System.out.println(b); } }4、创建文件夹
1)mkdir():只能创建“一级目录”(boolean java.io.File.mkdir());
2)mkdirs():可以创建多级目录(boolean java.io.File.mkdirs())。
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { File dir1 = new File("abc"); File dir2 = new File("a\\b\\c\\d"); try { //创建文件目录(即文件夹):boolean java.io.File.mkdir() //该方法只能创建“一级”目录 boolean b = dir1.mkdir(); System.out.println(b); //创建多级文件夹:boolean java.io.File.mkdirs() b = dir2.mkdirs(); System.out.println(b); } catch (Exception e) { System.out.println(e.toString()); } } }5、文件类型判断
1)exists():判断文件是否存在,注意:一定要先判断这个;
2)isDirectory():判断是否为文件夹;
3)isFile():判断是否为文件;
4)isHidden():判断是否为隐藏文件;
5)isAbsolute():判断是否为绝对路径,这里不管文件是否存在都能判断。
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { File f = new File("C:\\abc.txt"); try { //判断文件是否存在 if (f.exists()) { //判断文件是否是文件夹 if (f.isDirectory()) { System.out.println("文件夹"); } //判断文件是否是文件 if (f.isFile()) { System.out.println("文件"); } //判断是否为隐藏文件 if (f.isHidden()) { System.out.println("隐藏文件"); } } else { System.out.println("文件不存在"); } //判断是否为绝对路径,不管文件是否存在 if (f.isAbsolute()) { System.out.println("是绝对路径"); } } catch (Exception e) { System.out.println(e.toString()); } } }
6、获取文件信息
1)getName():获取文件名;
2)getParent():获取文件父目录;
3)getPath():获取文件路径;
4)getAbsolutePath():获取文件绝对路径;
5)lastModified():获得文件最后一次被修改的时间;
6)length():获取文件大小;
7)renameTo():文件剪切,将文件f1剪切然后粘贴到f2(相当于右键f1->剪切->粘贴->f2所在目录)
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { File f1 = new File("abc.txt"); File f2 = new File("E:\\Java\\test.txt"); try { //获得文件名 System.out.println(f1.getName()); //获得绝对路径中的父目录,如:File("abc.txt")则该返回为null System.out.println(f1.getParent()); //获得相对路径 System.out.println(f1.getPath()); //获得绝对路径 System.out.println(f1.getAbsolutePath()); //获得文件最后一次被修改的时间 System.out.println(f1.lastModified()); //获得文件大小 System.out.println(f1.length()); //文件剪切,将文件f1剪切然后粘贴到f2(相当于右键f1->剪切->粘贴->f2所在目录) f1.renameTo(f2); } catch (Exception e) { System.out.println(e.toString()); } } }7、获取目录下文件名
1)listRoots():获取系统盘符;
2)list():获取“X:\\”目录下的所有文件名,包括隐藏文件和文件夹(调用list()方法时,必须先封装一个目录,且必须存在的目录。)
3)list(FilenameFilter filter):列出文件名的时候,可以进行过滤操作(如:列出后缀名为.txt的文件)。
4)listFiles():列出目录下文件名,不包括文件夹。
package file.dol.sn; import java.io.File; import java.io.FilenameFilter; public class FileDemo { public static void main(String[] args) { //1.获得系统有效盘符 File[] files = File.listRoots(); for (File f : files) System.out.println(f.toString()); System.out.println("——————————————————————"); //2.获得C:\\目录下的所有文件名,包括隐藏文件和文件夹 //调用list()方法时,必须先封装一个目录,且必须存在的目录。 File fnFile = new File("C:\\"); String[] strings = fnFile.list(); for (String s : strings) System.out.println(s); System.out.println("——————————————————————"); //3.调用list()方法,列出后缀名为.txt的文件 strings = fnFile.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { //找出后缀名为.txt的文件名 return name.endsWith(".txt"); } }); for (String s : strings) System.out.println(s); System.out.println("——————————————————————"); //4.获取C:\\目录下的文件夹,不包括文件夹 files = fnFile.listFiles(); for (File f : files) System.out.println(f.toString()); } }8、递归打印所有文件名
注意:测试中,有些隐藏文件名不能访问还是其他的原因,当在打印根目录(如:"C:\\")下的所有文件名时,会有个叫“System Volume Information”的隐藏文件夹,访问失败,所以以下代码中,不访问隐藏文件。
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { File dirFile = new File("E:\\Dol"); showDir(dirFile,0); } public static void showDir(File dir,int level) { System.out.println(printSpace(level)+"文件夹:"+dir.getName()); level += 4; File[] file = dir.listFiles(); for (File f : file) { //递归进入所有非隐藏文件夹 if (f.isDirectory() && !f.isHidden()) showDir(f,level); //打印文件名 else System.out.println(printSpace(level)+f.getName()); } } //实现分层次打印,补充空格 public static StringBuffer printSpace(int level) { StringBuffer space = new StringBuffer(); for (int i = 0; i < level; ++i) { space.append(" "); } return space; } }
9、递归删除整个文件夹
package file.dol.sn; import java.io.File; public class FileDemo { public static void main(String[] args) { File dirFile = new File("E:\\Dol"); deleteDir(dirFile,0); } public static void deleteDir(File dir,int level) { File[] file = dir.listFiles(); //循环递归删除文件夹里面的所有内容 for (File f : file) { //递归进入所有非隐藏文件夹 if (f.isDirectory() && !f.isHidden()) deleteDir(f,level); //删除文件 else { f.delete(); System.out.println(f.getName()+"——已删除"); } } //删除该文件夹 dir.delete(); System.out.println(dir.getName()+"——已删除"); } }
10、Properties类
1)常用的基本操作,设置键值,获取值。
package file.dol.sn; import java.util.Properties; import java.util.Set; public class FileDemo { public static void main(String[] args) { //Properties是HashTable的子类,里面存放的都是键值对的字符串 Properties prop = new Properties(); //设置键值 prop.setProperty("Dolphin", "海豚"); prop.setProperty("Dol", "CSDN"); //获取 String value = http://www.mamicode.com/prop.getProperty("Dolphin");>2)读取配置文件读取配置文件,并对配置文件进行修改,修改后再保存。
package file.dol.sn; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public class FileDemo { public static void main(String[] args) throws IOException{ Properties prop = new Properties(); //Properties加载的文件必须为键值对,#注释的不会被加载 FileInputStream fis = new FileInputStream("pz.txt"); prop.load(fis); //添加一个键值对 prop.setProperty("Dol", "123"); //对键值对进行修改 prop.setProperty("Dol", "321"); FileOutputStream fos = new FileOutputStream("pz.txt"); //保存配置文件 //void java.util.Properties.store(OutputStream arg0, String arg1) throws IOException //第二个参数为注释,可写可不写,写入时会自动添加# prop.store(fos, "comment"); prop.list(System.out); fis.close(); fos.close(); } }11、SequenceInputStream类:连接多个流
说明:Enumeration(列举)
public interface Enumeration<E>实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。
例如,要输出 Vector<E> v 的所有元素,可使用以下方法:
for (Enumeration<E> e = v.elements(); e.hasMoreElements();)
System.out.println(e.nextElement());
这些方法主要通过向量的元素、哈希表的键以及哈希表中的值进行枚举。枚举也用于将输入流指定到 SequenceInputStream 中。
注:此接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。
有两个方法:
hasMoreElements() 测试此枚举是否包含更多的元素。
nextElement() 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。package file.dol.sn; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.SequenceInputStream; import java.util.Enumeration; import java.util.Vector; public class FileDemo { public static void main(String[] args) throws IOException { //将多个流加入集合 Vector<FileInputStream> vector = new Vector<FileInputStream>(); vector.add(new FileInputStream("E:\\1.txt")); vector.add(new FileInputStream("E:\\2.txt")); vector.add(new FileInputStream("E:\\3.txt")); //java.util.Enumeration<FileInputStream>用法见说明 Enumeration<FileInputStream> en = vector.elements(); //连接多个流 SequenceInputStream sis = new SequenceInputStream(en); //启动输出流 FileOutputStream fos = new FileOutputStream("E:\\4.txt"); //开始文件拷贝 byte[] buf = new byte[1024]; int len = 0; while ((len=sis.read(buf))!=-1) fos.write(buf,0,len); //关闭资源 fos.close(); sis.close(); } }12、对象序列化实现Serializable接口
1)添加序列号;
2)静态成员变量不可序列化;
3)堆内存变量要想不被序列化,可以加transient关键字。
package file.dol.sn; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; //序列化,必须实现Serializable接口,该接口不需要覆盖方法 class Person implements Serializable { //记得添加序列化号 public static final long serialVersionUID = 42L; //堆内存变量可序列化 private String name; private int age; //如果不想将堆内存里面的变量序列化,如下声明就可以了 //transient int age; //注意,静态成员变量不可序列化 private static String sex = "male"; public Person(String n, int a, String s) { name = n; age = a; sex = s; } //覆盖toString()方便println()打印 public String toString() { return name+":"+age+":"+sex; } } public class FileDemo { public static void WriteOut() throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt")); oos.writeObject(new Person("Dolphin", 20,"female")); oos.close(); } public static void ReadIn() throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt")); Person p = (Person)ois.readObject(); ois.close(); System.out.println(p); } //这里直接抛出一个较大的异常Exception(IOException的基类) public static void main(String[] args) throws Exception { //注意:以下函数需要分两次运行,每次只运行一个,方便观察运行效果 //WriteOut(); ReadIn(); } }13、管道流
1)平时两个流读写都是通过内存变量,进行数据操作的;
2)这里引入管道流,开启两个线程,一个读取流,一个写入流,直接将两个流对接上。
package io.dol.sn; import java.io.PipedInputStream; import java.io.PipedOutputStream; //实现Runnable方法,多线程 class Read implements Runnable { private PipedInputStream in; public Read(PipedInputStream in) { this.in = in; } public void run() { try { byte[] buf = new byte[1024]; int len = 0; //如果流中无数据,read()进入等待状态 while ((len=in.read(buf))!=-1) { System.out.println(buf); } in.close(); } catch (Exception e) { throw new RuntimeException("管道流读取失败"); } } } class Write implements Runnable { private PipedOutputStream out; public Write(PipedOutputStream in) { this.out = out; } public void run() { try { out.write("Piped lai la...".getBytes()); out.close(); } catch (Exception e) { throw new RuntimeException("管道流输出失败"); } } } public class PipedStreamDemo { public static void main(String[] args) { PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(); Read r = new Read(in); Write w = new Write(out); //开启两线程 new Thread(r).start(); new Thread(w).start(); } }14、RandomAccessFile类
package io.dol.sn; import java.io.IOException; import java.io.RandomAccessFile; public class RafDemo { public static void Read() throws IOException { RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw"); byte[] buf= new byte[4]; raf.read(buf); String name = new String(buf); int age; age = raf.readInt(); raf.close(); System.out.println("网名:"+name); System.out.println("年龄:"+age); } public static void Write() throws IOException { RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw"); raf.write("海豚".getBytes()); raf.writeInt(20); raf.close(); } public static void main(String[] args) throws IOException { Write(); Read(); //调整指针位置 //raf.seek(pos); //跳过字节数 //raf.skipBytes(n); } }15、DataStream类
package io.dol.sn; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class DataStreamDemo { public static void main(String[] args) throws IOException { //写数据 DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt")); out.writeInt(123); out.writeDouble(56.88); out.writeBoolean(true); out.close(); //读数据 DataInputStream in = new DataInputStream(new FileInputStream("data.txt")); int nInt = in.readInt(); double nDou = in.readDouble(); boolean b = in.readBoolean(); in.close(); //显示 System.out.println("nInt:"+nInt); System.out.println("nDou:"+nDou); System.out.println("b:"+b); } }16、ByteArrayStream类
package io.dol.sn; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import javax.print.attribute.standard.Sides; public class ByteArrayStreamDemo { public static void main(String[] args) { ByteArrayInputStream in = new ByteArrayInputStream("Dolphin".getBytes()); ByteArrayOutputStream out = new ByteArrayOutputStream(); int len = 0; // int java.io.ByteArrayInputStream.read() 从此输入流中读取下一个数据字节 while ((len=in.read())!=-1) { out.write(len); } System.out.println(out.size()); } }原文地址:http://blog.csdn.net/qingdujun/article/details/41223841
参考文献:Java视频 毕向东 主讲
Java File操作汇总