当前位置: 首页 > news >正文

java的文件输入输出流(FileInputStream、FileOutputStream、FileReader、FileWriter)

文章目录

  • 文件输入输出流
    • 1 java I/O 流的原理
      • 流的分类
    • 2 FileInputStream 文件字节输入流
    • 3 FileOutputStream 文件字节输出流
    • 4 使用文件字节输入输出流完成对文件的拷贝
    • 5 FileReader 文件字符输入流
    • 6 FileWriter 文件字符输出流

文件输入输出流

1 java I/O 流的原理

  1. I/OInput/Output 的缩写, I/O 技术是非常实用的技术,用于处理数据传输,如读写文件、网络通讯等。

  2. java 程序中,对于各种数据的输入/输出操作以 “流(Stream)” 的方式进行。

  3. java.io 包下提供了各种 “流” 类和接口,用以获取不同种类的数据,并通过方法输入或输出数据。

  4. 输入 input 、reader :读取外部数据到程序中。

    外部 --> 程序

  5. 输出 output、writer:将程序中的数据输出到外部。

    程序 --> 外部


流的分类

流主要按如下三种方式进行分类:

  • 按操作数据单位的不同分为:字节流(8 bit)二进制文件,字符流(按字符)文本文件
  • 按数据流的流向不同分为:输入流、输出流
  • 按流的角色不同分为:节点流、处理流(包装流)

流的基类(超类/父类):

抽象基类字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter
  1. java的 IO 流涉及 40 多个类,实际上是有一定规则的,都是由上面的 4 个抽象基类派生的。
  2. 由这 4 个类派生出来的子类名称都是以其父类名作为子类后缀。

1743835927117


2 FileInputStream 文件字节输入流

FileInputStream 类继承、实现关系如下图:

image-20250407222701465

案例讲解:first.txt 文件的内容读取到程序中,并输出在控制台。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStream_ {
    public static void main(String[] args) {
        String s = "d:\\0\\fist.txt";
        File path = new File(s);

        FileInputStream fileInputStream = null;
        int readDateLen = 0;
        byte[] buf = new byte[8];

        try {
            fileInputStream = new FileInputStream(path);
            //当 readDateLen = -1 时文件已经读完了
            while((readDateLen = fileInputStream.read(buf)) != -1) {
                //read(buf)读取的内容不能总是能装满整个数组
                //所以必须使用new String(buf, 0, readDateLen)
                //因为,每次读取的数据都会在buf数组中从头开始覆盖
                System.out.print(new String(buf, 0, readDateLen));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭流
                fileInputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

解读:

  • 创建 FileInputStream 对象,常用的2种方法:

    • new FileInputStream(File file)

    • new FileInputStream(String name)

      其中 name 为文件的路径,如 d:\\0\\fist.txt

  • FileInputStreamread() 方法

    • public int read() throws
      • 从此输入流中读取一个字节的数据。如果尚无可用输入,则此方法会阻塞。
      • 返回值:下一个数据字节,如果到达文件末尾则为 -1
    • public int read(byte[] b)
      • 从此输入流中读取最多 b.length 字节的数据到字节数组中。在某些输入可用之前,此方法会阻塞。
      • 返回值:读入缓冲区的总字节数,如果因为已到达文件末尾而没有更多数据,则为 -1
    • public int read(byte[] b, int off, int len)
      • 从此输入流中读取最多 len 字节的数据到字节数组中, off 为数组 b 中的起始下标,如果 len 不为零,则该方法会阻塞,直到某些输入可用;否则,不读取任何字节并返回 0
      • 返回值:读入缓冲区的总字节数,如果因为已到达文件末尾而没有更多数据,则为 -1

3 FileOutputStream 文件字节输出流

FileOutputStream 类的继承、实现关系如下图:

案例讲解: 输出内容到 "d://0//second.txt" 文件中。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStream_ {
    public static void main(String[] args) {
        String path = "d://0//second.txt";
        FileOutputStream fileOutputStream = null;

        try {
            fileOutputStream = new FileOutputStream(path, true);
            fileOutputStream.write('X');
            String str = "necessity";
            fileOutputStream.write(str.getBytes());
            fileOutputStream.write('h');

            fileOutputStream.write(str.getBytes(), 0, 3);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

解读:

  • FileOutputStream 将数据写到文件中, 如果该文件不存在,则自动创建该文件。

    上面的例子中,如果 second.txt 文件不存在,则会自动创建。

  • new FileOutputStream(String name, boolean append)

    • append - 如果是 true ,则字节将写入文件末尾而不是开头
    • 如果没有指定 append 默认为 false,即每次使用一个新的流写入文件时,写入的内容会覆盖原有的内容。
  • str.getBytes() 可以把 字符串-> 字节数组

  • FileOutputStream 类的 write() 方法

    • public void write(int b)

      • 将指定字节写入此文件输出流。实现 OutputStreamwrite 方法。
    • public void write(byte[] b)

      • 将指定字节数组中的 b.length 个字节写入此文件输出流。
    • public void write(byte[] b, int off, int len)

      • 从数组 b 中下标为 off 的数据开始,读取 len 个元素,写入此文件输出流。

4 使用文件字节输入输出流完成对文件的拷贝

案例: 使用 FileInputStreamFileOutputStream 实现对 1.png 图片的复制.

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

public class FileCopy {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        FileOutputStream fileoutputStream = null;

        try {
            fileInputStream = new FileInputStream("d:\\0\\1.png");
            fileoutputStream = new FileOutputStream("d:\\0\\2.png");
			//一次读取1024个字节
            byte[] buf = new byte[1024];
            int readLen = 0;

            while((readLen = fileInputStream.read(buf)) != -1) {
                //read(buf)读取的内容不能总是能装满整个数组
                //所以必须使用write(buf, 0, readLen)
                //因为,每次读取的数据都会在buf数组中从头开始覆盖
                fileoutputStream.write(buf, 0, readLen);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                 //关闭输入流和输出流,释放资源
                if(fileInputStream != null)
                    fileInputStream.close();
                if (fileoutputStream != null)
                    fileoutputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

5 FileReader 文件字符输入流

FileReader 类的继承、实现关系如下图:

基本介绍:

  • 构造方法:
    • new FileReader(String fileName)
    • new FileReader(File file)
    • new FileReader(String FileName, Charset charset)
      • charset:要指定的编码方式,例如 “utf-8”、“gbk”等
    • new FileReader(File file, Charset charset)
      • charset:要指定的编码方式,例如 “utf-8”、“gbk”等
  • int read()方法:每次读取单个字符,返回该字符,如果到文件末尾则返回 -1

  • int read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾则返回 -1

  • 相关的 API:

    • new String(char[])

      char[] 转换成 String

    • new String(char[], off, len)

      char[] 中,下标从 off 开始,接下来的 len 个字符转换成 String

案例讲解:

import java.io.FileReader;
import java.io.IOException;

public class FileReader_ {
    public static void main(String[] args) {
        FileReader fileReader = null;
        int readData = 0;
        int readLen = 0;
        //一次读取10个字符
        char[] buf = new char[10];

        try {
            fileReader = new FileReader("d:\\0\\fist.txt");
            while((readLen = fileReader.read(buf)) != -1) {
                //read(buf)读取的内容不能总是能装满整个数组
                //所以必须使用new String(buf, 0, readLen
                //因为,每次读取的数据都会在buf数组中从头开始覆盖
                System.out.print(new String(buf, 0, readLen));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

6 FileWriter 文件字符输出流

FileWriter 类的基础、实现关系如下图:

基本介绍:

  • 构造方法:
    • new FileWriter(File file)
    • new FileWriter(String fileName)
      • 如果没有指定 append ,则默认为 false,即每次使用一个新的流写入文件时,写入的内容会覆盖原有的内容。
    • new FileWriter(File file, boolean append)
    • new FileWriter(String fileName, boolean append)
      • append - 如果是 true ,则字节将写入文件末尾而不是开头
  • write 方法

    • write(int) :写入单个字符

    • write(char[]):写入指定数组

    • write(char[], off, len):写入指定数组的指定部分,

      即从下标为 off 开始写入 len 个数据

    • write(String):写入整个字符串

    • write(String, off, len):写入字符串的指定部分

  • 注意事项:

    FileWriter 使用后,必须要关闭(调用close()方法)或刷新(调用 flush() 方法),否则数据写入不到指定的文件中!

案例讲解:

import java.io.FileWriter;
import java.io.IOException;

public class FileWriter_ {
    public static void main(String[] args) {
        FileWriter fileWriter = null;
        char[] ch = {'b', 'c', 'e', 'g'};

        try {
            fileWriter = new FileWriter("d:\\0\\second.txt");
            fileWriter.write('T');
            fileWriter.write(ch);
            fileWriter.write(ch, 0, 3);
            fileWriter.write("熊老大在此");
            fileWriter.write("熊老大在学习", 0, 3);

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                //fileWriter.flush();
                // close = flush() + 关闭
                if(fileWriter != null)
                    fileWriter.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}



相关文章:

  • redis中的set
  • pikachu靶场搭建教程,csfr实操
  • AI日报 - 2025年4月8日
  • 关于动态规划
  • 解决 Lettuce 在 Redis 集群模式下的故障转移问题
  • 基于人工智能的医学影像关联分析:利用潜在空间几何混杂因素校正法|文献速递-深度学习医疗AI最新文献
  • WEB安全--内网渗透--利用Net-NTLMv2 Hash
  • 使用Scade实现神经网络算法
  • CMake 字段使用
  • 蓝桥杯真题--最长子序列 and 2023
  • SQL:Primary Key(主键)和Foreign Key(外键)
  • cpp自学 day20(文件操作)
  • 关于sqlsugar实体多层List映射的问题
  • 第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组题目试做(中)【本期题目:回文数组,挖矿】
  • CmLicense授权损耗规避措施
  • spring boot 实现spring mvc过程中WebMvcConfigurer接口及其相关实现类的详细对比
  • Redis 的五种数据类型面试回答
  • 安全编码课程 实验6 整数安全
  • WPF依赖注入
  • 【金仓数据库】
  • 重庆企业网站制作外包/东莞谷歌推广公司
  • 自己做h5制作开发/惠州seo计费
  • 南阳网站推广优化公司哪家好/网站外链是什么
  • 首页重庆网站建设/seo系统是什么意思
  • 通用网址通用网站查询/百度下载免费官方安装
  • 佛山市手机网站建设公司/云南seo简单整站优化