Java文件输入输出及其常用类使用及说明

 更新时间:2026年08月04日 10:09:38   作者:陵易居士  
还在纠结Java文件操作怎么学?本文详细介绍了FileInputStream、FileOutputStream等字节流和字符流的用法,包括读取、写入、追加模式,并对比了字符流与字节流在处理文本和二进制文件时的区别,帮你轻松掌握Java文件读写核心

对于一个应用程序来说什么是最重要的?数据!数据一般存放在文件、数据库中,今天介绍java中关于文件操作的一些常用类,学好文件操作是很有必要的。

字节输入输出流

FileInputStream

查看源码,可以看到它是继承自InputStream类

public
class FileInputStream extends InputStream

它用于从文件中读取数据,以字节为单位

初始化创建输入流对象

1.传入文件路径字符串

    public FileInputStream(String name) throws FileNotFoundException {
        this(name != null ? new File(name) : null);
    }

查看源码我们可以看到,我们传入路径字符串后它会使用这个字符串生成文件对象

代码示例

FileInputStream is=new FileInputStream("D:\\test01.txt");

2.传入文件对象

    public FileInputStream(File file) 

 我们也可以传入一个文件对象,他就会绑定到这个文件对象指定的文件

       File file1=new File("D:\\test01.txt");

       FileInputStream is=new FileInputStream(file1);

读取数据

1.  public int read()

从文件中读取一个字节的数据,返回类型为int,如果文件此时为空则返回-1

        File file1=new File("D:\\test01.txt");

        FileInputStream is=new FileInputStream(file1);
        
        
        int x=0;
        while(x!=-1){
            x=is.read();
            System.out.println((char)x);
        }

例如用上面这种操作可以循环读取,直到读取完毕整个数组

2.public int read(byte b[])

这个方法读取数组b长度大小的字节,并且返回成功读取字节的个数,如果已经到了文件末尾则返回-1

        File file1=new File("D:\\test01.txt");

        FileInputStream is=new FileInputStream(file1);
        

        byte []chars=new byte[6];
        int len=0;
        while((len=is.read(chars))!=-1){

            System.out.println("读到长度为"+len+"的字符串:"+new String(chars));
        }

例如上面这个就是每次在文件中读取6个字节的数据,直到读到文件末尾

3.public int read(byte b[], int off, int len)

从文件中读取len个长度的字节数据赋值到数组b中以off为起点的敌方

关闭输入流

调用输入流的close方法,关闭对文件资源的占用

        File file1=new File("D:\\test01.txt");

        FileInputStream is=new FileInputStream(file1);
        

        byte []chars=new byte[6];
        int len=0;
        while((len=is.read(chars))!=-1){

            System.out.println("读到长度为"+len+"的字符串:"+new String(chars));
        }
        is.close();

FileOutputStream

初始化创建输出流对象

1.传入文件路径字符串

和输入流的初始化一样,这里也可以直接把要写入的文件的路径写成字符串直接赋值给构造器

public FileOutputStream(String name)

2.在1的基础上判断是否重写文件数据

和第一个方法类似,这个方法要求传入一个布尔类型的值,为true则表示新写入的数据自动加到末尾,如果为false则默认重写文件内容,即之前的数据会清空,只保留最新写入的

public FileOutputStream(String name, boolean append)

//为真则表示新写入的数据加到末尾
//为假则只保留新加入的数据

3.传入文件对象

这个也和输入流类似,传入一个文件对象即可绑定相应的文件

public FileOutputStream(File file) 

写入数据

1.public void write(int b)

将int型的数据写入到文件中去,注意这里只能写入单个数字,因为一次只能写入一个字节

2. public void write(byte b[])

将数组b中的数据全部写入到文件中去,我们可以利用这个方法将字符串写进文件中去,因为String类有个getBytes()方法,可以获取字符串的字节字符串,用法如下所示

         File fileout=new File("D:\\aaa.txt");

         FileOutputStream outputStream=new FileOutputStream(fileout);

         String s=new String("这段话是写进记事本中的");

         outputStream.write(s.getBytes(),0,2);//可以控制写入字符串的大小

3.public void write(byte b[], int off, int len)

将数组b中下标off开始的len个字节长度的数据写入到文件中去

        String filename=new String("D:\\ceshifile\\hm.png");
        String filename1=new String("D:\\ceshifile\\hm01.png");
        FileInputStream inputStream=new FileInputStream(filename);

        FileOutputStream outputStream=new FileOutputStream(filename1);

        byte[] ss=new byte[1024];
        int len=0;
        while((len=inputStream.read(ss))!=-1){//每次从文件中读取1024个长度的数据,返回读取个数
                                              //如果读到了文件末尾返回-1

            outputStream.write(ss,0,len);//利用len获取的有效字节长度
                                         //将数组中的数据写入到新文件中
        }

        inputStream.close();
        outputStream.close();//关闭输入输出流

上面是从一个文件读取数据同时向另外一个文件写数据的代码,注意最后输入输出流使用完毕要调用close方法释放占用的资源。

字符输入输出流

FileReader

从文件中读取数据,用法基本和FileInputStream类似

FileWriter

向文件中写入数据,用法基本和FileOutputStream类似,这里不再赘述

字符流与字节流的区别

一、处理的数据单元不同

字符输出流(Writer 及其子类):

  • 处理的是字符数据,以字符(通常是 16 位的 Unicode 字符)为单位进行操作。例如,FileWriter可以用来写入文本文件,它将字符序列写入目标位置。
  • 适合处理文本内容,特别是包含各种语言字符的文本文件。

字节输入输出流(InputStream 和 OutputStream 及其子类):

  • 处理的是字节数据,以字节为单位进行操作。例如,FileInputStream用于从文件中读取字节数据,FileOutputStream用于向文件写入字节数据。
  • 可以处理任何类型的文件,包括二进制文件(如图像、音频、视频等)以及文本文件。但对于文本文件,可能需要进行字符编码和解码的处理。

二、编码方式的考虑

字符输出流:

  • 通常会自动处理字符编码和解码。例如,在写入文件时,可以指定特定的字符编码(如 UTF-8、GBK 等),字符输出流会将字符转换为对应的字节序列,并按照指定的编码写入文件。
  • 能够更好地处理不同字符集的文本,确保文本在不同平台和环境下的正确显示。

字节输入输出流:

  • 不涉及自动的字符编码和解码。读取或写入的是原始的字节数据,对于文本文件,如果不知道其编码方式,可能会导致乱码问题。
  • 需要开发者自己处理字符编码和解码的问题,以确保正确地读取和写入文本内容。

三、使用场景不同

字符输出流:

  • 当主要处理文本文件,并且希望以方便的字符方式进行操作时,字符输出流是更好的选择。例如,在编写一个日志文件记录程序,主要记录文本信息时,可以使用字符输出流。
  • 对于需要进行字符级别的操作,如字符串拼接、替换特定字符等,字符输出流也更加方便。

字节输入输出流:

  • 处理二进制文件时,字节输入输出流是必不可少的。例如,读取和写入图像文件、音频文件等。
  • 在网络编程中,通常使用字节输入输出流来传输数据,因为网络通信通常是以字节为单位进行的。
  • 当需要处理底层的二进制数据,或者对数据的字节级别操作有特定要求时,字节输入输出流更加合适。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • K均值聚类算法的Java版实现代码示例

    K均值聚类算法的Java版实现代码示例

    这篇文章主要介绍了K均值聚类算法的Java版实现代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 在Maven下代理服务器设定的方式

    在Maven下代理服务器设定的方式

    今天小编就为大家分享一篇关于在Maven下代理服务器设定的方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Spring MVC处理HTTP状态码、响应头和异常的完整示例

    Spring MVC处理HTTP状态码、响应头和异常的完整示例

    Spring MVC 是 Spring 框架中的一个模块,专门用于构建基于 MVC(Model-View-Controller)架构的 Web 应用程序,其核心在于处理 HTTP 请求并将其映射到相应的控制器方法,本文给大家介绍了Spring MVC处理HTTP状态码、响应头和异常的完整示例,需要的朋友可以参考下
    2025-08-08
  • 解决grails服务端口冲突的办法(grails修改端口号)

    解决grails服务端口冲突的办法(grails修改端口号)

    grails中默认的服务端口为8080,当本机中需要同时启动两个不同的项目时,就会造成端口冲突,下面给出解决方法
    2013-12-12
  • 在JDK和Eclipse下如何编写和运行Java Applet

    在JDK和Eclipse下如何编写和运行Java Applet

    本文主要介绍了在JDK和Eclipse的环境下如何编写和运行Java Applet,图文方式,适合初学者学习。
    2015-09-09
  • springboot与mybatis整合实例详解

    springboot与mybatis整合实例详解

    这篇文章主要为大家详细介绍了springboot与mybatis整合实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java向MySQL添加中文数据数据库显示乱码的解决方案

    Java向MySQL添加中文数据数据库显示乱码的解决方案

    在用springboot做项目时,由于重新安装了本地Mysql数据库(5.7版本)在前台向数据库插入和更新数据可的时候,涉及中文的时候在数据库一直显示异常,所以本文给大家介绍了相关的解决方案,需要的朋友可以参考下
    2024-02-02
  • 使用Java提取和删除PDF文档附件的完整指南

    使用Java提取和删除PDF文档附件的完整指南

    在日常开发和文档处理工作中,我们经常会遇到需要操作 PDF 文档的情况,除了读取文本和图片,有时还需要处理 PDF 附件,本文将围绕 Java 语言,详细讲解如何使用示例代码来操作 PDF 附件,需要的朋友可以参考下
    2026-04-04
  • java设计模式之外观模式学习笔记

    java设计模式之外观模式学习笔记

    这篇文章主要为大家详细介绍了java设计模式之外观模式学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java设计模式之外观模式的实现方式

    Java设计模式之外观模式的实现方式

    这篇文章主要介绍了Java设计模式之外观模式的实现方式,外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口,这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性,需要的朋友可以参考下
    2023-11-11

最新评论