IO流---字节输入输出流,字符输入输出流

news2024/11/26 17:52:00

IO流概述

IO流,即输入输出流(Input Output Stream),是一种抽象概念,用来处理设备之间的数据传输问题,例如文件复制、文件上传、文件下载等。在Java中,对数据的操作通常是通过流的方式进行的,这些用于操作流的类都包含在IO包中。

按照流向分类,IO流可以分为输入流和输出流。输入流主要用于从外部设备(如文件、键盘、网络等)读取数据,而输出流则用于将数据写入外部设备。

按照数据类型分类,IO流可以分为字节流和字符流。字节流通常用于处理二进制数据,如图片、音频、视频等而字符流则只能操作纯字符数据,适用于处理文本文件等。

Java IO流还包括一些常用的父类,如字节流的InputStream和OutputStream,以及字符流的Reader和Writer。这些父类提供了读写数据的基本方法,子类可以通过继承这些父类来实现具体的数据读写操作。

字节输入流

以下是使用FileInputStream读取文件内容的基本步骤:

  1. 创建一个FileInputStream对象,指定要读取的文件的路径。
  2. 读取文件中的数据。可以使用read()方法一次读取一个字节,或者使用read(byte[] b)方法一次读取多个字节到字节数组中。
  3. 处理读取到的数据。
  4. 关闭输入流,释放系统资源。

实例一: 读取文本内容

public class IOLearn1 {
    public static void main(String[] args) throws Exception {
        //创建一个FileInputStream对象
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
        int data;
        //每次读取一个字节
        while ((data=fileInputStream.read())!=-1){
            System.out.print((char)data);
        }
        //关闭输入流
        fileInputStream.close();
    }
}

a.txt文本内容

实现结果:

实例二:以数组方式读取文本内容

import java.io.FileInputStream;

public class IOLearn2 {
    public static void main(String[] args) throws Exception {
        //创建一个FileInputStream对象
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
        byte[] buffer=new byte[3];
        //每次读取字节数组
        int readCount;//返回此次读取到数组中字节个数
        while ((readCount=(fileInputStream.read(buffer)))!=-1){
            String s = new String(buffer, 0, readCount);
            System.out.print(s);
        }
        //关闭输入流
        fileInputStream.close();
    }
}

注意:在以数组方式读取字节时, 新读取的字节会从前到后替代原有数组字符。

字节输出流

实例:复制文件,将a.txt内容复制到b.txt中

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

public class IOLearn3 {
    public static void main(String[] args) throws Exception {
        //创建一个FileInputStream对象
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
        //创建文件输出流对象
        FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
        //读取a.txt文件中的数据写入到b.txt中
        int data;
        while ((data=fileInputStream.read())!=-1){
            fileOutputStream.write(data);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }
}

结果:文件内容复制成功

注意:字节输入输出流适用于文件的复制,在读取文件可能会出现乱码,即使用字节输入流中的数组读取方式也不是好的选择,因为要使的不出现乱码就要求一次读取完文件中所用的字节,就要求数组长度要容纳文件中数据而内存远小于磁盘,此种方式会出现内存溢出,因此,字节输入流不适用读取文件内容。

字符输入流

实例:使用字符输入流读取文件内容

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;

public class IOLearn4 {
    public static void main(String[] args) throws Exception {
        //创建字符输入流管道
        FileReader fileReader = new FileReader("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
        //读取数据
        int read;
//        while((read = fileReader.read())!=-1){
//            System.out.print((char) read);
//        }
//        fileReader.close();
        System.out.println("======================");
        //使用字符数组读取数据
        char [] chars=new char[3];
        while ((read = fileReader.read(chars))!=-1){
            System.out.print(new String(chars,0,read));
        }

    }
}

结果:

字符输出流

实例:复制文件

import java.io.FileReader;
import java.io.FileWriter;

public class IOLearn5 {
    public static void main(String[] args) throws Exception {
        //创建字符输入流管道
        FileReader fileReader = new FileReader("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
        //读取数据
        int read;
        FileWriter fileWriter=new FileWriter("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
        //使用字符数组读取数据
        char [] chars=new char[3];
        while ((read = fileReader.read(chars))!=-1){
            fileWriter.write(chars, 0, read);
            fileWriter.flush();
        }
        fileReader.close();
        fileWriter.close();

    }
}

结果:

注意在使用字符输出流输出数据到外部文件中时,要将缓存中的数据写入到外部文件中,也就是刷新流或者关闭流。

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

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

相关文章

qml中解决Page控件头部元素Margin不生效的问题

0、想要的效果 1、问题描述 经测试:Page的头部无法完美的进行左右边距设置,leftMargin可以,rightMargin不可以。。。。 Page {// ...header: Frame {id: headerheight: 70// 必须首先锚定位,然后设置边距才生效padding: 0anchor…

轻松掌握Jenkins执行远程window的Jmeter接口脚本

Windows环境:10.1.2.78 新建与配置节点 【系统管理】—【管理节点】—【新建节点】输入节点名称,勾选“dumb slave”,点击ok 按如上配置: 说明: Name:定义slave的唯一名称标识,可以是任意字…

【动态规划】【记忆化搜索】【状态压缩】1681. 最小不兼容性

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 状态压缩 记忆化搜索 1681. 最小不兼容性 给你一个整数数组 nums​​​ 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中,使得同一…

函数式编程的技巧

14.1.2 科里化 给出科里化的理论定义之前,让我们先来看一个例子。应用程序通常都会有国际化的需求将一套单位转换到另一套单位是经常碰到的问题。 单位转换通常都会涉及转换因子以及基线调整因子的问题。比如,将摄氏度转换到华氏度的公式是CtoF(x)x*9/…

(2024|ICLR,SVD,软加权正则化,推理时文本嵌入优化)文本到图像扩散模型的图像内容抑制

Get What You Want, Not What You Dont- Image Content Suppression for Text-to-Image Diffusion Models 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 相关工作 3. 方…

IIC--集成电路总线

目录 一、IIC基础知识 1、设计IIC电路的原因: 2、上拉电阻阻值怎么确定 3、IIC分类 4、IIC协议 二、单片机使用IIC读写数据 1、 IIC发送一个字节数据: 2、IIC读取一个字节数据: 一、IIC基础知识 1、设计IIC电路的原因: (…

【JavaEE】_Fiddler抓包HTTP请求与响应

目录 1. Fiddler简介 2. Fiddler安装步骤 3. 抓包结果举例(sogou.com) 1. Fiddler简介 1. 要查看HTTP的请求和响应,需要使用抓包工具进行抓包; 抓包即获取网卡上经过的数据并显示出来,常用的抓包工具有wireshark和…

Linux第57步_“linux系统镜像”和“根文件系统”重新打包小结

实时总结是很重要的,时间久了,可能会遗忘。下面是“linux系统镜像”和“根文件系统”重新打包小结。 1、linux系统镜像重新打包 在第1次完成linux系统镜像打包后,再重新打包就很容易了 将“bootfs”重新打包 准备打包文件: 输入“cd /ho…

专业140+总分400+华中科技大学824信号与系统考研经验华科华中大电子信息与通信工程,真题,大纲,参考书。

今年考研落下帷幕,看到有人落寞,有人金榜题名,心里体会五谷杂陈,自己很幸运通过努力上岸华科,初试专业课824信号与系统140,数一130,总分400,对于这个成绩稍微有点超出自己预期&#…

python-产品篇-游戏-象棋

文章目录 代码效果 代码 import pygame import time import constants from button import Button import pieces import computerclass MainGame():window NoneStart_X constants.Start_XStart_Y constants.Start_YLine_Span constants.Line_SpanMax_X Start_X 8 * Lin…

三种输入输出函数

目录 printf函数 scanf函数 getchar函数 putchar函数 gets函数 puts函数 printf函数 当你需要将数据或文本输出到屏幕或其他输出设备时,C语言提供了一个非常有用的函数,即 printf() 函数。它是标准库中定义的函数,用于格式化输出。 pr…

[力扣 Hot100]Day27 合并两个有序链表

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 出处 思路 简单题,两个指针就能解决。 代码 class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(!list1)…

蓝桥杯电子类单片机提升三——NE555

目录 单片机资源数据包_2023 一、NE555和定时器工作模式 1.NE555的介绍 2.定时器的计数模式 二、NE555频率读取代码的实现 1.定时器0初始化 2.通过读取TH0和TL0来读取频率 3.通过中断读取频率 三、完整代码演示 通过读取TH0和TL0来读取频率 main.c 通过中断读取频…

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding,本质上是多个Transformer的Encoder堆叠在一起。 其中单个Transformer Encoder结构如下: BERT-Base采用了12个Transformer Encoder。 BERT-large采用了24个Transformer Encoder。 2. BERT的…

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表

文章目录 前言参考目录学习笔记1:API1.1:遵循的规则1.2:ST 用例举例1.2.1:行为测试用例1.2.2:性能测试用例2:基本实现2.1:无序链表处理2.2:初级ST实现小结2.3:有序数组的…

Python 异常处理及程序调试

Python 是一门功能强大而又易于学习的编程语言,它提供了丰富的工具和库来帮助开发者编写高效、稳定的程序。然而,在编写复杂的应用程序时,错误和异常是难以避免的。本文将介绍 Python 中的异常处理机制以及程序调试技巧,帮助读者提…

Linux--编译器-gcc/g++使用

目录 前言 1.看一段样例 2.程序的翻译过程 1.第一个阶段:预处理 2.第二个阶段:编译 3.第三个阶段:汇编 4.第四个阶段:链接 3.程序的编译为什么是这个样子? 4. 关于编译器 5.链接(动静态链接&#x…

Docker的常见命令以及命令别名

常见命令 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并允许容器docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker rm删除指定容器docker ps查看容器do…

波奇学Linux:文件系统打开文件

从文件系统来看打开文件 计算机系统和磁盘交互的大小是4kb 物理内存的4kb,磁盘的4kb文件叫做页帧 磁盘数据块的以4kb为单位。 减少IO的次数,减少访问外设的次数--硬件 基于局部性的原理,预加载机制--软件 操作系统管理内存 操作系统对…

相机图像质量研究(19)常见问题总结:CMOS期间对成像的影响--Sensor Noise

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…