-----------android培训、java培训、期待与您交流! ------------
1.File概述
File类是文件和目录路径名的抽象表示形式。
用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。
抽象路径名 有两个组件:
a.一个可选的与系统有关的前缀 字符串,比如盘符,"/" 表示 UNIX 中的根目录,"\\\\" 表示 Microsoft Windows UNC 路径名。
b.零个或更多字符串名称 的序列。
如何建立一个File对象?
File f1 = new File("C:\\a.txt");
2.File对象功能
创建:
boolean createNewFile();当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
eg:
- import java.io.File;
- import java.io.IOException;
- class Test{
- public static void main(String[] args) throws IOException {
- method();
- }
- public static void method() throws IOException {
- File f = new File("file.txt");
- System.out.println("create:"+f.createNewFile());//运行一次输出true,第二次输出false
- }
- }
boolean mkdir();创建多级文件夹
eg:
- File dir = new File("C:\\a\\b\\c\\d\\e");
- System.out.println(dir.mkdir());
- System.out.println(dir.mkdirs());
删除:
boolean delete();删除此抽象路径名表示的文件或目录,删除失败返回false
void deteleOnExit();在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
eg:
File f = new File("file.txt");
f.deleteOnExit();
//System.out.println("delete:"+f.delete());
判断
boolean exists();测试此抽象路径名表示的文件或目录是否存在。
boolean canExecute();测试应用程序是否可以执行此抽象路径名表示的文件。
eg:
File f = new File("fa.txt");
System.out.println(fa.exists());
boolean isDirectory();判断是否是一个目录
boolean isFile();判断是否是一个文件
eg:
//在判断文件对象是否是文件或是目录时,必须先判断文件对象中的内容是否存在
//通过exists方法判断是否存在
File file = new File("x.txt");
System.out.println(x.isDirectory());
System.out.println(x.isFile());
boolean isHidden();判断是否是隐藏文件
获取
String getName(); 返回由此抽象路径名表示的文件或目录的名称。
String getPath();将此抽象路径名转换为一个路径名字符串
String getParent();返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
String getAbsolutePath();返回此抽象路径名的绝对路径名字符串。
File getAbsoluteFile();返回此抽象路径名的绝对路径名形式。
long lastModified();返回此抽象路径名表示的文件最后一次被修改的时间。
long length();返回由此抽象路径名表示的文件的长度。
eg:
- import java.io.File;
- class Test {
- public static void main(String[] args) {
- File f = new File("fa.txt");
- System.out.println(f.getName());//fa.txt
- System.out.println(f.getPath());//fa.txt
- System.out.println(f.getAbsolutePath());//F:\javaworkspace\learnjava\fa.txt
- System.out.println(f.getParent());//null
- System.out.println(f.length());//0
- }
- }
文件列表
String[] list();返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
static File[] listRoots(); 列出可用的文件系统根。
String[] list(FilenameFilter filter);返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles();返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] listFiles();返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
eg:
- import java.io.File;
- class Test {
- public static void main(String[] args) {
- File[] files = File.listRoots();
- for (File file : files) { //高级for循环
- System.out.println(file);
- }
- }
- }
- /*
- 输出结果:
- C:\
- D:\
- F:\
- */
- eg:
- import java.io.File;
- class Test {
- public static void main(String[] args) {
- File f = new File("f:\\java");
- String[] list = f.list();//调用list方法的file对象必须是封装了一个目录,该目录必须存在
- for (String string : list) {
- System.out.println(string);
- }
- }
- }
- /*
- 输出结果:
- cmd.exe
- Test.java
- Test.class
- Test1.class
- AException.class
- FuShuException.class
- */
- eg:
- package cn.itcast;
- import java.io.File;
- import java.io.FilenameFilter;
- class Test {
- public static void main(String[] args) {
- File dir = new File("f:\\java");
- String[] list = dir.list(new FilenameFilter() {//匿名内部类
- public boolean accept(File dir, String name) {
- return name.endsWith(".java");//过滤出.java文件
- }
- });
- for (String string : list) {
- System.out.println(string);
- }
- }
- }
- /*
- 运行结果:
- Test.java
- */
3.列出目录下所有内容
递归:
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可
在列出过程中出现的还是目录的话,还可以再次调用本功能
也就是函数自身调用自身
这种表现形式,或者说是编程手法叫做递归
递归注意事项:
a.限定条件
b.要注意递归的次数,尽量避免内存溢出
//列出指定目录下文件或者文件夹,包含子目录中的内容
- import java.io.File;
- import java.io.FilenameFilter;
- class Test {
- public static void main(String[] args) {
- File dir = new File("F:\\javaworkspace");
- showDir(dir);
- }
- public static void showDir(File dir) {
- System.out.println(dir);
- File[] files = dir.listFiles();
- for (int x = 0; x < files.length; x++) {
- //递归的条件:是目录就递归,不是目录就不递归
- if (files[x].isDirectory())
- showDir(files[x]);
- else
- System.out.println(files[x]);
- }
- }
- }
- import java.io.File;
- class Test {
- public static void main(String[] args) {
- File dir = new File("F:\\javaworkspace");
- showDir(dir,0);
- }
- public static String getLevel(int level) { //分层
- StringBuilder sb = new StringBuilder();
- for (int x = 0; x < level; x++) {
- sb.append(" ");
- }
- return sb.toString();
- }
- public static void showDir(File dir,int level) {
- System.out.println(getLevel(level) + dir.getName());
- level++;
- File[] files = dir.listFiles();
- for (int x = 0; x < files.length; x++) {
- if (files[x].isDirectory())
- showDir(files[x],level);
- else
- System.out.println(getLevel(level)+files[x]);
- }
- }
- }
4.删除带内容的目录
删除原理:
在windows中,删除目录从里面往外面删除
既然是从里往外删除,就需要用到递归
- import java.io.File;
- class Test {
- public static void main(String[] args) {
- File dir = new File("f:\\java");
- removeDir(dir);
- }
- public static void removeDir(File dir) {
- File[] files = dir.listFiles();
- for(int x=0; x<files.length; x++){
- if(!files[x].isHidden() && files[x].isDirectory())
- removeDir(files[x]); //递归
- else
- System.out.println(files[x].toString()+" "+files[x].delete());
- }
- System.out.println(dir+"::dir::"+dir.delete());
- }
- }
- /*
- 将一个指定目录下的java文件的绝对路径,存储到一个文本文件中
- 建立一个java文件列表文件
- */
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- /*
- * 思路:
- * 1.对指定的目录进行递归
- * 2.获取递归过程中所有的java文件的路径
- * 3.将这些路径存储到集合中
- * 4.将集合中的数据写入到一个文件中
- */
- class Test {
- public static void main(String[] args) throws IOException {
- File dir = new File("F:\\java");
- List<File> list = new ArrayList<File>();
- fileToList(dir, list);
- File file = new File(dir,"javalist.txt");
- writeToFile(list,file.toString());
- }
- public static void fileToList(File dir, List<File> list) {
- File[] files = dir.listFiles();
- for (File file : files) {
- if (file.isDirectory())
- fileToList(file, list);
- else {
- if (file.getName().endsWith(".java"))
- list.add(file);
- }
- }
- }
- public static void writeToFile(List<File> list, String javaListFile)
- throws IOException {
- BufferedWriter bufw = null;
- try {
- bufw = new BufferedWriter(new FileWriter(javaListFile));
- for (File file : list) {
- String path = file.getAbsolutePath();
- bufw.write(path);
- bufw.newLine();
- bufw.flush();
- }
- } catch (IOException e) {
- throw e;
- } finally {
- try {
- if (bufw != null)
- bufw.close();
- } catch (IOException e) {
- throw e;
- }
- }
- }
- }
6.Properties概述
Properties是hashtable的字类
也就是说他具备map集合的特点,而且她里面存储的键值对都是字符串
是集合中和IO技术相结合的集合容器
该对象的特点,可以用于键值对形式的配置文件
加载数据时,需要数据有固定格式
7.Properties存取
相关方法:
Object setProperty(String key, String value); 调用 Hashtable 的方法 put。
String getProperty(String key)用指定的键在此属性列表中搜索属性。
Set<String> stringPropertyName()返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
eg:
- import java.util.Properties;
- import java.util.Set;
- public class Test1 {
- public static void main(String[] args) {
- setAndGet();
- }
- public static void setAndGet() {
- Properties prop = new Properties(); //创建Properties对象
- prop.setProperty("zhangsan", "23"); //存储
- prop.setProperty("lisi", "38");
- String value = prop.getProperty("lisi"); //通过键值获取属性
- System.out.println(value);
- System.out.println(prop);
- prop.setProperty("lisi", 89+"");
- Set<String> names = prop.stringPropertyNames();//返回属性列表中的键集
- for (String string : names) {
- System.out.println(string+"..."+prop.getProperty(string));
- }
- }
- }
8.Properties存取配置文件
相关方法:
void list(PrintStream out)将属性列表输出到指定的输出流。
void load(InputStream inStream)从输入流中读取属性列表(键和元素对)。
void store(OutputStream out,String comments);以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
- //将info.txt中键值数据存到集合中进行操作
- /*
- 1.用一个流和info.txt文件关联
- 2.读取一行数据,将改行数据用“=”进行切割
- 3.等号左边作为键,右边作为值,存入到Properties集合中即可
- */
- //JDK1.6之前的做法
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.Properties;
- public class Test1 {
- public static void main(String[] args) throws IOException {
- BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));
- String line = null;
- Properties prop = new Properties();
- while ((line=bufr.readLine())!=null) {
- String[] arr = line.split("="); //字符串切割
- prop.setProperty(arr[0], arr[1]);
- }
- bufr.close();
- System.out.println(prop);
- }
- }
- //使用JDK1.6之后的load方法
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.util.Properties;
- public class Test1 {
- public static void main(String[] args) throws IOException {
- Properties prop = new Properties();
- FileInputStream fis = new FileInputStream("info.txt");
- //调用load方法将流中的数据加载进集合
- prop.load(fis);
- //System.out.println(prop);
- //列出集合目录
- prop.list(System.out);
- prop.setProperty("wangwu","39");//修改prop中的内容,并不能修改文件中的数据
- FileOutputStream fos = new FileOutputStream("info.txt");
- prop.store(fos,"haha");//haha为注释信息
- fos.close();
- fis.close();
- }
- }
9.Properties练习
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Properties;
- /*
- * 用于记录应用程序运行次数
- * 如果使用次数已到,那么给注册提示
- * 本例无法使用计数器,因为随着程序退出,计数器也会消失
- * 因此要建立一个配置文件,用于记录该软件的使用次数
- * 配置文件可以使用键值对的形式
- * 这样便于阅读数据并且操作数据
- */
- public class Test1 {
- public static void main(String[] args) throws IOException {
- Properties prop = new Properties();
- File file = new File("count.ini");//封装成File对象
- if (!file.exists()) {
- file.createNewFile();//如果文件不存在则创建新文件
- }
- FileInputStream fis = new FileInputStream(file);//输入流
- prop.load(fis);//将流中数据加载进集合
- int count = 0;
- String value = prop.getProperty("times");
- if (value!=null) {
- count = Integer.parseInt(value);//获取上次运行结束后的次数
- if (count >= 5) {
- System.out.println("您好,使用次数已到");
- return;
- }
- }
- count++;
- prop.setProperty("times", count+"");//修改属性
- FileOutputStream fos = new FileOutputStream(file);
- prop.store(fos, "");//写入文件,无注释信息
- fos.close();//关闭流
- fis.close();
- }
- }
10.打印流
向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
打印流提供了打印方法,可以各种数据类型的数据都原样打印
字节打印流
PrintStream
构造函数可以接收的参数类型有:
1.file对象 File
2.字符串路径 String
3.字节输出流 OutputStream
字符打印流
PrintWriter
构造函数可以接收的参数类型有:
1.file对象 File
2.字符串路径 String
3.字节输出流 OutputStream
4.字符输出流 Writer
eg:
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- public class Test1 {
- public static void main(String[] args) throws IOException {
- //读取流
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
- //true表示自动刷新
- PrintWriter out = new PrintWriter(System.out,true);
- //PrintWriter out = new PrintWriter("a.txt");//写入文件
- //PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);//自动刷新
- String line = null;
- while ((line = bufr.readLine())!=null) {
- if("over".equals(line))
- break;
- out.println(line.toUpperCase());
- //out.flush();//刷新
- }
- out.close();
- bufr.close();
- }
- }
11.合并流
SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
构造函数
SequenceInputStream(InputStream s1, InputStream s2)
通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。
eg:
- 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 Test1 {
- public static void main(String[] args) throws IOException {
- Vector<FileInputStream> v = new Vector<FileInputStream>();
- v.add(new FileInputStream("c:\\1.txt"));
- v.add(new FileInputStream("c:\\2.txt"));
- v.add(new FileInputStream("c:\\3.txt"));
- //多个读取流合并成一个流
- Enumeration<FileInputStream> en = v.elements();
- SequenceInputStream sis = new SequenceInputStream(en);
- FileOutputStream fos = new FileOutputStream("c:\\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.切割文件
实例:
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.SequenceInputStream;
- import java.util.ArrayList;
- import java.util.Enumeration;
- import java.util.Iterator;
- public class Test1 {
- public static void main(String[] args) throws IOException {
- splitFile();// 切割文件
- merge();//合并碎片文件
- }
- public static void merge() throws IOException {
- ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
- for (int i = 0; i < 3; i++) {
- al.add(new FileInputStream("c:\\splitfiles\\" + i + ".part"));
- }
- //局部内部类
- final Iterator<FileInputStream> it = al.iterator();
- Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
- public boolean hasMoreElements() {
- return it.hasNext();
- }
- public FileInputStream nextElement() {
- return it.next();
- }
- };
- SequenceInputStream sis = new SequenceInputStream(en);
- FileOutputStream fos = new FileOutputStream("c:\\splitfiles\\0.bmp");
- byte[] buf = new byte[1024];
- int len = 0;
- while ((len=sis.read(buf))!=-1) {
- fos.write(buf,0,len);
- }
- fos.close();//关闭流
- sis.close();
- }
- public static void splitFile() throws IOException {
- FileInputStream fis = new FileInputStream("c:\\1.bmp");
- FileOutputStream fos = null;
- byte[] buf = new byte[1024 * 1024];// 1M
- int len = 0;
- int count = 1;
- while ((len = fis.read(buf)) != -1) {
- // 分割成count个部分,1M一个部分
- fos = new FileOutputStream("c\\splitfiles\\" + (count++) + ".part");
- fos.write(buf, 0, len);
- fos.close();
- }
- fis.close();
- }
- }