java IO笔记2(文件)

时间:2022-01-09 22:08:48

本篇讲述在Java IO中对文件的一些操作,在java IO中,文件是一种最常见的数据源。因此java IO对其提供了专门的IO流来进行操作。

java提供了一个类来表示文件,这个类就是file类,位于java.io.file。该类的功能十分强大,下面将一一介绍。

首先我们来看看file类的构造方法,在我使用的jdk1.7中,该类一共提供了4个构造方法,分别为:

  1. public File(String pathname) pathname是目标文件的路径,可以使绝对路径,也可以是相对路径。
  2. public FIle(String parent, String child) parent是父文件的路径,child是目标文件的路径,可以使绝对路径,也可以是相对路径。
  3. public File(File parent, String child)parent是父文件对象,child是目标文件的路径,可以使用绝对路径,也是是相对路径。
  4. public File(Url url)url是目标文件的url。这里的url是统一资源定位符,如果不知道的话可以查询一下资料,如今发达的互联网使我们学习东西非常的方便。
File类还提供了一些方法来帮助我们对文件进行操作,下面将列举一些常见的方法:
  1. boolean createNewFile();   创建文件,如果文件存在则返回false,否则返回true,并创建文件。
  2. boolean mkdir();    创建目录。
  3. boolean mkdirs();    创建多级目录。
  4. boolean delete(); 删除文件,如果是文件夹,必须保证是空文件夹才能删除成功。
  5. boolean deleteOnExit();  删除文件,功能基本与delete方法一样,唯一的区别就是该方法不是立即执行,而是等到虚拟机运行结束的时候才真正的删除文件。
  6. boolean canExecute(); 判断文件是否可以执行。
  7. boolean canRead(); 判断文件是否可读。
  8. boolean canWrite(); 判断文件是否科协。
  9. boolean exists(); 判断文件是否存在。、
  10. boolean isDirectory(); 判断文件是否是目录。
  11. boolean isFile(); 判断文件是否是文件(不是目录)。
  12. boolean isHidden(); 判断文件是否是隐藏的。
  13. String getName(); 获取文件名。
  14. String getPath(); 获取文件相对路径。
  15. String getAbsolutePath(); 获取文件绝对路径。
  16. String getParent(); 返回父目录,如果没有则返回null。
  17. long lastModified(); 返回最后一次修改时间,单位为毫秒,可以用Date类进行转换。
  18. long length(); 返回文件的大小,单位是字节。
  19. boolean renameTo(File f); 重命名文件,可以起到移动文件的作用,磁盘的格式影响该方法的成功率。
  20. File[] liseRoots(); 获取机器盘符。
  21. String[] list(FilenameFilter filter);   列出符合过滤器的所有文件名。
通过以上方法我们可以对文件系统进行丰富的操作,下面将通过代码一一展示。
private void initFile() throws Exception {
// public File(String pathname)pathname使用绝对路径
file1 = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\test.txt");
// public File(String pathname)pathname使用相对路径
file = new File(".\\src\\file\\test.txt");
// public File(String parent, String child)
file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file","test.txt");
// public File(URI uri)
URI url = new URI("file:///e:/workspaceforlibgdx/IOStudy/src/file/test.txt");
file = new File(url);

}

我在指定目录下放下了test.txt文本,上面的四种初始化方式均能得到,指定文件的File对象。

private void doCreateAction() throws Exception{
System.out.println("========================doCreateAction===============================");
//在下述路径下创建文件,因为目标路径下没有该文件,所以返回true,并创建对应文件。
file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\create.txt");
flag = file.createNewFile();
System.out.println(flag);
//在下述路径下创建文件夹,因为目标路径下没有该文件夹,所以返回true,并创建对应文件夹。
file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\file1");
flag = file.mkdir();
System.out.println(flag);
//在下述路径下创建多级文件夹,因为目标路径下没有这些文件夹,所以返回true,并创建对应文件夹。
file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\file1\\file2\\file3");
flag = file.mkdirs();
System.out.println(flag);
}


上述方法会在指定位置创建相应的文件和目录,执行后,可以看到如下打印:
java IO笔记2(文件)



private void doDeleteAction() throws Exception{
System.out.println("=================================doDeleteAction====================================");
//delete方法可以删除指定的文件,删除文件夹时,必须保证该文件是空文件夹,否则删除失败。
//deleteOnExit方法同delete方法一样用于删除文件,唯一区别就是,delete方法是执行时就会删除,而该方法则是在虚拟机运行结束时才会删除。
file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\delete.txt");
file.createNewFile();
flag = file.delete();
System.out.println(flag);
file.deleteOnExit();
}


执行上述代码可以删除指定位置的文件,执行后,可以看到如下打印: java IO笔记2(文件)

private void doQueryAction() {
System.out.println("=====================================doQueryAction==================================");
file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file");
//getName方法获取文件名。
System.out.println("file.getName:"+file.getName());
//getPath方法获取相对路径。
System.out.println("file.getPath:"+file.getPath());
//getAbsolutePath方法获得绝对路径。
System.out.println("file.getAbsolutePath:"+file.getAbsolutePath());
//getParent方法获得父文件的路径。
System.out.println("file.getParent:"+file.getParent());
//lstModified方法获得最后一次修改文件的时间,返回long型,可以通过Date类进行转换。
System.out.println("file.lastModified:"+new Date(file.lastModified()));
//length方法返回文件的大小,单位是字节。
System.out.println("file.length():"+file.length());
//renameTo方法可以将该文件重命名或者移动位置,但磁盘格式有时候会影响该方法是否能执行成功
System.out.println("file.length:"+file.renameTo(file));
//listRoots方法可以获取系统盘符
System.out.println("File.listRoots==================");
File[] files = File.listRoots();
for(File file : files){
System.out.println(file.getPath());
}
//listFiles方法是列出指定目录下的所有文件
System.out.println("file.listFiles==================");
File[] files1 = file.listFiles();
for(File file : files1){
System.out.println(file.getPath());
}
//list方法师列出指定目录下所有文件名
System.out.println("file.list==================");
String[] lists = file.list();
for(String list : lists){
System.out.println(list);
}
//list(new FilenameFilter)方法可以添加过滤器来对返回的文件名践行筛选,下面是过滤出包含txt的文件
System.out.println("file.list(new filenamefilter)==================");
String[] lists1 = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(name.contains("txt")){
return true;
}
return false;
}
});
for(String list : lists1){
System.out.println(list);
}
}


执行上述代码,可以对文件或者目录进行一些信息的查询,执行后,可以看到如下打印:
java IO笔记2(文件)java IO笔记2(文件)


public void doJudgeAction(){
System.out.println("=================================doJudgeAction====================================");
System.out.println("file1.canExecute:"+file1.canExecute());
System.out.println("file1.canRead:"+file1.canRead());
System.out.println("file1.canWrite:"+file1.canWrite());
System.out.println("file1.exists:"+file1.exists());
System.out.println("file1.isDirectory:"+file1.isDirectory());
System.out.println("file1.isFile:"+file1.isFile());
System.out.println("file1.isHidden:"+file1.isHidden());
System.out.println("file1.isAbsolute:"+file1.isAbsolute());
}
执行上述代码,可以对文件进行一些判断,执行后得到如下打印:
java IO笔记2(文件)


通过上述的方法,我们再加以修改,完全可以写出一些好玩的东西,如写一个文件查找器亦或是一个文件删除工具。
public void doQueryAllAction() {
Scanner scanner = new Scanner(System.in);
String path = scanner.next();
File root = new File(path);
if (root.exists()) {
queryTool(root, 0);
} else {
System.out.println("you type a wrong path");
}
scanner.close();
}

private ArrayList<File> queryTool(File file, int lev) {
if (file.isFile()) {
list.add(file);
System.out.println("文件"+getSymbols(lev,false) + file.getName());
} else if (file.isDirectory()) {
System.out.println("目录"+getSymbols(lev,true) + file.getName());
lev++;
File[] files = file.listFiles();
for (File temp : files) {
queryTool(temp, lev);
}
}
return list;
}

private String getSymbols(int number,boolean isfile) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < number; i++) {
if(isfile){
sb.append("-");
}else {
sb.append("-");
}
}
return sb.toString();
}

执行doQueryAllAction方法,可以根据输入的路径,罗列出指定路径下的所有文件,执行后得到如下打印:
java IO笔记2(文件)

private boolean doDeleteAllAction(){
doQueryAllAction();
for(File file : list){
System.out.println("文件【"+file.getName()+"】已删除");
file.delete();
}
return true;
}

执行上述方法可以删除输入路径下的所有文件,执行后得到如下打印:
java IO笔记2(文件)

以上就是对于java.io中file类的一些操作了,是不是很神奇呢,java完全可以模拟我们平常对文件的一些操作,创建,移动,删除等等,下面要讲的就是如何往文件中写入数据了,这里就要用到流了。
//除了使用FileReader还可以使用FileInputStream进行文件读取,当然你还可以使用RandomAccessFile来进行选择性读取。
private void doReadAction() throws Exception {
Scanner scanner = new Scanner(System.in);
String path = scanner.next();
File root = new File(path);
StringBuffer sb = new StringBuffer();
if (root.isFile()) {
FileReader fr = new FileReader(root);
char[] temp = new char[1024];
while (fr.read(temp) != -1) {
sb.append(temp);
}
fr.close();
scanner.close();
System.out.println(sb.toString());
}
}

通过上述方法,可以读取指定路径下的文件(暂指文本文件),执行后,得到如下打印:
java IO笔记2(文件)

private void doWriteAction() throws Exception {
Scanner scanner = new Scanner(System.in);
String path = scanner.next();
File root = new File(path);
if(root.isFile()){
FileWriter fw = new FileWriter(root);
fw.write("java io操作 之 文件 ");
System.out.println("文件写入完成");
fw.close();
scanner.close();
}
}

执行上述方法可以向指定文件内写入内容,执行后得到如下打印:
java IO笔记2(文件)java IO笔记2(文件)

关于java io 文件的操作就暂且说到这儿吧,下面将要讲述管道的内容。