一. File类
public class File
extends Object
implements Serializable, Comparable<File>
文件和目录路径名的抽象表示形式。
构造函数:
import java.io.*;
class FileDemo
{
publicstatic void main(String[] args)
{
consMethod();
}
publicstatic void consMethod()
{
/*File的几种构造方法*/
//File(Stringpathname)
// 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File f1= new File("a.txt");
//File(Stringparent, String child)
// 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File f2= new File("d:\\abd","b.txt");
//File(Fileparent, String child)
// 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File d =new File("d:\\abc");
File f3= new File(d,"c.txt");
sop("f1:"+f1);
sop("f2:"+f2);
sop("f3:"+f3);
}
publicstatic void sop(Object obj)
{
System.out.println(obj);
}
}
File类常见方法:
1,创建。
booleancreateNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
booleanmkdir():创建文件夹。
booleanmkdirs():创建多级文件夹。
2,删除。
booleandelete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
voiddeleteOnExit();在程序退出时删除指定文件。
3,判断。
booleanexists() :文件是否存在.
isFile():
isDirectory();
isHidden();
isAbsolute();
4,获取信息。
getName():
getPath():
getParent():
getAbsolutePath()
longlastModified()
longlength()
文件的创建与删除
publicstatic void method_1()throws IOException
{
//文件创建与删除
File f =new File("file.txt");
sop("create:"+f.createNewFile());
sop("delete:"+f.delete());
}
publicstatic void method_2()
{
File f =new File("file.txt");
//文件是否存在
sop("exists:"+f.exists());
//文件是否可执行
sop("execute:"+f.canExecute());
//创建文件夹
File dir= new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
sop("mkdir:"+dir.mkdirs());
}
文件夹的创建
public static void method_3()throws IOException
{
File f =new File("d:\\java1223\\day20\\file2.txt");
//f.createNewFile();
//创建文件夹
f.mkdir();
//记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
//通过exists判断。
sop("dir:"+f.isDirectory());
sop("file:"+f.isFile());
sop(f.isAbsolute());
}
返回路径
publicstatic void method_4()
{
File f =new File("file.txt");
sop("path:"+f.getPath());
sop("abspath:"+f.getAbsolutePath());
sop("parent:"+f.getParent());//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
//如果相对路径中有上一层目录那么该目录就是返回结果。
}
重命名,也可用于快速剪切
publicstatic void method_5()
{
//重命名,也可用于快速剪切文件
File f1= new File("c:\\Test.java");
File f2= new File("d:\\hahah.java");
sop("rename:"+f2.renameTo(f1));
}
实例:文件的提取和过滤
import java.io.*;
class FileListDemo
{
publicstatic void main(String[] args)
{
File dir= new File("d:\\java\\exercise");
Filedir2 = new File("d:\\java\\exercise\\0603");
show(dir);
listFilter(dir2);
}
//获取指定目录下的所有文件
publicstatic void show(File dir)
{
System.out.println(dir);
File[]files = dir.listFiles();
for(File f : files )
{
if(f.isDirectory()) //如果是目录,则通过递归得到该目录下的所有文件
{
listFilter(f);
show(f);
}
else
System.out.println(f.getName());
}
}
//获取当前目录下所有java文件,通过匿名内部类
publicstatic void listFilter(File dir)
{
File[]files = dir.listFiles(new FilenameFilter()
{
publicboolean accept(File dir,String name)
{
returnname.endsWith(".java");
}
});
}
}
递归删除文件:
import java.io.*;
class RemoveDemo
{
publicstatic void main(String[] args)
{
File dir= new File("d:\\abd");
removeDir(dir);
}
publicstatic void removeDir(File dir)
{
File[]files = dir.listFiles();
for(File f : files )
{
if(f.isDirectory())//如果是文件夹,则递归调用自身函数
{
removeDir(f);
}
else
System.out.println(f.toString()+"...delete..."+f.delete());//如果是文件,则删除文件
}
System.out.println(dir+"...delete..."+dir.delete());
}
}
练习
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表文件。
思路:
1,对指定的目录进行递归。
2,获取递归过程所以的java文件的路径。
3,将这些路径存储到集合中。
4,将集合中的数据写入到一个文件中。
import java.io.*;
import java.util.*;
class JavaFileList
{
publicstatic void main(String[] args) throws IOException
{
File dir= new File("d:\\java1223");
List<File>list = new ArrayList<File>();
fileToList(dir,list);
//System.out.println(list.size());
Filefile = new File(dir,"javalist.txt");
writeToFile(list,file.toString());
}
publicstatic void fileToList(File dir,List<File> list)//先遍历文件夹,将.java文件的文件名存入list集合中
{
File[]files = dir.listFiles();
for(Filefile : files)
{
if(file.isDirectory())
fileToList(file,list);
else
{
if(file.getName().endsWith(".java"))
list.add(file);
}
}
}
publicstatic void writeToFile(List<File> list,String javaListFile)throwsIOException//将集合中的文件名写入文件
{
BufferedWriterbufw = null;
try
{
bufw= new BufferedWriter(new FileWriter(javaListFile));
for(Filef : list)
{
Stringpath = f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
}
catch (IOExceptione)
{
throwe;
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch(IOException e)
{
throwe;
}
}
}
}
二.Properties
public class Properties
extends Hashtable<Object,Object>
Properties
类表示了一个持久的属性集。Properties
可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
设置和获取元素
import java.io.*;
import java.util.*;
class PropertiesDemo
{
publicstatic void main(String[] args)
{
setAndGet();
}
//设置和获取元素
publicstatic void setAndGet()
{
Propertiesprop = new Properties();
prop.setProperty("zhangsan","25");//存放键值对,都是字符串
prop.setProperty("lisi","45");
System.out.println(prop);
Stringvalue = prop.getProperty("zhangsan");//通过键取值
System.out.println(value);
Set<String>names = prop.stringPropertyNames();//获取键集,jdk1.6新特性
for(String str:names )//遍历输出
{
System.out.println(prop.getProperty(str));
}
}
}
练习
记录应用程序运行次数。
如果使用次数已到,那么给出注册提示。
很容易想到的是:计数器。
可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。
可是随着该应用程序的退出,该计数器也在内存中消失了。
下一次在启动该程序,又重新开始从0计数。
这样不是我们想要的。
程序即使结束,该计数器的值也存在。
下次程序启动在会先加载该计数器的值并加1后在重新存储起来。
所以要建立一个配置文件。用于记录该软件的使用次数。
该配置文件使用键值对的形式。
这样便于阅读数据,并操作数据。
键值对数据是map集合。
数据是以文件形式存储,使用io技术。
那么map+io-->properties.
配置文件可以实现应用程序数据的共享。
import java.io.*;
import java.util.*;
class RunCount
{
publicstatic void main(String[] args) throws IOException
{
Propertiesprop = new Properties();
Filefile = new File("count.ini");
if(!file.exists())
file.createNewFile();
FileInputStreamfis = new FileInputStream(file);
prop.load(fis);
intcount = 0;
Stringvalue = 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中的其他类:
字节打印流:PrintStream
字符打印流:PrintWriter
/*
打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
字符打印流:
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer
*/
import java.io.*;
class PrintStreamDemo
{
publicstatic void main(String[] args) throws IOException
{
BufferedReaderbufr =
newBufferedReader(new InputStreamReader(System.in));
PrintWriterout = new PrintWriter(new FileWriter("a.txt"),true);
Stringline = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line.toUpperCase());
//out.flush();
}
out.close();
bufr.close();
}
}
序列流(合并流)SequenceInputStream
public class SequenceInputStream
extends InputStream
SequenceInputStream
表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
将三个文本文件的内容合并到一个文件中
import java.io.*;
import java.util.*;
class SequenceDemo
{
publicstatic void main(String[] args) throws IOException
{
Vector<FileInputStream>v = new Vector<FileInputStream>();//使用Vector的elements方法可以返回枚举类
v.add(newFileInputStream("c:\\1.txt"));
v.add(newFileInputStream("c:\\2.txt"));
v.add(newFileInputStream("c:\\3.txt"));
Enumeration<FileInputStream>en = v.elements();
SequenceInputStreamsis = new SequenceInputStream(en);
FileOutputStreamfos = 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();
}
}
切割文件
import java.io.*;
import java.util.*;
class SplitFile
{
publicstatic void main(String[] args) throws IOException
{
//splitFile();
merge();
}
publicstatic void merge()throws IOException
{
ArrayList<FileInputStream>al = new ArrayList<FileInputStream>();
for(intx=1; x<=3; x++)
{
al.add(newFileInputStream("c:\\splitfiles\\"+x+".part"));//创建三个文件碎片
}
finalIterator<FileInputStream> it = al.iterator();
Enumeration<FileInputStream>en = new Enumeration<FileInputStream>()//枚举类型的使用
{
publicboolean hasMoreElements()
{
returnit.hasNext();
}
publicFileInputStream nextElement()
{
returnit.next();
}
};
SequenceInputStreamsis = new SequenceInputStream(en);//添加到合并流
FileOutputStreamfos = 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();
}
publicstatic void splitFile()throws IOException
{
FileInputStreamfis = newFileInputStream("c:\\1.bmp");
FileOutputStreamfos = null;
byte[]buf = new byte[1024*1024];
int len= 0;
intcount = 1;
while((len=fis.read(buf))!=-1)
{
fos= newFileOutputStream("c:\\splitfiles\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}
fis.close();
}
}