Java编程那些事儿86——文件操纵之File类利用
副标题#e#
11.3 I/O类利用
由于在IO操纵中,需要利用的数据源有许多,作为一个IO技能的初学者,从读写文件开始进修IO技能是一个较量好的选择。因为文件是一种常见的数据源,并且读写文件也是措施员举办IO编程的一个根基本领。本章IO类的利用就从读写文件开始。
11.3.1 文件操纵
文件(File)是最常见的数据源之一,在措施中常常需要将数据存储到文件中,譬喻图片文件、声音文件等数据文件,也常常需要按照需要从指定的文件中举办数据的读取。虽然,在实际利用时,文件都包括一个的名目,这个名目需要措施员按照需要举办设计,读取已有的文件时也需要熟悉对应的文件名目,才气把数据从文件中正确的读取出来。
文件的存储介质有许多,譬喻硬盘、光盘和U盘等,由于IO类设计时,从数据源转换为流工具的操纵由API实现了,所以存储介质的差异对付措施员来说是透明的,和实际编写代码无关。
11.3.1.1 文件的观念
文件是计较机中一种根基的数据存储形式,在实际存储数据时,假如对付数据的读写速度要求不是很高,存储的数据量不是很大时,利用文件作为一种耐久数据存储的方法是较量好的选择。
存储在文件内部的数据和内存中的数据差异,存储在文件中的数据是一种“耐久存储”,也就是当措施退出或计较构造机今后,数据照旧存在的,而内存内部的数据在措施退出或计较构造机今后,数据就丢失了。
在差异的存储介质中,文件中的数据都是以必然的顺序依次存储起来,在实际读取时由硬件以及操纵系统完成对付数据的节制,担保措施读取到的数据和存储的顺序保持一致。
每个文件以一个文件路径和文件名称举办暗示,在需要会见该文件的时,只需要知道该文件的路径以及文件的全名即可。在差异的操纵系统情况下,文件路径的暗示形式是纷歧样的,譬喻在Windows操纵系统中一般的暗示形式为C:\windows\system,而Unix上的暗示形式为/user/my。所以假如需要让Java措施可以或许在差异的操纵系统下运行,书写文件路径时还需要较量留意。
11.3.1.1.1 绝对路径和相对路径
绝对路径是指书写文件的完整路径,譬喻d:\java\Hello.java,该路径中包括文件的完整路径d:\java以及文件的全名Hello.java。利用该路径可以独一的找到一个文件,不会发生歧义。可是利用绝对路径在暗示文件时,受到的限制很大,且不能在差异的操纵系统下运行,因为差异操纵系统下绝对路径的表达形式存在差异。
相对路径是指书写文件的部道路径,譬喻\test\Hello.java,该路径中只包括文件的部道路径\test和文件的全名Hello.java,部道路径是指当前路径下的子路径,譬喻当前措施在d:\abc下运行,则该文件的完整路径就是d:\abc\test。利用这种形式,可以越发通用的代表文件的位置,使得文件路径发生必然的机动性。
在Eclipse项目中运行措施时,当前路径是项目标根目次,譬喻事情空间存储在d:\javaproject,当前项目名称是Test,则当前路径是:d:\javaproject\Test。在节制台下面运行措施时,当前路径是class文件地址的目次,假如class文件包括包名,则以该class文件最顶层的包名作为当前路径。
别的在Java语言的代码内部书写文件路径时,需要留意巨细写,巨细写需要保持一致,路径中的文件夹名称区分巨细写。由于’\’是Java语言中的非凡字符,所以在代码内部书写文件路径时,譬喻代表“c:\test\java\Hello.java”时,需要书写成“c:\\test\\java\\Hello.java”或“c:/test/java/Hello.java”,这些都需要在代码中留意。
11.3.1.1.2 文件名称
文件名称一般回收“文件名.后缀名”的形式举办定名,个中“文件名”用来暗示文件的浸染,而利用后缀名来暗示文件的范例,这是当前操纵系统中常见的一种形式,譬喻“readme.txt”文件,个中readme代表该文件时说明文件,而txt后缀名代表文件时文本文件范例,在操纵系统中,还会自动将特命名目标后缀名和对应的措施关联,在双击该文件时利用特定的措施打开。
其实在文件名称只是一个标示,和实际存储的文件内容没有一定的接洽,只是利用这种方法利便文件的利用。在措施中需要存储数据时,假如本身设计了特定的文件名目,则可以自界说文件的后缀名,来标示本身的文件范例。
和文件路径一样,在Java代码内部书写文件名称时也区分巨细写,文件名称的巨细写必需和操纵系统中的巨细写保持一致。
别的,在书写文件名称时不要健忘书写文件的后缀名。
#p#副标题#e#
11.3.1.2 File类
为了很利便的代表文件的观念,以及存储一些对付文件的根基操纵,在java.io包中设计了一个专门的类——File类。
#p#分页标题#e#
在File类中包括了大部门和文件操纵的成果要领,该类的工具可以代表一个详细的文件或文件夹,所以以前曾有人发起将该类的类名修改成FilePath,因为该类也可以代表一个文件夹,更精确的说是可以代表一个文件路径。
下面先容一下File类的根基利用。
1、File工具代表文件路径
File类的工具可以代表一个详细的文件路径,在实际代表时,可以利用绝对路径也可以利用相对路径。
下面是建设的文件工具示例。
public File(String pathname)
该示例中利用一个文件路径暗示一个File类的工具,譬喻:
File f1 = new File(“d:\\test\\1.txt”);
File f2 = new File(“1.txt”);
File f3 = new File(“e:\\abc”);
这里的f1和f2工具别离代表一个文件,f1是绝对路径,而f2是相对路径,f3则代表一个文件夹,文件夹也是文件路径的一种。
public File(String parent, String child)
也可以利用父路径和子路径团结,实现代表文件路径,譬喻:
File f4 = new File(“d:\\test\\”,”1.txt”);
这样代表的文件路径是:d:\test\1.txt。
2、File类常用要领
File类中包括了许多得到文件或文件夹属性的要领,利用起来较量利便,下面将常见的要领先容如下:
a、createNewFile要领
public boolean createNewFile() throws IOException
该要领的浸染是建设指定的文件。该要领只能用于建设文件,不能用于建设文件夹,且文件路径中包括的文件夹必需存在。
b、delect要领
public boolean delete()
该要领的浸染是删除当前文件或文件夹。假如删除的是文件夹,则该文件夹必需为空。假如需要删除一个非空的文件夹,则需要首先删除该文件夹内部的每个文件和文件夹,然后在可以删除,这个需要书写必然的逻辑代码实现。
c、exists要领
public boolean exists()
该要领的浸染是判定当前文件或文件夹是否存在。
d、getAbsolutePath要领
public String getAbsolutePath()
该要领的浸染是获恰当前文件或文件夹的绝对路径。譬喻c:\test\1.t则返回c:\test\1.t。
e、getName要领
public String getName()
该要领的浸染是获恰当前文件或文件夹的名称。譬喻c:\test\1.t,则返回1.t。
f、getParent要领
public String getParent()
该要领的浸染是获恰当前路径中的父路径。譬喻c:\test\1.t则返回c:\test。
g、isDirectory要领
public boolean isDirectory()
该要领的浸染是判定当前File工具是否是目次。
h、isFile要领
public boolean isFile()
该要领的浸染是判定当前File工具是否是文件。
i、length要领
public long length()
该要领的浸染是返回文件存储时占用的字节数。该数值得到的是文件的实际巨细,而不是文件在存储时占用的空间数。
j、list要领
public String[] list()
该要领的浸染是返回当前文件夹下所有的文件名和文件夹名称。说明,该名称不是绝对路径。
k、listFiles要领
public File[] listFiles()
该要领的浸染是返回当前文件夹下所有的文件工具。
l、mkdir要领
public boolean mkdir()
该要领的浸染是建设当前文件文件夹,而不建设该路径中的其它文件夹。假设d盘下只有一个test文件夹,则建设d:\test\abc文件夹则乐成,假如建设d:\a\b文件夹则建设失败,因为该路径中d:\a文件夹不存在。假如建设乐成则返回true,不然返回false。
m、mkdirs要领
public boolean mkdirs()
该要领的浸染是建设文件夹,假如当前路径中包括的父目次不存在时,也会自动按照需要建设。
n、renameTo要领
public boolean renameTo(File dest)
该要领的浸染是修改文件名。在修改文件名时不能改变文件路径,假如该路径下已有该文件,则会修改失败。
o、setReadOnly要领
public boolean setReadOnly()
该要领的浸染是配置当前文件或文件夹为只读。
3、File类根基示例
以上各要领实现的测试代码如下:
import java.io.File;
/**
* File类利用示例
*/
public class FileDemo {
public static void main(String[] args) {
//建设File工具
File f1 = new File("d:\\test");
File f2 = new File("1.txt");
File f3 = new File("e:\\file.txt");
File f4 = new File("d:\\","1.txt");
//建设文件
try{
boolean b = f3.createNewFile();
}catch(Exception e){
e.printStackTrace();
}
//判定文件是否存在
System.out.println(f4.exists());
//得到文件的绝对路径
System.out.println(f3.getAbsolutePath());
//得到文件名
System.out.println(f3.getName());
//得到父路径
System.out.println(f3.getParent());
//判定是否是目次
System.out.println(f1.isDirectory());
//判定是否是文件
System.out.println(f3.isFile());
//得到文件长度
System.out.println(f3.length());
//获恰当前文件夹下所有文件和文件夹名称
String[] s = f1.list();
for(int i = 0;i < s.length;i++){
System.out.println(s[i]);
}
//得到文件工具
File[] f5 = f1.listFiles();
for(int i = 0;i < f5.length;i++){
System.out.println(f5[i]);
}
//建设文件夹
File f6 = new File("e:\\test\\abc");
boolean b1 = f6.mkdir();
System.out.println(b1);
b1 = f6.mkdirs();
System.out.println(b1);
//修改文件名
File f7 = new File("e:\\a.txt");
boolean b2 = f3.renameTo(f7);
System.out.println(b2);
//配置文件为只读
f7.setReadOnly();
}
}
4、File类综合示例
#p#分页标题#e#
下面以两个示例演示File类的综合利用。第一个示例是显示某个文件夹下的所有文件和文件夹,道理是输出当前名称,然后判定当前File工具是文件照旧文件夹,假如则得到该文件夹下的所有子文件和子文件夹,并递归挪用该要领实现。第二个示例是删除某个文件夹下的所有文件和文件夹,道理是判定是否是文件,假如是文件则直接删除,假如是文件夹,则得到该文件夹下所有的子文件和子文件夹,然后递归挪用该要领处理惩罚所有子文件和子文件夹,然后将空文件夹删除。则测试时审慎利用第二个要领,以免删除本身有用的数据文件。示例代码如下:
import java.io.File;
/**
* 文件综合利用示例
*/
public class AdvanceFileDemo {
public static void main(String[] args) {
File f = new File("e:\\Book");
printAllFile(f);
File f1 = new File("e:\\test");
deleteAll(f1);
}
/**
* 打印f路径下所有的文件和文件夹
* @param f 文件工具
*/
public static void printAllFile(File f){
//打印当前文件名
System.out.println(f.getName());
//是否是文件夹
if(f.isDirectory()){
//得到该文件夹下所有子文件和子文件夹
File[] f1 = f.listFiles();
//轮回处理惩罚每个工具
int len = f1.length;
for(int i = 0;i < len;i++){
//递归挪用,处理惩罚每个文件工具
printAllFile(f1[i]);
}
}
}
/**
* 删除工具f下的所有文件和文件夹
* @param f 文件路径
*/
public static void deleteAll(File f){
//文件
if(f.isFile()){
f.delete();
}else{ //文件夹
//获恰当前文件夹下的所有子文件和子文件夹
File f1[] = f.listFiles();
//轮回处理惩罚每个工具
int len = f1.length;
for(int i = 0;i < len;i++){
//递归挪用,处理惩罚每个文件工具
deleteAll(f1[i]);
}
//删除当前文件夹
f.delete();
}
}
}
关于File类的利用就先容这么多,其它的要领和利用时需要留意的问题还需要多举办操练和实际利用。