1. File把文件或者文件夹封装为对象 :
例子:
File f1=new File("2.txt");
File f2=new File("c:\\2.txt");
File f3=new File("c:\\abc","4.txt");
File d=new File("bcd");
File f4=new File(d,"1.txt");
System.out.println(f1)
注意:File文件里封装的是什么路径,就打印什么路径
File.separator()目录分隔符,在什么系统都通用
2 File类的常见方法
2.1)创建
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false ,和输出流不一样,输出流对象一建立就创建文件,而且文件如果已经存在,会覆盖
boolena mkdir():创建文件夹
boolewn mkdirs() 创建多级文件夹
2.2)删除:
boolean delete(); 删除失败返回false
void deleteOnExit() 在程序退出时删除指定文件,防止发生异常时文件没有删除
2.3)判断
boolean exists() 文件是否存在
isFile(); 判断是否文件
isDirectory(); 判断是否目录
isHidden(); 判断是否隐藏文件
isAbsolute(); 判断是否绝对路径
2.4)获取信息
getName(); //获取文件名
getPath(); //获取相对路径
getParent(); //获取相对路径的父目录,如果没有父目录反为null
getAbsolutePath(); //获取文件的绝对路径
long lastModified(); //获取最后修改时间 long
long length() //获取文件大小 long
2.5)File其他方法:
2.5.1)renameTo();
File f1=new File("c://test.java");
File f2=new File("c://haha.java");
f1.renameTo(f2); //会把test.java的文件名改为haha.javaFile f1=new File("c://test.java");
File f2=new File("d://haha.java");
f1.renameTo(f2); //运行结果是C盘下的test.java没了,d盘下面会有jaja.java类似于剪切
2.5.2)listRoots() 列出系统的根目录
File files=new File();
例子:
for(File f:files.listRoots())
{
System.out.println(f); //打印结果是系统的根目录盘符
}
2.5.2) list() 列出当前目录的所有文件,包括隐藏文件,调用该方法的File对象必须是封装了一个目录,
该目录必须存在,否则会抛出空指针异常,因为高级for循环调用了length()方法
例子:
File f=new File("c:\\abc");
String[] arr=f.list()
for(String s:arr)
{
System.out.println(s);
}
2.5.3)注意:开发一般用listFiles()
File[] listFiles()返回一个File数组对象,操作跟上面的list()是一样的
3 过滤当前目录,不用的文件FilenameFileter是一个接口,要复写accept方法
accept(File dir,String name)
String[] arr=list(FilenameFilter f)
例子:过滤指定文件
File f=new File("c:\\abc");
String[] arr=f.list(new FilenameFileter() //传了匿名内部类,复写accept方法
public boolean accept(File dir,String name)//dir是要过滤的目录,name是要过滤的文件
{
return name.endsWith(".bmp");
}
);
for(String s:arr)
{
System.out.println(s);
}
4递归
要求:列出指定目录下文件或者文件夹,包含子目录中的内容,也就是列出指定目录下所有内容
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可.
在列出过程中出现的还是目录的话,还可以再次调用该功能
也就是函数自身调用自身
这种表现形式,或者变成手法,称为递归
递归要注意:
限定条件
要注意递归次数,尽量避免内存溢出
/*
例子:
列出当前目录的所有文件
*/
import java.io.*;
class FileDemo
{
public static void main(String[] args)throws IOException
{
File dir=new File("E:\\Java\\jdk1.6.0_23\\experience_heima");
getDir(dir);
//这个函数是让程序的目录带|--层次
public static String getLevel(int level)
{
StringBuilder sb=new StringBuilder();
for(int x=0;x<levev;x++)
{
sb.append("|--");
}
return sb.toString();
}
}
//打印文件
public static void getDir(File files,int level)
{
System.out.println(getLevel(level)+files);
level++;
File[] dir=files.listFiles();
for(int x=0;x<dir.length;x++)
{
if(dir[x].isFile())
System.out.println(getLevel(level)dir[x]);
else
getDir(dir[x],level);
}
}
}
/*
获取指定目录的所有java文件,存到集合里
遍历集合java文件名存放在指定目录下
*/
import java.io.*;
import java.util.*;
class FileDemo1
{
public static void main(String[] args)throws IOException
{
File files=new File("E:\\Java\\jdk1.6.0_23");
ArrayList<File> list=new ArrayList<File>();
getFile(files,list);
String s="E:\\Java\\jdk1.6.0_23\\66.txt";
getList(list,s);
}
//遍历指定目录的所有java文件,然后把java文件存储在list集合
public static void getFile(File files,ArrayList<File> list)
{
File[] dir=files.listFiles();
for(File f:dir)
{
if(f.isDirectory())
getFile(f,list);//如果是目录再次调用函数
else
{
if(f.getName().endsWith(".java"))//判断文件对象的文件名是否是以java后缀名结尾
list.add(f);//把符合条件的文件对象存储进集合
}
}
}
//遍历list集合,把java文件的文件名写进指定目录里去
public static void getList(ArrayList<File> list,String fileName)throws IOException
{
BufferedWriter buw=null;
try
{
buw=new BufferedWriter(new FileWriter(fileName));
for(File al:list)
{
buw.write(al.getName()); //把文件名写到指定目录
buw.newLine(); //换行
buw.flush();//刷新
}
}
catch(IOException e)
{
throw new IOException();
}
finally
{
if(buw!=null);
try
{
buw.close();
}
catch(IOException e)
{
throw new IOException();
}
}
}
}
5 Properties是hashtable的子类,是Map体系的
也就是说具备map集合的特点,而且它里面存储的键值对都是字符串
是集合中和io技术结合的集合容器
5.1)该对象的特点:可以用于键值对形式的配置文件
那么在加载时,需要数据有固定格式:键=值
5.2)Properties使用:
Properties pro=new Properties();
pro.setProperty("zhangsan","30");//设置信息
pro.setProperty("lisi","35");
pro.getProperty("zhangsan");//获取信息
Set<String> names=pro.stringPropertyNames();//获取所有的键,返回set集合
for(String s:names)
{
System.out.println(s+":"+pro.getProperty(s));
}
/*
例子:
演示流中的数据存储到集合,
把集合的数据存储到流对象
*/
import java.util.*;
import java.io.*;
class PropertiesDemo2
{
public static void main(String[] args)throws IOException
{
Properties pro=new Properties();
FileInputStream fis=new FileInputStream("info.txt");
pro.load(fis);//把输入流传进来,可以把文件里的信息变成键值对,存储在集合里
pro.setProperty("zhangsan",8);//改变集合的键值对,但是文本文件里的键值对没有修改到,这时就要用到store(OutSteram out ,String s)方法
FileOutputStream fos=new FileOutputStream("info.txt");
pro.store(fos,"haha");//接受一个输出流和字符串,字符串是备注信息,不写也行
pro.list(System.out);//打印集合到控制台,list(PrintStream p)
fos.close();
fis.close();
//load(InputStream ins)的原理
/*
BufferedReader bufr=new BufferedReader(new FileReader("C:\\info.txt"));
String s=null;
while((s=bufr.readLine())!=null)
{
String[] s1=s.split("=");
pro.setProperty(s1[0],s1[1]);
}
bufr.close();
System.out.println(pro);
*/
}
}
6 PrintWriter字符打印流
6.1)构造函数可以接受的参数类型
file对象 File
字符串路径 String
字节输出流 OutputStream
字符输出流 Writer
6.2)PrintWriter pw=new PrintWriter(System.out,true);//true代表调用println()方法时可以自动刷新缓冲区,
只有传入流对象才能输入true和false,比如说这样就不能因为1.txt不是一个流对象,把文本文件封装成流对象传进来就行了:
PrintWriter pw=new PrintWriter(1.txt,true);
pw.println()//可以自动换行
6.3)PrintStream字节打印流
构造函数可以接受的参数类型
file对象 File
字符串路径 String
字节输出流 OutputStream
7 SequenceInputStream()合并流
/*
SequenceInputStream类的用法:把3个流对象,写入到一个目的文件,多个源文件和一个目的文件
*/
class SequenceInputDemo
{
public static void main(String[] args)
{
Vector<FileInputStram> v=new Vector<FileInputStram>();
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 sie=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();
}
}