io流函数略解(java_File)[一]

背景

最近在做安卓的过程中,因为im app经常涉及到读取与写入的io问题,所以总结一下。下文使用的是java语言。

实践

材料:

  1. java
  2. eclipse

1.File

在操作系统中我们一般能看到的就只有文件和文件夹。所以一般我们操作的一般也是他们,所以file就变得至关重要了,同样java把操作文件或文件夹的定义为File类,在基础包java.io中。

使用方式:

File file=new File("c:\\test.txt");

上述实例化源码:

public File(String pathname) {
  if (pathname == null) {
      throw new NullPointerException();
  }
  this.path = fs.normalize(pathname);
  this.prefixLength = fs.prefixLength(this.path);
}                     

从上述中查看看到在实例化的过程看到一个是序列化了路径,然后取得了路径前缀的长度。
值得注意的是:因为这里使用了c:\test.txt,是使用//来表达,然而在linux中使用的却是/,File.separator可以取得当前系统分隔符,这降低了我们在写跨平台代码的错误率。
对文件的操作无非是增删改查,首先是从查看吧。查分为查看文件信息的读取查看。
查路径名:

 File file=new File("c://test.txt");
 System.out.println(file.getPath());
 System.out.println(file.getAbsolutePath());
 try {
   System.out.println(file.getCanonicalPath());
} catch (IOException e) {
   // TODO: handle exception
}

分别取得了我们输入的路径,绝对路径,以及规范的路径。

可以看出规范的路径把c盘这个c变成了大写,在这里我加上了try 和catch,如果不加的话会编译不过,这是因为编写规范路径的时候对path进行了验证。
下面是具体验证的源码:

if (isInvalid()) {
   throw new IOException("Invalid file path");
}
final boolean isInvalid() {
	if (status == null) {
		status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED: PathStatus.INVALID;
	}
	return status == PathStatus.INVALID;
}

这是一种很常见的操作,在io操作中有很多需要我们处理的异常,有些刚开始学的人可能报错了觉得莫名奇妙。
查权限:

System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.canExecute());


我们查看到都为false,这是为何?难道设置了权限。其实我根本就没有创建这个文件,这是一个很关键的地方,也就是这些函数我们只能相信true不能相信false,false有太多可能性了。
File 有文件的意思也有文件夹的意思,文件夹就有目录啊。
在查询目录下的文件之前,起码想好下面几件事:

  1. 是否存在
  2. 这是否是一个目录
  3. 是否可读
if(file.exists()&&file.isDirectory()&&file.canRead())
{
 // get subdirectory and file in the file
 file.listFiles();
}

甚至提供可以进行过滤:

 file.listFiles(new FilenameFilter() {
	
	@Override
	public boolean accept(File dir, String name) {
		return false;
	}
});

例如需要知道某个文件夹是否存有某个文件:

File[] files=file.listFiles(new FilenameFilter() {
	
	@Override
	public boolean accept(File dir, String name) {
		if (dir.isFile()&&name=="xxx") {
			return true;
		}
		return false;
	}
});
if (files.length>0) {
	
}

增与删:
对于文件:
bool createNewFile(): 创建一个文件;
bool delete():删除文件或文件夹;

对于文件夹:
boolean mkdir():创建一个目录;
boolean mkdirs():创建当前一个目录,和mkdir不同的是如果c:/parent/child,如果parent不存在的时候会帮助我们创建;
boolean delete():删除文件或文件夹;
上述这些都觉得贫乏,那么临时文件可以说是一个亮点,比如我们写一些兴趣性代码的时候,创建了一个文件。我们想用完就删,但是呢,中间报错了,可能就需要手动了。

 try {
	 File file=File.createTempFile("tempTest",".txt");
	 file.deleteOnExit();
} catch (Exception e) {
	// TODO: handle exception
	e.printStackTrace();
}

上述也许会解放你的双手。
如果需要创建在某个特定的目录下:

File f=new File("c:\\")
File file=File.createTempFile("tempTest",".txt",f);

第三个参数是一个File 类型,里面是需要放置的目录。

总结

本来打算自己总结一篇就ok,然而发现不可能的了。上述纯属个人回忆,无实际考察,如有帮助不甚荣幸,有错之处望请指正。

posted @ 2019-12-08 21:25  敖毛毛  阅读(354)  评论(0编辑  收藏  举报