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

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类似,这里不再赘述

字符流与字节流的区别

一、处理的数据单元不同

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

    • 处理的是字符数据,以字符(通常是 16 位的 Unicode 字符)为单位进行操作。例如,FileWriter可以用来写入文本文件,它将字符序列写入目标位置。
    • 适合处理文本内容,特别是包含各种语言字符的文本文件。
  2. 字节输入输出流(InputStream 和 OutputStream 及其子类):

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

二、编码方式的考虑

  1. 字符输出流:

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

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

三、使用场景不同

  1. 字符输出流:

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

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

http://www.kler.cn/news/309688.html

相关文章:

  • Nginx反向代理出现502 Bad Gateway问题的解决方案
  • 如何使用 LangChain 的内置工具和工具包:深入探讨与实践指南
  • [Web安全 网络安全]-文件包含漏洞
  • 八股(8)——Spring,SpringBoot
  • 虾皮商品数据api全解析:高效获取,精准运营新利器
  • 记八月十五灵隐寺一游
  • presto/trino native 向量化 大数据计算引擎
  • MySQL之库和表操作
  • Rust 所有权 简介
  • 硬件基础知识
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-13
  • [SIGGRAPH-24] CharacterGen
  • 使用c#制作一个小型桌面程序
  • 彩漩科技亮相第一届人工智能教育应用论坛,入选TOP30榜单,展示创新教育科技产品
  • Snowflake 如何通过 Apache Iceberg 和 Polaris 为大数据的未来提供动力
  • 【JavaEE初阶】多线程6(线程池\定时器)
  • C# 开发教程-入门基础
  • linux 双网卡服务器突然断电后网卡单通故障解决
  • C#通过注册表实现记住上次打开路径
  • 超级简约的B端页面,B端系统就该如此简化设计。
  • JS基础:数组for循环年龄案例
  • sql中的APPLY 和 LATERAL
  • Git 命令详解与项目迁移指南
  • 代码随想录算法训练营第13天|二叉树基础知识、递归遍历、迭代遍历、层序遍历、116. 填充每个节点的下一个右侧节点指针
  • 【计算机网络】TCP的可靠传输机制、标记位以及编程结构
  • vue3透传、注入
  • sqlite在Windows环境下安装、使用、node.js连接
  • URLEncode
  • 力扣之181.超过经理收入的员工
  • 基于C#+SQLServer 2005实现(CS界面)校园卡消费信息系统