1.文件是用来保存数据,我们写的java程序都是通过文件来保存的。文件通常保存在计算机磁盘中,所以文件是永久的,不是暂时的。当你要把数据保存在文件中时,要给文件起个名字,文件的全名字包含文件的路径名和扩展名,但我们单独讲一个文件名字时,是不带文件路径的。文件的扩展名不是文件的格式,它只是文件的后缀名,有时候只是为了我们方便查询而已。
2.有时候我们希望把同一类型的文件封装到一起,我们就引入了目录,也称文件夹,当然目录中不只是能够存真实文件,它也可有子目录,但是同一目录下不可能存在名字相同的目录或真实文件。系统中主要有3类文件,一种是目录类型的文件,第二种是真实文件,还有一种是虚拟内存文件,但我们通常只讲前面两种。
3.文件的路径:
文件的路径有两种,一种是相对路径,一种是绝对路径。相对路径是指这个文件路径引起的跟其他文件路径的关系。我举个例子:假设图片存入的位置为:D:\0903\学习\images\0.1gif中,你写的某个程序的存入位置为:D:\0903\学习\a.java中,那么,图片相对于某程序的相对路径为:images/0.1gif,那如果我把程序的存入位置改为:D:\0903\学习\java\a.java中,此时,图片相对于程序的相对路径是:/images/0.1gif.
绝对路径是指以根目录开头的路径。绝对路径很好理解,也就是文件存在哪个盘的哪个目录中,就不举例子了。
4.文件类的几种常用方法:
boolean isFile(),是用来判断File对象指向的文件是否是真实文件,如果是,就返回true,否则,返回false,
boolean createNewFile(),是用来创建一个新的真实文件的。
booLean isDirectory(),是用来判断File对象指向的文件是否是目录,如果是,返回true,否则,返回true
Boolean mkdir(),根据File对象的名字来创建一个目录。
boolean mkdirs(),如果File对象名字有多级目录,可以一次性创建。
5.当谈到文件时,我们应该要对文件进行一些操作,比如读写操作,文件的复制,判断盘中文件的个数等等。
判断盘中文件的个数:
public class FileDisplay {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String path="D:\\10";
FileDisplay fi=new FileDisplay();
int cou=fi.Count(path);
System.out.println("在该目录下找到文件的个数是:"+cou);
}
/**
* 统计文件的个数方法
* @param path
* @return
*/
public int Count(String path){
int count=0;//文件个数计数器
File file=new File(path);//创建一个file对象
File [] shuZu=file.listFiles();//将file对象里的文件或文件夹放到数组中
for(int i=0;i<shuZu.length;i++){//遍历数组
if(shuZu[i].isDirectory()){//如果是文件夹
String str=shuZu[i].getAbsolutePath();//得到该文件夹得绝对路径
count+=Count(str);
}
if(shuZu[i].isFile()){//如果是文件
count++;//使计数器加1
String str=shuZu[i].getAbsolutePath();//得到文件的绝对路径
System.out.println("文件:"+str);
}
}
return count;
}
测试结果:
文件:D:\10\test1.java
文件:D:\10\Win$1.class
文件:D:\10\Win.class
文件:D:\10\test1.class
文件:D:\10\re.java
文件:D:\10\WindowFrame.class
文件:D:\10\re.class
文件:D:\10\test.java
文件:D:\10\complex.class
文件:D:\10\test.class
文件:D:\10\Wo.java
文件:D:\10\GreedSnake.java
文件:D:\10\JFrameTest.java
文件:D:\10\jsq.java
文件:D:\10\ji.class
文件:D:\10\qqw.java
文件:D:\10\qq2.jpg
文件:D:\10\JFrameTest.class
文件:D:\10\qqw.class
文件:D:\10\Action.java
文件:D:\10\JFrame.java
文件:D:\10\qq.jpg
文件:D:\10\aQ.jpg.png
文件:D:\10\Actio.java
文件:D:\10\Actio.class
文件:D:\10\XDHO{~}Y~X5KF9WHFB)GBYL.jpg
文件:D:\10\list.cpp
文件:D:\10\b.c
文件:D:\10\b.dsp
文件:D:\10\Debug\vc60.idb
文件:D:\10\Debug\vc60.pdb
文件:D:\10\Debug\b.pch
文件:D:\10\b.ncb
文件:D:\10\b.plg
文件:D:\10\b.opt
文件:D:\10\b.dsw
文件:D:\10\hello\wo.java
文件:D:\10\Wo复制.java
在该目录下找到文件的个数是:38
如果要如果要进行文件的读写操作以及文件的复制,就必须引用输入流和输出流。输入流是指将磁盘中文件的数据读到内存中,而输出流是将内存中的数据写到磁盘中去,
文件的复制操作:
public class RWTest {
public static void main(String [] args){
String path="D:\\资料\\hello.doc";
String path1="D:\\资料\\hello复制.doc";
RWTest.WriteTest(path, path1);//调用该方法
}
public static void WriteTest(String path,String path1){
try{
java.io.FileInputStream input=new java.io.FileInputStream(path);//根据指定的路径读写文件
java.io.FileOutputStream output=new java.io.FileOutputStream(path1);//根据指定的路径写出文件
int t=input.read();//将读入的字符放到变量中去
while(t!=-1){
output.write(t);//把读入的字符写入
t=input.read();//然后再读入下个字符
}
output.flush();
output.close();//关闭流
input.close();//关闭流
}catch(Exception e){
e.getStackTrace();
}
}
}
文件的读写操作跟文件的复制操作差不多,我就不一一列举:
6.在判断文件的个数时,用到递归算法:就是当文件对象是目录时,得到该目录的路径,然后在递归,直到文件对象指的是真实文件时,才退出递归。
递归算法常用于处理一些无法穷举得计算,这些计算有一个共同点就是计算数据或对象的变化都是有规律的。递归必须给出退出递归条件,否则则是死循环,像判断文件个数操作时,退出递归的条件是,当File对象所指的文件是真实文件。