File跟Io流的学习
- 文件可认为是相关记录或放在一起的数据的集合。文件一般存放在存储介质上:硬盘、u盘、光盘、软盘、云盘等。
- java.io.File 类是专门对文件进行操作的类。(只能对文件本身进行操作,不能对文件内容操作)
- File类是“文件和目录路径名的抽象表示”。 而不是指文件的内容(IO)。
- File类定义了一些与平台无关的方法操作,如:创建、删除文件和重命名等。
- Java中目录被看成是一个特殊的文件。 File.listFiles()方法可以返回目录中所有的子目录和文件。
- 在unix下路径分隔符为(/),而在windos中则是为(\),在java中可以正确的处理不同系统中的分隔符。注意:从1.5开始在java中可以统一使用(/)来作为路径分隔符。
1.2 File类的构造方法
- public File(String pathname); 以pathname为路径创建File对象,如果pathname是相对路径,则是相对于Java的系统属性user.dir中的路径。(对eclipse创建的java工程来说,就是该工程的根目录。)
1.3 File类文件属性
1.3.1 属性:
- public static final String separator 存储了当前系统的名称分隔符,在 UNIX 和Mac系统上,此字段的值为 ‘/’;在 Windows 系统上,它为 ‘\’;为了程序的跨平台特性,文件的路径应该用这个属性值来代表。
- public static final char pathSeparator 存储了当前系统默认路径分割符号,在 UNIX 和Mac系统上,此字段的值为’:’,Windows系统是’;’。
1.4 使用File类对文件进行访问
方法名 | 描述 |
---|---|
public boolean canRead() | 是否可读 |
public boolean canWrite() | 是否可写 |
public boolean exists() | 文件或目录是否存在 |
public boolean isDirectory() | 是否是目录(文件夹) |
public boolean isFile() | 是否是文件(非目录) |
public boolean isHidden() | 是否是隐藏文件 |
public long lastModified() | 最后一次修改的时间 |
public long length() | 返回文件大小,以字节为单位 |
public String getName() · | 返回文件的名字(不包含路径) |
public String getPath() · | 返回创建File时使用指定的路径;1 |
public String getAbsolutePath() · | 返回此File对象的绝对路径名 |
public File getAbsoluteFile() · | 返回该文件的绝对路径的文件对象。 |
public String getParent() | 返回该文件所在的目录的路径。 |
public File getParentFile() | 返回该文件所在的目录对象。 |
1.5 使用File类对文件进行操作
方法名 | 描述 |
---|---|
public boolean createNewFile() | 当文件不存在是,则创建一个空文件 |
public boolean delete() | 删除文件。如果是目录必须是空目录才能删除 |
public boolean mkdir() | 创建此抽象路径名指定的目录 |
public boolean mkdirs() | 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录 |
public boolean renameTo(File dest) | 重新命名此抽象路径名表示的文件 |
1.6 使用File类浏览目录中的文件和子目录
方法名 | 描述 |
---|---|
public String[] list() | 返回此目录中的文件名和目录名的数组 |
public File[] listFiles() | 返回此目录中的文件和目录的File实例数组 |
public File[] listFiles(FilenameFilter filter) | 返回此目录中满足指定过滤器的文件和目录 |
课堂练习:使用 递归算法 打印出目录(文件夹)中所有文件与目录(包括目录内部的文件和目录)。
private static void listChilds(File f){ if (f==null) return; System.out.println(f.getPath()); if (f.isFile()) return; File[] files = f.listFiles(); if (files==null||files.length<=0) return; for (File file : files) listChilds(file); }
2 IO概念和种类:
2.1 什么是IO流?
IO指的是 Input/Output,IO流:输入输出流。 统称为数据流。(IO Stream)
在Java程序中,对于数据的输入 / 输出操作以流的方式进行;流是从起源到接收的有序数据。JDK提供了各种各样的Stream 类,用以获取不同种类的数据;
IO流的作用就是对文件数据的读和写。
2.2 流的作用和原理?
3 IO流的种类:
3.1 输入流、输出流
- 输入流:程序可以从中读取数据的流(流入程序的流)input
- 输出流:程序能向其中写入数据的流 (从程序流出的流)output
3.2 字节流、字符流
- 字节流:以字节为单位传输数据的流 byte
- 字符流:以字符为单位传输数据的流 char
3.3 节点流、处理流
- 节点流:用于直接操作目标设备的流
- 处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更为强大、灵活的读写功能。
3.4 IO流的分类图:
4 字节输入流:
4.1 InputStream类的常用方法
- available() 方法,可以获取与之关联的文件的字节数。
int read() 方法,读取输入流。读取输入流的下一个字节,返回一个0-255之间的int类型整数。如果到达流的末端,返回-1。
int read(byte[] b) 方法,读取输入流。读取多个字节,存入字节数组b,返回实际读入的字节数。如果到达流的末端,返回-1。
int read (byte[] b, int off, int len); 方法,读取输入流。每次读取len个字节,存入字节数组b,从off下标开始存储。如果到达流的末端,返回-1。
- close() 方法,关闭当前流,释放与该流相关的资源,防止资源泄露。在带资源的try语句中将被自动调用。关闭流之后还试图读取字节,会出现IOException异常。
4.2 InputStream类的子类:文件输入流FileInputStream
FileInputStream 用于读取本地文件中的字节数据,继承自InputStream类
4.2.1 FileInputStream构造方法和常用方法
4.2.1.1构造方法
- FileInputStream(File file); 通过打开一个到实际文件的连接来创建一个
FileInputStream
,该文件通过文件系统中的File
对象file
指定。 - FileInputStream(String name); 通过打开一个到实际文件的连接来创建一个
FileInputStream
,该文件通过文件系统中的路径名name
指定。
4.2.1.2 常用方法
-
read() 方法,读取输入流。读取输入流的下一个字节,返回一个0-255之间的int类型整数。如果到达流的末端,返回-1。
is = new FileInputStream("test.txt"); int i; while ((i = is.read()) != -1) { System.out.println("out: " + (char)i); }
-
read(byte[] b) 方法,读取输入流。读取多个字节,存入字节数组b,返回实际读入的字节数。
InputStream is = null; byte[] buffer = new byte[4];//每次读取4个字节 try { is = new FileInputStream("test.txt"); is.read(buffer); System.out.println("available: " + is.available());//观察在读取的过程中,available 值。 for (byte b : buffer) { System.out.println((char)b); } }...
read (byte[] b, int off, int len); 方法,读取输入流。每次读取len个字节,存入字节数组b,从off下标开始存储。
close() 方法,关闭当前流,释放与该流相关的资源,防止资源泄露。在带资源的try语句中将被自动调用。关闭流之后还试图读取字节,会出现IOException异常。
skip(long n) 方法,跳过(放弃)当前流的n个字节,返回实际跳过的字节数。
5 字节输出流:
5.1 OutputStream类的常用方法
- write (int b); 将指定的字节写入此输出流。
- write(byte[] byte); 将
b.length
个字节从指定的 byte 数组写入此输出流。 - write(byte[] byte, int off, int len); 将指定 byte 数组中从偏移量
off
开始的len
个字节写入此输出流。 - flush(); 用于清空缓存里的数据,并通知底层去进行实际的写操作。(强制把缓存区里面的数据写入到文件)
- close();关闭当前流,释放与该流相关的资源。
5.2 OuputStream类的子类:文件输出类FileOutputStream
提供了文件的基本写入能力,继承自 OuputStream类
注意:
- 如果进行写操作的文件不存在,则自动创建该文件。
- 如果文件所在的路径也不存在则报错。
5.2.1 FileOutputStream构造方法和常用方法
5.2.1.1 构造方法
- public FileOutputStream(String name); 通过打开一个到实际文件的连接来创建一个
FileOutputStream
,该文件通过文件系统中的路径名name
指定。 - public FileOutputStream(String name,boolean append);通过打开一个到实际文件的连接来创建一个
FileOutputStream
,该文件通过文件系统中的路径名name
指定。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。 - public FileOutputStream(File file):通过打开一个到实际文件的连接来创建一个
FileOutputStream
,该文件通过文件系统中的File
对象file
指定。 - public FileOutputStream(File file,boolean append);通过打开一个到实际文件的连接来创建一个
FileOutputStream
,该文件通过文件系统中的File
对象file
指定。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。
5.2.1.1 常用方法
-
write (int b); 将指定的字节写入此输出流。
try { File file = new File("test.txt"); OutputStream fos = new FileOutputStream(file); byte b = 'a'; fos.write(b); fos.flush(); fos.close(); }...
结果:
-
write(byte[] byte); 将
b.length
个字节从指定的 byte 数组写入此输出流。try { File file = new File("test.txt"); OutputStream fos = new FileOutputStream(file); byte b[]= "abcdefg".getBytes(); fos.write(b); fos.flush(); fos.close(); }...
结果:
-
write(byte[] byte, int off, int len); 将指定 byte 数组中从偏移量
off
开始的len
个字节写入此输出流。try { File file = new File("test.txt"); OutputStream fos = new FileOutputStream(file); byte b[]= "abcdefg".getBytes(); fos.write(b,1,3); fos.flush(); fos.close(); }...
结果:
flush(); 用于清空缓存里的数据,并通知底层去进行实际的写操作。(强制把缓存区里面的数据写入到文件)
close();关闭当前流,释放与该流相关的资源。
6 字节缓冲流
BufferedInputStream与BufferedOutputStream分别是FilterInputStream类和FilterOutputStream类的子类,实现了装饰设计模式。提高了读写性能。
6.1字节输入缓冲流 BufferedInputStream
BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8Kb,能够减少访问磁盘的次数,提高文件读取性能;
使用方式:
try {
File file = new File("test.txt");
InputStream fos = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fos,2*1024);//2*1024设置需要的缓冲区大小
byte b[] =new byte[1024];
while (bis.read(b)!=-1) {
for (byte c : b) {
System.out.println((char)c);
}
}
bis.close();
}
6.2 字节输出缓冲流 BufferedOutputStream
BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率。
使用方式:
try {
File file = new File("test.txt");
OutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos =new BufferedOutputStream(fos,2*1024);//2*1024设置需要的缓冲区大小
byte b = "a";
bos.write(b);
bos.flush();//带有缓冲区,所以必须刷新。
bos.close();
}
- 创建文件的时候是相对路径就返回相对路径,是绝对路径就返回绝对路径。 ↩