文件操作类与IO流

一、File类(文件操作类)

1 基本概念

java.io.File类主要用于描述文件或目录路径的抽象表示信息,可以获取文件或目录的特征信息,
如:大小等。

2 常用的方法

方法声明 功能概述
File(String pathname) 根据参数指定的路径名来构造对象(主要
File(String parent, String child) 根据参数指定的父路径子路径信息构造对象
File(File parent, String child) 根据参数指定的父抽象路径子路径信息构造对象
boolean exists() 测试此抽象路径名表示的文件或目录是否存在
String getName() 用于获取文件的名称
long length() 返回由此抽象路径名表示的文件的长度
long lastModified() 用于获取文件的最后一次修改时间
String getAbsolutePath() 用于获取绝对路径信息
boolean delete() 用于删除文件,当删除目录时要求是空目录
boolean createNewFile() 用于创建新的空文件
boolean mkdir() 用于创建目录
boolean mkdirs() 用于创建多级目录
File[] listFiles() 获取该目录下的所有内容
boolean isFile() 判断是否为文件
boolean isDirectory() 判断是否为目录
File[] listFiles(FileFilter filter) 获取目录下满足筛选器所有内容

案例题目

遍历指定目录以及子目录中的所有内容并打印出来。

实现方法

    public static void show(File file){
    
    
        File[] filesArray = file.listFiles();
        for (File tf:filesArray){
    
    
            String name = tf.getName();
            //
            if(tf.isFile()){
    
    
                System.out.println(name);
            }
            if(tf.isDirectory()){
    
    
                System.out.println("["+name+"]");
                show(tf);
            }
        }
    }

调用方法

show(new File("d:/测试"));

二、IO流

1 IO流的概念

  • IO就是InputOutput的简写,也就是输入和输出的含义。
  • IO流就是指读写数据时像流水一样从一端流到另外一端,因此得名为“流"。

2 基本分类

  • 按照读写数据的基本单位不同,分为 字节流字符流
    其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件
    其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件
  • 按照读写数据的方向不同,分为 输入流输出流站在程序的角度)。
    其中输入流主要指从文件中读取数据内容输入到程序中,也就是读文件
    其中输出流主要指将程序中的数据内容输出到文件中,也就是写文件
  • 按照流的角色不同分为节点流处理流
    其中节点流主要指直接和输入输出源对接的流。
    其中处理流主要指需要建立在节点流的基础之上的流。

3 体系结构

分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FileInputStream FileOutputStream FileReader FileWriter
访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArray
访问管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
访问字符流 - - - - StringReader StringWriter
缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
转换流 - - - - InputStreamReader InputStreamWriter
对象流 ObjectInputStream ObjectOutputStream - - - -
FilterInputStream FilterOutputStream FilterReader FilterWriter
打印流 - - PrintStream - - PrintWriter
推回输入流 PushbackInputStream - - PuhbackReader - -
特殊流 DataInputStream DataOutputStream - - - -

4 相关流的详解

在这里插入图片描述

1 FileWriter类(文件字符输出流|重点)

(1)基本概念

  • java.io.FileWriter类主要用于将文本内容写入到文本文件。

(2)常用的方法

方法声明 功能介绍
FileWriter(String fileName) 根据参数指定的文件名构造对象
FileWriter(String fileName, boolean append) 以追加的方式根据参数指定的文件名来构造对象
void write(int c) 写入单个字符
void write(char[] cbuf, int off, int len) 将指定字符数组中从偏移量off开始的len个字符写入此文件输出流
void write(char[] cbuf) 将cbuf.length个字符从指定字符数组写入此文件输出流中
void flush() 刷新流
void close() 关闭流对象并释放有关的资源

2 FileReader类(文件字符输入流|重点)

(1)基本概念

  • java.io.FileReader类主要用于从文本文件读取文本数据内容。

(2)常用的方法

方法声明 功能介绍
FileReader(String fileName) 根据参数指定的文件名构造对象
int read() 读取单个字符的数据并返回,返回-1表示读取到末尾
int read(char[] cbuf, int
offset, int length)
从输入流中将最多len个字符的数据读入一个字符数组中,
返回读取到的字符个数,返回-1表示读取到末尾
int read(char[] cbuf) 从此输入流中将最多 cbuf.length 个字符的数据读入字符数组中,
返回读取到的字符个数,返回-1表示读取到末尾
void close() 关闭流对象并释放有关的资源

3 FileOutputStream类(文件字节输出流|重点)

(1)基本概念

  • java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入到输出流中。

(2)常用的方法

方法声明 功能介绍
FileOutputStream(String name) 根据参数指定的文件名来构造对象
FileOutputStream(String name,boolean append) 以追加的方式根据参数指定的文件名来构造对象
void write(int b) 将指定字节写入此文件输出流
void write(byte[] b, int off, int len) 将指定字节数组中从偏移量off开始的len个字节写入
此文件输出流
void write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中
void flush() 刷新此输出流并强制写出任何缓冲的输出字节
void close() 关闭流对象并释放有关的资源

4 FileInputStream类(文件字节输入流|重点)

(1)基本概念

  • java.io.FileInputStream类主要用于从输入流中以字节流的方式读取图像数据等。

(2)常用的方法

方法声明 功能介绍
FileInputStream(String name) 根据参数指定的文件路径名来构造对象
int read() 从输入流中读取单个字节的数据并返回,
返回-1表示读取到末尾
int read(byte[] b, int off, int len) 从此输入流中将最多len个字节的数据读入字节数组中,
返回读取到的字节个数,返回-1表示读取到末尾
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入字节数组中,
返回读取到的字节个数,返回-1表示读取到末尾
void close() 关闭流对象并释放有关的资源
int available() 获取输入流所关联文件的大小

案例题目

编程实现两个文件之间的拷贝功能。

  • 方式一:以单个字节为单位进行烤贝,也就是每次读取一个字节后再写又一个字节
    缺点:文件稍大时,烤贝的效率很低
  • 方式二:准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区然后一次性写又进去
    缺点:若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足
  • 方式三:准备一个相对合理的缓冲区,分多次将文件拷贝完成
package cn.cyh.test17;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Description: TODO
 * @author: gk
 * @date: 2021年01月12日 14:27
 */
public class FileByteCopyTest {
    
    
    public static void main(String[] args) {
    
    
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
    
    
            //1.创建FileInputstream类型的对象与F:/1.png文件关联
            fis = new FileInputStream("F:/1.png");
            //2.创建FileInputstream类型的对象与F:/1.png文件关联
            fos = new FileOutputStream("F:/2.png");
            //3.不断地从输流中读取数据内容并写入到输出流中
            System.out.println("拷贝中~");
            //方式一:以单个字节为单位进行烤贝,也就是每次读取一个字节后再写又一个字节
            //缺点:文件稍大时,烤贝的效率很低
            /*int res = 0;
            while ((res = fis.read()) != -1){
                fos.write(res);
            }*/
            //方式二:准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区然后一次性写又进去
            //缺点:若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足
            /*int len = fis.available();
            System.out.println("获取到的文件大小:" + len);
            byte[] bArr = new byte[len];
            int res = fis.read(bArr);
            System.out.println("实际读取到的文件大小是:" + res);
            fos.write(bArr);*/
            //方式三:准备一个相对合理的缓冲区,分多次将文件拷贝完成
            byte[] bArr = new byte[1024];
            int res = 0;
            while ((res = fis.read(bArr)) != -1){
    
    
                fos.write(bArr,0,res);
            }
            System.out.println("拷贝结束");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //4.关闭流对象并释放有关的资源
            if (null != fos){
    
    
                try {
    
    
                    fos.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
            if(null != fis){
    
    
                try {
    
    
                    fis.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

5 BufferedOutputStream类(字节缓冲输出流|重点)

(1)基本概念

  • java.io.BufferedOutputStream类主要用于描述缓冲输出流,此时不用为写入的每个字节调用底层系统。

(2)常用的方法

方法声明 功能介绍
BufferedOutputStream(OutputStream out) 根据参数指定的引用来构造对象
BufferedOutputStream(OutputStream out, int size) 根据参数指定的引用和缓冲区大小来构造对象
void write(int b) 写入单个字节
void write(byte[] b, int off, int len) 写入字节数组中的一部分数据
void write(byte[] b) 写入参数指定的整个字节数组
void flush() 刷新流
void close() 关闭流对象并释放有关的资源

6 BufferedInputStream类(字节缓冲输入流|重点)

(1)基本概念

  • java.io.BufferedInputStream类主要用于描述缓冲输入流。

(2)常用的方法

方法声明 功能介绍
BufferedInputStream(InputStream in) 根据参数指定的引用构造对象
BufferedInputStream(InputStream in, int size) 根据参数指定的引用和缓冲区大小构造对象
int read() 读取单个字节
int read(byte[] b, int off, int len) 读取len个字节
int read(byte[] b) 读取b.length个字节
void close() 关闭流对象并释放有关的资源

PS:缓冲字节流比文件字节流效率快一点(文件越大,差别越大)

7 BufferedWriter类(字符缓冲输出流|重点)

(1)基本概念

  • java.io.BufferedWriter类主要用于写入单个字符、字符数组以及字符串到输出流中。

(2)常用的方法

方法声明 功能介绍
BufferedWriter(Writer out) 根据参数指定的引用来构造对象
BufferedWriter(Writer out, int sz) 根据参数指定的引用和缓冲区大小来构造对象
void write(int c) 写入单个字符到输出流中
void write(char[] cbuf, int off, int len) 将字符数组cbuf中从下标off开始的len个字符写入输出流中
void write(char[] cbuf) 将字符串数组cbuf中所有内容写入输出流中
void write(String s, int off, int len) 将参数s中下标从off开始的len个字符写入输出流中
void write(String str) 将参数指定的字符串内容写入输出流中
void newLine() 用于写入行分隔符到输出流中
void flush() 刷新流
void close() 关闭流对象并释放有关的资源

8 BufferedReader类(字符缓冲输入流|重点)

(1)基本概念

  • java.io.BufferedReader类用于从输入流中读取单个字符、字符数组以及字符串。

(2)常用的方法

方法声明 功能介绍
BufferedReader(Reader in) 根据参数指定的引用来构造对象
BufferedReader(Reader in, int sz) 根据参数指定的引用和缓冲区大小来构造对象
int read() 从输入流读取单个字符,
读取到末尾则返回-1,否则返回实际读取到的字符内容
int read(char[] cbuf, int off, int len) 从输入流中读取len个字符放入数组cbuf中下标从off开始的位置上,
若读取到末尾则返回-1,否则返回实际读取到的字符个数
int read(char[] cbuf) 从输入流中读满整个数组cbuf
String readLine() 读取一行字符串并返回,
返回null表示读取到末尾
void close() 关闭流对象并释放有关的资源

9 PrintStream类(打印字节流)

(1)基本概念

  • java.io.PrintStream类主要用于更加方便地打印各种数据内容。

(2)常用的方法

方法声明 功能介绍
PrintStream(OutputStream out) 根据参数指定的引用来构造对象
void print(String s) 用于将参数指定的字符串内容打印出来
void println(String x) 用于打印字符串后并终止该行
void flush() 刷新流
void close() 用于关闭输出流并释放有关的资源

10 PrintWriter类(打印字符流

(1)基本概念
java.io.PrintWriter类主要用于将对象的格式化形式打印到文本输出流。
(2)常用的方法

方法声明 功能介绍
PrintWriter(Writer out) 根据参数指定的引用来构造对象
void print(String s) 将参数指定的字符串内容打印出来
void println(String x) 打印字符串后并终止该行
void flush() 刷新流
void close() 关闭流对象并释放有关的资源

案例题目

不断地提示用户输入要发送的内容,若发送的内容是"bye"则聊天结束,否则将用户输入的内容写
入到文件d:/a.txt中。
要求使用BufferedReader类来读取键盘的输入 System.in代表键盘输入
要求使用PrintStream类负责将数据写入文件

11 OutputStreamWriter类(字符流转换字节流

(1)基本概念

  • java.io.OutputStreamWriter类主要用于实现从字符流到字节流的转换。

(2)常用的方法

方法声明 功能介绍
OutputStreamWriter(OutputStream out) 根据参数指定的引用来构造对象
OutputStreamWriter(OutputStream out, String charsetName) 根据参数指定的引用和编码构造对象
void write(String str) 将参数指定的字符串写入
void flush() 刷新流
void close() 用于关闭输出流并释放有关的资源

12 InputStreamReader类(字节流转换字符流

(1)基本概念

  • java.io.InputStreamReader类主要用于实现从字节流到字符流的转换。

(2)常用的方法

方法声明 功能介绍
InputStreamReader(InputStream in) 根据参数指定的引用来构造对象
InputStreamReader(InputStream in, String charsetName) 根据参数指定的引用和编码来构造对象
int read(char[] cbuf) 读取字符数据到参数指定的数组
void close() 用于关闭输出流并释放有关的资源

13 字符编码

(1)编码表的由来

  • 计算机只能识别二进制数据,早期就是电信号。为了方便计算机可以识别各个国家的文字,就需要将各个国家的文字采用数字编号的方式进行描述并建立对应的关系表,该表就叫做编码表。
    (2)常见的编码表
  • ASCII美国标准信息交换码, 使用一个字节的低7位二位进制进行表示。
  • ISO8859-1拉丁码表,欧洲码表,使用一个字节的8位二进制进行表示。
  • GB2312中国的中文编码表最多使用两个字节16位二进制为进行表示。
  • GBK中国的中文编码表升级,融合了更多的中文文字符号,最多使用两个字节16位二进制位表示。
  • Unicode国际标准码,融合了目前人类使用的所有字符,为每个字符分配唯一的字符码。所有的文字都用两个字节16位二进制位来表示。
  • PS:最多: 不是所有内容都是两个字节,字母还是一个字节
    (3)编码的发展
  • 面向传输的众多 UTF(UCS Transfer Format)标准出现了,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的编码并使编码无国界,这样就可以显示全世界上所有文化的字符了。
  • Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的Unicode编码是UTF-8和UTF-16。
  • UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。

14 DataOutputStream类(数据类型输出流|了解)

(1)基本概念

  • java.io.DataOutputStream类主要用于以适当的方式将基本数据类型写入输出流中。

(2)常用的方法

方法声明 功能介绍
DataOutputStream(OutputStream out) 根据参数指定的引用构造对象 OutputStream类是个抽象类,
实参需要传递子类对象
void writeInt(int v) 用于将参数指定的整数一次性写入输出流,优先写入高字节
void close() 用于关闭文件输出流并释放有关的资源

15 DataInputStream类(数据类型输入流|了解)

(1)基本概念

  • java.io.DataInputStream类主要用于从输入流中读取基本数据类型的数据。

(2)常用的方法

方法声明 功能介绍
DataInputStream(InputStream in) 根据参数指定的引用来构造对象 InputStream类是抽象类,
实参需要传递子类对象
int readInt() 用于从输入流中一次性读取一个整数数据并返回
void close() 用于关闭文件输出流并释放有关的资源

16 ObjectOutputStream类(重点)

(1)基本概念

  • java.io.ObjectOutputStream类主要用于将一个对象的所有内容整体写入到输出流中。
  • 只能将支持 java.io.Serializable 接口的对象写入流中。
  • 类通过实现 java.io.Serializable 接口以启用其序列化功能
  • 所谓序列化主要指将一个对象需要存储的相关信息有效组织成字节序列的转化过程

(2)常用的方法

方法声明 功能介绍
ObjectOutputStream(OutputStream out) 根据参数指定的引用来构造对象
void writeObject(Object obj) 用于将参数指定的对象整体写入到输出流中
void close() 用于关闭输出流并释放有关的资源

17 ObjectInputStream类(重点)

(1)基本概念

  • java.io.ObjectInputStream类主要用于从输入流中一次性将对象整体读取出来。
  • 所谓反序列化主要指将有效组织的字节序列恢复为一个对象及相关信息的转化过程。

(2)常用的方法

方法声明 功能介绍
ObjectInputStream(InputStream in) 根据参数指定的引用来构造对象
Object readObject() 主要用于从输入流中读取一个对象并返回 无法通过返回值
来判断是否读取到文件的末尾
void close() 用于关闭输入流并释放有关的资源

(3)序列化版本号

  • 序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。

(4)transient关键字

  • transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。

(5)经验的分享

  • 当希望将多个对象写入文件时,通常建议将多个对象放入一个集合中,然后将集合这个整体看做一个对象写入输出流中,此时只需要调用一次readObject方法就可以将整个集合的数据读取出来,从而避免了通过返回值进行是否达到文件末尾的判断。

18 RandomAccessFile类

(1)基本概念

  • java.io.RandomAccessFile类主要支持对随机访问文件的读写操作。

(2)常用的方法

方法声明 功能介绍
RandomAccessFile(String name, String mode) 根据参数指定的名称和模式构造对象
r : 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入,同步文件内容的更新
rws:打开以便读取和写入,同步文件内容和元数据的更新
int read() 读取单个字节的数据
void seek(long pos) 用于设置从此文件的开头开始测量的文件指针偏移量
void write(int b) 将参数指定的单个字节写入
void close() 用于关闭流并释放有关的资源

猜你喜欢

转载自blog.csdn.net/Guai_Ka/article/details/112366870