io流函数略解(java_File)[一]
背景
最近在做安卓的过程中,因为im app经常涉及到读取与写入的io问题,所以总结一下。下文使用的是java语言。
实践
材料:
- java
- 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 有文件的意思也有文件夹的意思,文件夹就有目录啊。
在查询目录下的文件之前,起码想好下面几件事:
- 是否存在
- 这是否是一个目录
- 是否可读
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,然而发现不可能的了。上述纯属个人回忆,无实际考察,如有帮助不甚荣幸,有错之处望请指正。