File和IO流
一、File
java.io.File 类是专门对文件进行操作的类。(只能对文件本身进行操作,不能对文件内容操作)
- File类是“文件和目录路径名的抽象表示”。而不是指文件的内容。
- File类定义了一些与平台无关的方法操作,如:创建、删除文件和重命名等。
- Java中目录被看成是一个特殊的文件。List()方法可以返回目录中所有的子目录和文件。
- 在linux下路径分隔符为(/),而在windos中则是为(\),在java中可以正确的处理不同系统中的分隔符。
1.1File类常用构造方法和属性
1.1.1常用构造方法
1、public File(String pathname)
//以pathname为路径创建File对象,如果pathname是相对路径,(对java工程来说,就是该工程的根目录。)
2、File(String parent, String child)
1.1.2 属性
1、public static finalString separator 存储了当前系统的名称分隔符
//在 LINUX和Mac系统上,此字段的值为 '/';在 Windows 系统上,它为 '\'.为了程序的跨平台特性,文件的路径应该用这个属性值来代表。
2、public static finalchar pathSeparator 存储了当前系统默认路径分割符号
//Windows系统是; 即path环境变量中,不同的路径的分割符号。LINUX系统是:
- 系统分隔符、以windows为例 为 ‘;’
1.2 File类的常用方法
1.2.1 获取文件的属性
File file = new File("./a.txt");
file.separator; //分隔符 windows返回\ linux返回/
System.out.println("判断是否是一个文件(file.isFile()):"+file.isFile());
System.out.println("判断是否是隐藏文件或目录(file.isHidden()):"+file.isHidden());
System.out.println("最后修改时间(file.lastModified()):"+file.lastModified());
System.out.println("文件长度(以字节为单位):"+file.length());
System.out.println("获取文件名字:"+file.getName());
System.out.println("获取文件路径:"+file.getPath());
1.2.2 对于文件的操作
boolean bool = file.mkdir();//可以创建文件对象的上一级目录
boolean morebool = file.mkdirs();//判断路径是否存在,如果不存在,就创建对应目录(多级)
//删除:如果file为文件直接删除 ,如果是文件夹,只有空文件夹才能被删除,否则就要遍历文件里的内容一一删除
boolean isDelete = file.delete();
File [] list = file.listFiles();//得到目录下所有的直接子目录和文件()
在获取文件和目录过程中,还可以对文件和目录进行筛选(或者过滤): 借助FileFilter 函数式接口,重写accept()方法,类似stream流的 filter操作
File file = new File("./myfile");
// 判断是否是一个目录
if (file.isDirectory()) {
File[] all = file.listFiles(new FileFilter() {
@Override
public boolean accept(File myfile) {
// 判断是否是一个目录,是就通过
if (myfile.isDirectory()) {
return true;
}
// 判断文件是否是以.txt结尾的,是就通过
if (myfile.getName().endsWith(".txt")) {
return true;
}
return false;
}
});
for (int i = 0; i < all.length; i++) {
System.out.println(all[i].getPath());
}
二、IO流
2.1什么是IO流
IO指的是Input/Output,IO流:输入输出流。 统称为数据流。(IO Stream)
在Java程序中,对于数据的输入 / 输出操作以流的方式进行;流是从起源到接收的有序数据。JDK提供了各种各样的流类,用以获取不同种类的数据;
2.2 IO流的分类
-
按流向分:
- 输入流:程序可以从中读取数据的流
- 输出流:程序能向其中写入数据的流
-
按数据传输单位分:
- 字节流:以字节为单位传输数据的流
- 字符流:以字符为单位传输数据的流
-
按功能分:
- 节点流:用于直接操作目标设备的流
- 处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更强大、灵活的读写功能。
2.3 IO流的基类
分类 | 字节输出流 | 字节输入流 | 字符输出流 | 字符输入流 |
---|---|---|---|---|
抽象基类 | OutputStream | InputStream | Writer | Reader |
访问文件 | FileOutputStream | FileInputStream | FileWriter | FileReader |
访问数组 | ByteArrayOutputStream | ByteArrayInputStream | CharArrayWriter | CharArrayReader |
访问管道 | PipedOutputStream | PipedInputStream | PipedWriter | PipedReader |
访问字符串 | StringWriter | StringReader | ||
缓冲流 | BufferedOutputStream | BufferedInputStream | BufferedWriter | BufferedReader |
转换流 | OutputStreamWriter | InputStreamReader | ||
对象流 | ObjectOutputStream | ObjectInputStream | ||
抽象基类 | FilterOutputStream | FilterInputStream | FilterWriter | FilterReader |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataOutputStream | DataInputStream |
2.3.1 InputStream字节输入流
继承自InputStream的流都是用于向程序中输入数据的,且数据的单位为字节(8位),下图中深色为节点流,浅色为处理流
InputStream基本方法:
public abstract int read() throwsIOException
从输入流中读取数据的下一个字节, 返回读到的字节值.若遇到流的末尾,返回-1
public int read(byte[] b) throwsIOException
从输入流中读取 b.length 个字节的数据并存储到缓冲区数组b中.返回的是实际读到的字节总数
public int read(byte[] b, int off, int len)throws IOException
读取 len 个字节的数据,并从数组b的off位置开始写入到这个数组中
public void close() throws IOException
关闭此输入流并释放与此流关联的所有系统资源
public int available() throws IOException
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数
public skip(long n) throws IOException
跳过和丢弃此输入流中数据的 n 个字节,返回实现路过的字节数。
2.3.2 OutputStream字节输出流
继承自OutputStream的流是程序用于向外输出数据的,且数据的单位为字节(8位),下图中深色为节点流,浅色为处理流
OutputStream主要方法:
public abstract void write(int b) throwsIOException
将指定的字节写入此输出流
public void write(byte[] b) throwsIOException
将 b.length 个字节从指定的 byte 数组写入此输出流
public void write(byte[] b, int off, intlen) throws IOException
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
public void flush() throws IOException
刷新此输出流并强制写出所有缓冲的输出字节
pulbic void close() throws IOException
关闭此输出流并释放与此流有关的所有系统资源
2.3.3 Reader字符输入流
继承自Reader的流都是用于向程序中输入数据的,且数据的单位为字符(16位),下图中深色为节点流,浅色为处理流
public int read() throws IOException
读取单个字符,返回作为整数读取的字符,如果已到达流的末尾返回-1
public int read(char[] cbuf) throwsIOException
将字符读入数组,返回读取的字符数
public abstract int read(char[] cbuf,int off, int len) throws IOException
读取 len 个字符的数据,并从数组cbuf的off位置开始写入到这个数组中
public abstract void close() throwsIOException
关闭该流并释放与之关联的所有资源
public long skip(long n) throwsIOException
跳过n个字符。
2.3.4 Writer字符输出流
继承Writer的流都是向程序中输出数据,且数据的单位为字符(16 bit);下图中深色为节点流,浅色为处理流
public void write(int c) throwsIOException
写入单个字符
public void write(char[] cbuf) throws IOException
写入字符数组
public abstract voidwrite(char[] cbuf, int off, int len) throws IOException
写入字符数组的某一部分
public void write(String str) throwsIOException
写入字符串
public void write(String str,int off, int len) throws IOException
写字符串的某一部分
public abstract void close() throwsIOException
关闭此流,但要先刷新它
public abstract void flush() throwsIOException
刷新该流的缓冲,将缓冲的数据全写到目的地
2.4 节点流
节点流为可以从一个特定的数据源(节点)读写数据(如:文件,内存)
类型 字符流 字节流 File(文件) FileReader;FileWriter FileInputStream;FileOutputStream Memory Array CharArrayReader;CharArrayWriter ByteArrayInputStream;ByteArrayOutputStream Memory String StringReader;StringWriter — Pipe PipedReader;PipedWriter PipedInputStream;PipedOutPutStream