一. File:
File对象可以表示文件或者目录,利用它可对文件或目录的属性进行基本操作。也可以查询文件的基本信息,并进行修改。
构造函数 | File file = new File (“ Demo.txt ”) ; | 在默认目录创建文件 |
File file = new File (“ C : \\”,“ Demo.txt ”) ; | 以字符串形式,在指定目录创建文件 | |
File file = new File ( File,“ Demo.txt ”) ; | 以文件形式,在指定目录创建文件 | |
| 常用方法 | 描述 |
增 | file. createNewFile() ; | 创建声明的文件 |
file.mkdir() ; | 创建声明的目录 | |
删 | file.delete() ; | 删除文件或目录 |
file.deleteOnExit() ; | 程序结束后删除 | |
改 | renameTo() ; | 重命名 |
setReadOnly() ; | 设置只读 | |
查 | file.exists ( ) ; | 判断文件或目录是否存在 |
file.isFile ( ) ; | 判断是否是文件 | |
file.isDirectory ( ) ; | 判断是否是目录 | |
file.getName ( ) ; | 获取文件或目录的名称 | |
file.getPath ( ) ; | 获取文件或目录的路径 | |
file.getAbsolutePath ( ) ; | 获取文件或目录的绝对路径 | |
file.lastModified ( ) ; | 获取文件或目录的最后修改日期 | |
file.length ( ) ; | 获取文件或目录的大小(字节) |
1. 例子:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
class FileDemo
{
public static void main(String[] args) throws IOException
{
File file1=new File("Demo.txt"); //创建文件操作器
file1.createNewFile();
test("file1is a file : "+file1.isFile()); //判断是否为文件
test("thename of file1 is : "+file1.getName()); //查询文件名
file1.renameTo(new File("MyDemo.txt")); //重命名
test("thenew name of file1 is : "+file1.getName()+
". File 类的实例是不可变的;一旦创建,File对象表示的抽象路径名将永不改变");
File file2=new File("Demo.java");
file2.createNewFile();
test("\nfile2is a directory :"+file2.isDirectory ()); //判断是否为文件夹
File file3=new File("Demo"); //创建目录
file3.mkdir();
test("\nfile3is a exist : "+file3.exists()); //判断是否存在
test("file3is a directory :"+file3.isDirectory());
File file4=new File("file.txt");
FileWriter fw=new FileWriter("file.txt");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("thisis a file.");
bw.flush();
fw.close();
test("\nthelength of file4 is : "+file4.length()+" byte"); //判断大小
test("thepath of file4 is : "+file4.getPath()); //获取路径
test("theabsolute path of file4 is : "+file4.getAbsolutePath()); //获取绝对路径
Date date=new Date(file4.lastModified());
test("thelast modified of file4 is : "+date); //获取最后编辑时间
String txtfile="new file.txt";
File file5=new File("c:\\", txtfile);
file5.createNewFile();
test("\nfile5is a exist : "+file5.exists()); //判断是否为文件夹
file5.delete(); //删除文件
File file6=new File(file3, "new demo.java");
file6.createNewFile();
test("\nfile6is a exist : "+file6.exists()); //判断是否为文件夹
file6.deleteOnExit();
}
publicstatic void test(Object obj)
{
System.out.println(obj);
}
}
2. 层级列表:
方法 | 说明 |
list ( ) ; | 返回全部的文件夹和文件(不包括子目录)的名称数组 |
list (FilenameFilter filter ) ; | 返回指定类型的文件 |
listFiles ( ) ; | 返回全部的文件夹和文件(不包括子目录)的对象数组 |
listFiles ( FilenameFilter filter ) ; | 返回指定类型的对象 |
import java.io.File;
import java.io.FilenameFilter;
class FileDemo
{
public static void main(String[] args)
{
/*
File[] files=File.listRoots(); //获取所有盘符-驱动器
for(File f:files)
{
test(f);
}
File file=new File("e:/javatest");
String[] names=file.list(); //获取所有文件及目录的名称
for(String s:names)
{
test(s);
}
*/
//filter();
File dir=new File("e:/javatest");
dir(dir);
}
publicstatic void dir(File dir)
{
test("\n目录:"+dir);
File[] files=dir.listFiles();
for(int x=0; x<files.length; x++)
{
if(files[x].isDirectory())
{
dir(files[x]); //递归,查询子目录
}
else
{
test(files[x]);
}
}
}
/*
递归:
务必有终止条件
合理设置执行次数
*/
public static void filter()
{
File file=new File("e:/javatest");
String[] names=file.list(
//匿名内部类
new FilenameFilter()
{
//此时两个参数是自动装入的
public boolean accept(File dir, String name)
{
return name.endsWith(".txt"); //只返回封装目录下的txt文件
}
}
); //获取指定文件对象
for(String s:names)
{
test(s);
}
}
public static void test(Object obj)
{
System.out.println(obj);
}
}
3. 删除文件及文件夹:
import java.io.File;
class FileDemo
{
public static void main(String[] args)
{
File dir=newFile("e:/javatest/demo");
removeDir(dir);
}
public static void removeDir(File dir)
{
File[] files=dir.listFiles();
for(int x=0; x<files.length; x++)
{
if(files[x].isDirectory())
{
removeDir(files[x]);
}
else
{
System.out.println(files[x].toString()+"--file--"+files[x].delete());
}
}
System.out.println(dir+"--dir--"+dir.delete()+"\n");
}
public static void test(Object obj)
{
System.out.println(obj);
}
}
从执行的结果来看,Demo或demo都可以被删除。
4. 提取所有的java文件名单到txt文件:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
class FileDemo
{
public static void main(String[] args) throws IOException
{
File dir=new File("e:/javatest");
List<File> list=new ArrayList<File>();
fileToList(dir,list); //提取java文件到集合
File file=new File(dir, "javatest.txt");
writeToFile(list,file.toString()); //将集合内容保存到文本文件
}
public static void writeToFile(List<File> list, String javaListFile) throws IOException
{
BufferedWriter bufw=null;
try
{
bufw=new BufferedWriter(new FileWriter(javaListFile));
for(File f:list)
{
String path=f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
}
catch(IOException e)
{
throwe;
}
finally
{
try
{
if(bufw!=null)
{
bufw.close();
}
}
catch(IOException e)
{
throwe;
}
}
}
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);
}
}
}
}
}
二. Properties:
java.util.Properties,可将数据保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。可与IO结合的集合容器。
| 方法 | 说明 |
查 | getProperty(String key) | 用指定的键在此属性列表中搜索属性 |
load(InputStream inStream) | 从输入流中读取键和元素对 | |
list(PrintStream out) | 将属性列表输出到指定的输出流 | |
stringPropertyNames() | 返回此属性列表中的键集 | |
改 | setProperty(String key, String value) | 调用 Hashtable 的put方法 |
store(OutputStream out, String comments) | 将此 Properties 表中的属性列表(键和元素对)写入输出流 |
import java.io.*;
import java.util.*;
class FileDemo
{
public static void main(String[] args) throws IOException
{
//File file=new File("info.txt");
//file.createNewFile();
//creat(); //创建集合对象,写入文本文件
//gets(); //查询(文本文件内容全部是有效的)
load(); //使用Properties的已有方法查询
}
public static void load() throws IOException
{
Properties prop=new Properties();
FileInputStream fis=new FileInputStream("info.txt");
prop.load(fis); //加载字符流
prop.list(System.out);
}
public static void gets() 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);
}
public static void creat() throws IOException
{
Properties prop=new Properties();
prop.setProperty("wangwu","39"); //插入键值对
prop.setProperty("wangliu","35");
prop.setProperty("wangqi","49");
//prop.setProperty("wangwu","50"); //覆盖已有的键
FileOutputStream fos=new FileOutputStream("info.txt");
prop.store(fos,"this is a tab"); //将此 Properties 表中的属性列表(键和元素对)写入输出字符
//prop.list(System.out); //在控制台打印
fos.close(); // 关闭前自动flush
}
}
例子:
限制使用次数:
import java.io.*;
import java.util.*;
class FileDemo
{
public static void main(String[] args) throws IOException
{
Properties prop=new Properties();
File file=new File("count.ini");
if(!file.exists())
{
file.createNewFile();
}
FileInputStream fis=new FileInputStream(file); //读
prop.load(fis);
intcount=0;
String value=prop.getProperty("time"); //读取键值
if(value!=null)
{
count=Integer.parseInt(value);
if(count>=5)
{
System.out.println("拿钱来!");
return;
}
}
count++; //将读取的键值递增后重新写入
prop.setProperty("time",count+"");
FileOutputStreamfos=new FileOutputStream(file);
prop.store(fos,"");
fos.close();
fis.close();
}
}
三. 其它常用IO类:
SequenceInputStream:合并流
PrintWriter:打印流
import java.io.*;
import java.util.*;
class FileDemo
{
public static void main(String[] args) throws IOException
{
//cut(); //拆分mp3文件
//merge(); //合并mp3
//sequenceInputStreamDemo(); //合并流(文本文件)
printWriterDemo(); //打印流
}
public static void cut() throws IOException
{
FileInputStream fis=new FileInputStream("demo.mp3"); //字节读取流,封装图片文件
FileOutputStream fos=null; //字节写入流
byte[] buf=new byte[1024*1024]; //1M大的字节数组
int len=0;
int count=1;
//读取1m大的量的字节存入buf,同时存入len
while ((len=fis.read(buf))!=-1)
{
fos=new FileOutputStream((count++)+".tmp"); //字节写入流封装一个新的tmp文件
fos.write(buf, 0, len); //写入刚才的数据(数据,位置,长度)
fos.close(); //刷新缓冲区写入文件,然后关闭
}
fis.close();
}
public static void merge() throws IOException
{
ArrayList<FileInputStream> al=new ArrayList<FileInputStream> ();
for (int x=1; x<=3; x++)
{
al.add(new FileInputStream(x+".tmp")); //将3个tmp文件存入集合
}
finalIterator<FileInputStream> it=al.iterator(); //迭代
Enumeration<FileInputStream> en=new Enumeration<FileInputStream> () //枚举
{
public booleanhasMoreElements()
{
return it.hasNext();
}
public FileInputStreamnextElement()
{
return it.next();
}
};
SequenceInputStream sis=new SequenceInputStream(en); //合并流
FileOutputStream fos=new FileOutputStream("new demo.mp3");
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 sequenceInputStreamDemo() throws IOException
{
Vector<FileInputStream> v=new Vector<FileInputStream> ();
v.add(new FileInputStream("1.txt"));
v.add(new FileInputStream("2.txt"));
v.add(new FileInputStream("3.txt"));
Enumeration<FileInputStream> en=v.elements(); //枚举,配合输入流使用
SequenceInputStream sis=new SequenceInputStream(en); //合并流
FileOutputStream fos=new FileOutputStream("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();
}
public static void printWriterDemo ()throws IOException
{
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
PrintWriter out=new PrintWriter(System.out, true); //打印流,自动刷新
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
{
break;
}
out.println(line.toUpperCase());
//out.flush(); //已经启动自动刷新缓冲区
}
out.close();
bufr.close();
}
}