IO流操作大集合

news2024/11/26 20:30:29

1、分类

File只能对文件进行处理,如果想要处理文件里的内容,则要使用文件流。

文件流可分为字符和字节流:

  • 字节流(可读写任何格式的文件)
    • inputStream(抽象父类)
      • FileInputStream
    • outputStream(抽象父类)
      • FileOutputStream
  • 字符流(可续写记事本打开看得懂的文件)
    • Reader(抽象父类)
      • FileReader
    • Writer(抽象父类)
      • FileWriter

2、字节流具体操作

写文件

  1. 各个操作系统的换行符不一样,Mac:\r Windows: \r\n Linux:\n
FileOutputStream fos = new FileOutputStream("src/test/java/test.txt",true);
  //把要写入的东西放在数组里
  String str = "我要写入文件的东西";
  byte[] bytes = str.getBytes();
  fos.write(bytes);
  fos.close();

读文件

  1. 读到末位文件,返回的是-1
  2. fis.read()执行一次,相当于移动一次光标,注意不要重复读
FileInputStream fis = new FileInputStream("src/test/java/test.txt");
  int b;
  while ((b = fis.read()) != -1){
    System.out.print((char)b);
  }
  fis.close();

拷贝文件

边读边写,一次读写一个字节(速度极慢)

FileInputStream fis = new FileInputStream("src/test/java/test.txt");
        FileOutputStream fos = new FileOutputStream("src/test/java/test1.txt");
        int b ;
        while ((b = fis.read()) != -1){
            fos.write(b);
        }
        fos.close();
        fis.close();

一次读写多个字节数据,快

  1. 读取的时候,可以一次读取一个字节数组的长度
  2. 写入的时候,使用fos.write(bytes,0,len)的写入方法,表示从bytes数组中的0下标位置向后,写len长度的字节,而len长度表示这次我读取的字节数,所以最后一次读取的时候不会出现错误,多写(因为读了几个就写几个)。
FileInputStream fis = new FileInputStream("src/test/java/test.txt");
FileOutputStream fos = new FileOutputStream("src/test/java/test1.txt");
  int len ;
  byte[] bytes = new byte[2];
  while ((len = fis.read(bytes)) != -1){
    fos.write(bytes,0,len);
  }
  fos.close();
  fis.close();

在这里插入图片描述

3、字符流具体操作

读文件

  1. 一次读取char[2]哥字符的数组,读完以后存在chars中,len表示这次读取了几个字符
FileReader fileReader = new FileReader("src/test/java/test.txt");
  int len ;
  char[] chars = new  char[2];
  while ((len = fileReader.read(chars)) != -1){
      System.out.print(chars);
  }
  fileReader.close();

写文件

FileWriter fileWriter = new FileWriter("src/test/java/test.txt",true);
String str = "我要追加的字符串";
fileWriter.write(str);
fileWriter.write(str.toCharArray());
fileWriter.close();

原理

字节流没有缓冲区

读取时候的缓冲区

字符流存在一个缓冲区,第一次读的时候会尽可能的多读一些数据(8192长度),存放在缓冲区,然后先从缓冲区拿,拿完了再向文件中取。

写入时候的缓冲区

字符流在写入的时候,其实是写入到一个缓冲区中,缓冲区存满了才往硬盘里导入,可以使用flush()方法刷新缓冲区

4、缓冲流

高级流是对基本流做了一个包装,底层真正读写数据的其实还是基本流。

高级流的构造函数都要拿基本流作为传入参数,来构造

在这里插入图片描述

缓冲流(高效)

在这里插入图片描述

字节缓冲流

使用缓冲流来拷贝文件

  1. 使用方法其实还是一样的
  2. 不用关闭基本流
  3. 之所以快,是因为它节省了和硬盘打交道的时间(一次读很多),读完以后放到缓冲区中(缓冲区在内存中,搬运速度就很快)

在这里插入图片描述

字符缓冲流

在这里插入图片描述

字符缓冲读取文件

在这里插入图片描述

字符缓冲写入文件

在这里插入图片描述

5、转换流

字符流和字节流之间的桥梁。可以相互转换

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6、序列化流

在这里插入图片描述

在这里插入图片描述

将对象写入文件中

  1. 构造函数里要传入基本流FileOutputStream
  2. 对象需要有Serializable接口
Student student = new Student();
student.setName("张三");
student.setAge(18);

ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("src/test/java/test.txt"));
objectOutputStream.writeObject(student);
objectOutputStream.close();

读取文件中的对象

ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("src/test/java/test.txt"));
Object o = objectInputStream.readObject();
System.out.println(o);
objectInputStream.close();

原理

序列化以后会的到版本号,不相同的话反序列化会报错。

可以自己手动在对象中定义版本号,名字不能改!一定要用这个名字!

在这里插入图片描述

  • 如果有成员变量不想序列化,就在前面加transient

在这里插入图片描述

如果文件中有多个对象怎么办呢?

写入多个对象

在这里插入图片描述

读取多个对象

一次 readObject() 只能读取一个对象,我们一般都把对象放在一个list当中,直接读取这个list

在这里插入图片描述

7、打印流

打印流不能读,只能写

  • 字节打印流:PrintStream
  • 字符打印流:PrintWriter
  • 有三个特点:
    • 只有写,没有读
    • 有特有的方法,可以把数据原样写出
    • 特有的写出方法可以实现自动刷新,自动换行(打印一次数据=写出+换行+刷新)

在这里插入图片描述

字节打印流

无缓冲区

在这里插入图片描述

PrintStream printStream = new PrintStream(new FileOutputStream("src/test/java/test.txt"));
printStream.println(97);
printStream.println(true);
printStream.close();

字符打印流

有缓冲区,想刷新要自动开启

在这里插入图片描述

PrintWriter printWriter = new PrintWriter(new FileWriter("src/test/java/test.txt"));
printWriter.println("wdafawdaw");
printWriter.close();

其实用的就是打印流

System.out.println();

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32CubeIDE基础学习-基础外设初始化配置

STM32CubeIDE基础学习-基础外设初始化配置步骤 前言 前面的文章介绍了基础工程的创建步骤,这篇文章就接着在基础工程的基础上来配置相关外设了,下面以STM32F103C8T6的主芯片为例进行简单配置。 基础工程创建步骤回顾 具体的配置步骤流程如下&#xff1…

[两个栈实现队列]

[两个栈实现队列] 一、题目二、思路三、代码 一、题目 二、思路 //思路:两个栈实现队列,栈是先入后出,队列是队尾入,对头出,(先入先出),那么可以这样干,假设一个栈Pushst&#xff0c…

Java基础 - 8 - 算法、正则表达式

一. 算法 什么是算法? 解决某个实际问题的过程和方法 学习算法的技巧? 先搞清楚算法的流程,再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

如何使用 ArcGIS Pro 统计四川省各市道路长度

在某些时候,我们需要进行分区统计,如果挨个裁剪数据再统计,不仅步骤繁琐、耗时,还会产生一些多余的数据,这里教大家如何在不裁剪数据的情况下统计四川各市的道路长度,希望能对你有所帮助。 数据来源 教程…

web前端之uniApp实现选择时间功能

MENU 1、孙子组件1.1、html部分1.2、JavaScript部分1.3、css部分 2、子组件2.1、html部分2.2、JavaScript部分2.3、css部分 3、父组件3.1、html部分3.2、JavaScript部分 4、效果图 1、孙子组件 1.1、html部分 <template><view><checkbox-group change"ch…

HashSet在添加元素时,是如何判断元素重复的? (原理详解 | 易错案例)

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

分享一个完全免费的GPT4站点,gpts也可以用

给大家分享一个完全免费的GPT4站点&#xff0c;gpts也可以用点击链接可用

板级PDN(电源分配网络)设计要点综述

目录 目标阻抗去耦方法 确定目标阻抗 确定目标频点 VRM 去耦电容 安装电感 平面电容 总结 去耦电容 PCB叠层设计 扩展阅读 目标阻抗去耦方法 确定PCB去耦方案的策略是使用频域目标阻抗法&#xff0c;通过层间电容和分立电容器组合的使用&#xff0c;保证电源轨阻抗在…

【MySQL】视图 -- 详解

视图 是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 一、基本使用 1、创建视图 create view 视图名 as select 语句; 好处&#xff1a;…

基于springboot+vue实现电子商务平台管理系统项目【项目源码+论文说明】

基于springboot实现电子商务平台管理系统演示 研究的目的和意义 据我国IT行业发布的报告表明&#xff0c;近年来&#xff0c;我国互联网发展呈快速增长趋势&#xff0c;网民的数量已达8700万&#xff0c;逼近世界第一&#xff0c;并且随着宽带的实施及降价&#xff0c;每天约有…

Node.js最准确历史版本下载(以下载Node.js16.17.1版本为例)

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤

吴恩达深度学习笔记:深度学习引言1.1-1.6

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第一周&#xff1a;深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络&#xff1f;(What is a Neural Network) 第一门课&#xff1a;神经网络和深度学习 (Ne…

leetcode 3.5

普通数组 1.最大子数组和 最大子数组和 前缀和pre 动态规划 pre保留的是当前包含了当前遍历的最大的前缀和&#xff0c;如果之前的pre 对结果有增益效果&#xff0c;则 pre 保留并加上当前遍历, 如果pre 对结果无增益效果&#xff0c;需要舍弃&#xff0c;则 pre 直接更新为…

基于ZYNQ PS-SPI的Flash驱动开发

本文使用PS-SPI实现Flash读写&#xff0c;PS-SPI的基础资料参考Xilinx UG1085的文档说明&#xff0c;其基础使用方法是&#xff0c;配置SPI模式&#xff0c;控制TXFIFO/RXFIFO&#xff0c;ZYNQ的IP自动完成发送TXFIFO数据&#xff0c;接收数据到RXFIFO&#xff0c;FIFO深度为12…

整合力-整合思维模型和领导力

整合力和领导力是组织成功的两大关键因素。在当今复杂多变的商业环境中&#xff0c;整合力和领导力的结合对于推动组织发展至关重要。本文将探讨整合力和领导力的概念、重要性以及如何有效整合二者以促进组织的成功发展。 ### 整合力的重要性 整合力指的是组织内部各个部门、…

CSS字体样式的使用,前端开发手册

零基础学web前端开发要怎么去学? 首先要学习的就是基础知识&#xff1a;html、css和JavaScript。HTML是内容&#xff0c;CSS是表现&#xff0c;JavaScript是行为。前端开发的门槛其实非常低&#xff0c;与服务器端语言先慢后快的学习曲线相比&#xff0c;前端开发的学习曲线是…

java: Compilation failed: internal java compiler error或者构建时内存溢出解决办法

启动项目的时候出现了java: Compilation failed: internal java compiler error问题 解决办法 统一JDK版本 一、查看项目的jdk&#xff08;CtrlAltshiftS&#xff09;&#xff1a;File ->Project Structure ->Project Settings ->Project 二、查看工程的jdk&…

硬盘删除的文件如何恢复?分享硬盘数据恢复方法

随着信息时代的飞速发展&#xff0c;硬盘作为我们储存数据的主要场所其重要性日益凸显。但硬盘数据的丢失或误删也成为了许多用户头疼的问题。当您发现重要的文件从硬盘中消失时不必过于焦虑。本文将为您介绍五种高效且原创的数据恢复策略&#xff0c;帮助您找回那些珍贵的文件…

爬虫学习笔记-requests爬取NBA得分榜

1.导入requests库,用于请求获取URL位置的资源 import requests 2.导入lxml库,解析及生成xml和html文件 from lxml import etree 3.定义发送请求的地址 url https://nba.hupu.com/stats/players 4.定义请求头 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64…

CSS如何清除默认样式,想学web开发

一面 css 如何实现垂直居中&#xff1f;position 有哪几种&#xff1f;分别说一下对应的效果和用法css 选择器优先级js 原型链&#xff0c;问了js 如何创建对象页面渲染和响应 式MVVM 和 MVC的区别Vue 生命周期&#xff0c;在哪个阶段可以获取页面 dom 信息Vue 的组件通信 &am…