第1章 IO概述
回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。
当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
因此我们把这种输入和输出动作称为IO操作。
第二章 File
简单了解IO是怎么一回事之后,接下来就要进一步做系统了解。
在我们操作系统中,数据都保存在文件中,而文件存放相应的文件夹中。那么Java中是如何描述这些的呢?
2.1 File类的出现
打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢?
这类具有平台无关性,既可以适合unix系统也适合window系统。
File静态方法的调用。
package cn.hiluna.demo;
import java.io.File;
/**
* java.io.File
* 将操作系统中的,文件,目录(文件夹),路径封装成file对象
* 提供方法,操作系统中的内容
* File与系统无关的类
* 文件--file
* 目录--directory
* 路径--path
*/
public class FileDemo {
public static void main(String[] args){
//File类静态成员变量
//与系统有关的路径分隔符
String separator = File.pathSeparator;
System.out.println(separator);//是一个分号,表示一个目录的分割。Linux :
//与系统有关的默认名称分隔符
separator = File.separator;
System.out.println(separator);//是一个向右的,目录的名称分割 linux /
}
}
1.3 File类的构造方法。
路径:
- 绝对路径:在系统中具有唯一性。
- c:windowssystem32
- http://www.baidu.com
- 相对路径:表示的是路径之间的相对关系。
- d:developJavajdkbin
- d:developJavajre7
- 路径之间的关系:
java 父目录是d:develop
java 子目录是jdk jre7 - 父目录是唯一性
- 子目录是多个的
File类的三种构造器
package cn.hiluna.demo;
import java.io.File;
/**
* File类的构造方法
* 三种重载形式
*/
public class FileDemo1 {
public static void main(String[] args){
function();
function_1("zhang");
function_2();
}
/**
* File(File parent,String child)
* 传递路径,传递File类型的父路径,字符串类型的子路径
* 好处:父路径是File类型,父路径可以直接调用File类的方法。
*/
public static void function_2(){
File parent = new File("User");
File file = new File(parent,"zhang");
System.out.println(file);
}
/**
* File(String parent,String child)
* 传递路径,传递字符串父路径,字符串的子路径
* 好处:单独操作父路径和子路径
*/
public static void function_1(String child){
File file = new File("User",child);
System.out.println(file);
}
/**
* File(String pathname)
* 传递路径名:可以写到一个文件夹,可以写到一个文件。
* 例如:c:abc 或者 c:abcDemo.java
* 将路径封装为File类型对象
*/
public static void function(){
/**
* windows下文件、目录名不区分大小写,linux区分
* 这个方法不会管你的路径是否正确。单独有判断的功能。单纯的是把路径变为对象
*/
File file = new File("/Users/zhang/Desktop/idea-workspace");
System.out.println(file);
}
}
File类创建文件、文件夹、删除功能
package cn.hiluna.demo;
import java.io.File;
import java.io.IOException;
/**
* File类的创建和删除功能
* 文件或者是目录
*/
public class FileDemo2 {
public static void main(String[] args)throws IOException{
function();
function_1();
}
/**
* File类的删除功能
* boolean delete()
* 删除的文件或者是文件夹,在File构造方法中给出
* 删除成功返回true,删除失败返回false
* 删除方法,不走回收站,直接从硬盘中删除
* 删除有风险,运行需谨慎
*/
public static void function_2(){
File file = new File("c:abc");
boolean b = file.delete();
System.out.print(b);
}
/**
* File创建文件夹功能
* 返回值:boolean。成功为true。
* mkdir()
* mkdirs()可以创建多层次的文件夹,同时他也可以创建一层文件夹,
* 即包裹了mkdir()这个函数的功能
* 创建的路径也在File构造方法中给出
* 已经存在,不再创建
*/
public static void function_1(){
File file = new File("/Users/zhang/Desktop/idea-workspace/ABC/A/B");
boolean b = file.mkdirs();
System.out.println(b);
}
/**
* File类创建文件的功能
* 返回值:boolean。成功为true。
* createNewFile()
* 创建的文件的路径和文件名,是在File构造方法中给出
* 如果文件已经存在,则不在创建。
* 这个方法只能创建文件不能创建文件夹。
*/
public static void function()throws IOException {
File file = new File("/Users/zhang/Desktop/idea-workspace/a.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
}
File类获取功能
- 获取构造方法中的父路径。
- 获取构造方法中的绝对路径。
- 获取构造方法中文件的字节数。
- 获取构造方法中文件或目录的文件名。
package cn.hiluna.demo;
import java.io.File;
public class FileDemo3 {
/**
* File类的获取功能
*/
public static void main(String[] args){
function();
function_1();
function_2();
function_3();
}
/**
* File类的获取功能
* String getParent() 返回String对象
* File getParentFile()返回File对象
* 获取父路径
* 盘符为最高目录没有父目录,在拿为null。
*/
public static void function_3(){
File file = new File("E:day22srccnhilunademoFileDemo.java");
File parent = file.getParentFile();
System.out.println(parent);
}
/**
* File类的获取功能
* String getAbsolutepath() 返回String对象
* File getAbsoluteFile() 返回File对象
* 获取绝对路径
* eclipse环境中,写的是一个相对路径,绝对位置为工程根目录。
*/
public static void function_2(){
File file = new File("E:day22srccnhilunademoFileDemo.java");
File file1 = file.getAbsoluteFile();
System.out.println(file1);
}
/**
* File类获取功能
* long length()
* 返回路径中表示的文件的字节数,拿不到文件夹的字节数
*/
public static void function_1(){
File file = new File("E:day22srccnhilunademoFileDemo.java");
long length = file.length();
System.out.println(length);
}
/**
* File类的获取功能
* String getName()
* 返回路径中表示的文件或者文件夹名
* 获取路径中的最后部分的名字,可以为文件夹,也可以为文件名。
* 即使为错误的路径或者文件名,也一样获取。
*/
public static void function(){
File file = new File("d:eclipseeclipse.exe");
String name = file.getName();
System.out.println(name);
String path = file.getPath();//将File中封装的路径转化为一个字符串
System.out.println(path);
System.out.println(file);
}
}
程序运行截图:
File类的判断功能
- 判断构造方法中的路径是否为文件。
- 判断构造方法中的路径是否为文件夹。
- 判断构造方法中的路径是否存在。
package cn.hiluna.demo;
import java.io.File;
public class FileDemo4 {
/**
* File类的判断功能
*/
public static void main(String[] args){
function();
function_1();
}
/**
* File判断功能
* boolean isDirectorty()
* 判断是否为目录
* 是 true 不是false
*
* boolean isFile()
* 判断是否为文件
*/
public static void function_1(){
File file = new File("E:day22srccnhilunademoFileDemo.java");
if(file.exists()){//先判断是否存在
boolean b = file.isDirectory();
System.out.println(b);
}
}
/**
* File判断功能
* boolean exists()
* 判断File构造方法中封装路径是否存在
* 存在ture,不存在false
* 同样写相对路径,他的绝对路径同样为工程根目录
*/
public static void function(){
File file = new File("E:day22srccnhilunademoFileDemo.java");
boolean b = file.exists();
System.out.println(b);
}
}
File类获取功能-2
- list
- listFiles
- listRoots(是一个静态的方法)
list方法:
返回值:String[]
调用方法:file.list();
获取到,File构造方法中封装的路径中的文件和文件夹名(遍历一个目录)
返回只有名字
代码如下:
public static void function(){
File file = new File("c:");
String[] strArr = file.list();
System.out.println(strArr.length);
for (String str : strArr){
System.out.println(str);
}
}
运行结果:
listFiles方法:
返回值:File[]
调用方法:file.listFiles();
获取到,File构造方法中封装的路径中的文件和文件夹名(遍历一个目录)
返回的是目录或者文件的全路径
推荐使用
代码如下:
public static void function_1(){
File file = new File("c:");
File[] fileArr = file.listFiles();
for (File f : fileArr){
String s =f.toString();//转为String类型
System.out.println(f);
}
}
运行结果:
listRoots方法:
返回值:File[]
调用方法:File.listRoots();
获取系统所有根目录
代码如下:
public static void function_2(){
//获取系统中所有根目录
File[] fileArr = File.listRoots();
for (File f : fileArr){
System.out.println(f);
}
}
运行结果:
文件获取过滤器
- 通过listFiles方法获取目录的时候,可以根据需求,只获取满足条件的文件。
- 这里用到的方法是
listFiles()
的重载形式 listFiles(FileFilter filter)
接口类型- 传递
FileFilter
接口实现类,因为它并没有实现类,因此需要自定义FileFilter接口的实现类,重新抽象方法。 - 通过接口实现类对象传递到遍历方法
listFiles
。
先是listFiles
方法的代码:
package cn.hiluna.demo;
import java.io.File;
/**
* File类的获取,文件获取的过滤器
* 遍历一个目录的时候,可以根据需求,只获取满足条件的文件
* 遍历目录方法listFiles()重载形式
* listFiles(FileFilter filter)接口类型
* 传递FileFilter接口实现类
* 并没有实现类,所以需要自定义FileFilter接口的实现类,重写抽象方法,
* 接口实现类对象传递到遍历方法listFiles
*/
public class FileDemo06 {
public static void main(String[] args) {
File file = new File("E:day22_video");
File[] fileArr = file.listFiles(new MyFilter());
for (File f : fileArr){
System.out.println(f);
}
}
}
接口FileFilter
的代码:
package cn.hiluna.demo;
import java.io.File;
import java.io.FileFilter;
/**
* 自定义过滤器
* 实现FileFilter接口,重写抽象方法
*/
public class MyFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
/**
* pathname接受到的也是文件全路径
* 对路径进行判断,如果是txt文件,返回ture,如果不是,返回false
* 文件的后缀结尾是.txt
*/
//pathname.getName();获取文件名
//.endsWith(".txt");判断字符串的结尾是啥,如果是返回true,不是返回false
return pathname.getName().endsWith(".txt");
}
}
思考流程图:
listFiles
获取到文件路径。listFiles
将文件路径传递到接口实现类中,由accept(File pathname)
方法中pathname
接受- 文件路径在
accept(File pathname)
方法中进行判断,如果返回true,文件路径就会被添加到File[]
数组中,如果返回false则不会被添加。
递归遍历目录
即遍历一个目录所有文件,及其子目录的所有文件。
思维导图:
代码演示:
package cn.hiluna.demo;
import java.io.File;
/**
* 对一个目录下的所有内容,进行完全遍历
* 编程技巧,方法的递归调用,方法自己调用自己。
*/
public class FileDemo07 {
public static void main(String[] args) {
File dir = new File("E:CLion 2018.2.2");
getAllDir(dir);
}
/**
* 定义方法,实现目录的全遍历
*/
public static void getAllDir(File dir){
System.out.println(dir);
//调用方法listFiles()对目录dir进行一个遍历
File[] files = dir.listFiles();
for (File f : files){
//判断变量f表示的路径是不是文件夹
if (f.isDirectory()){
//是一个目录,就要去遍历这个目录
//本方法,getAllDir,就是给个目录去遍历
//继续调用getAllDir,传递目录
getAllDir(f);
}else {
System.out.println(f);
}
}
}
}