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

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();

    }
}

结果:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

幻兽帕鲁云服务器搭建零基础教程,新手小白一看就会

以下教程基于阿里云服务器ECS 来搭建幻兽帕鲁游戏服务器,通过一键部署的方式,最快1分钟即可完成部署。 阿里云一键部署幻兽帕鲁的活动地址:1分钟畅玩!一键部署幻兽帕鲁联机服务器 首先,打开阿里云的这个游戏服务器活…

【机器学习笔记】8 决策树

决策树原理 决策树是从训练数据中学习得出一个树状结构的模型。 决策树属于判别模型。 决策树是一种树状结构,通过做出一系列决策(选择)来对数据进行划分,这类似于针对一系列问题进行选择。决策树的决策过程就是从根节点开始&…

二维数组传参的本质(详解)

目录 一、前言二、分析本质三、总结 一、前言 有时候我们有⼀个⼆维数组的需要传参给⼀个函数的时候&#xff0c;我们是这样写的&#xff1a; #include <stdio.h> void test(int a[3][5], int r, int c) {int i 0;int j 0;for (i 0; i < r; i){for (j 0; j <…

网络安全问题概述

1 计算机网络面临的安全性威胁 两大类威胁&#xff1a;被动攻击和主动攻击。 被动攻击 指攻击者从网络上窃听他人的通信内容。 通常把这类攻击称为截获。 攻击者只是观察和分析某一个协议数据单元 PDU&#xff0c;以便了解所交换的数据的某种性质&#xff0c;但不干扰信息…

【PyQt】11-QTextEdit、QPushButton

文章目录 前言一、文本输入-QTextEdit1.1 代码1.2 运行结果 二、QPushButton2.1.1 按钮上添加文本2.1.2 按键的弹跳效果2.1.3 两个信号可以绑定一个槽。2.1.4 带图标的按键运行结果 2.1.5 按键不可用以及回车默认完整代码2.2 单选按键控件运行结果 2.3 复选框&#xff08;多选框…

1Coze平台介绍

2023年随着OpenAI推出GPT 3.5&#xff0c;AI赛道变得更加火热。GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;用于生成文本、理解语言和进行各种语言任务。GPT是由OpenAI开发的&#xff0c;它…

Python 异常处理及程序调试

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

枚举,#define,C中程序内存区域划分

目录 一、枚举 1.1枚举类型的声明 1.2枚举类型的优点 1.3枚举类型的使用 二、#define定义常量 三、C中程序内存区域划分 一、枚举 1.1枚举类型的声明 枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。 比如我们现实生活中&#xff1a; ⼀周的星期⼀到星期日是有限…

【AIGC】Stable Diffusion 的提示词入门

一、正向提示词和反向提示词 Stable Diffusion 中的提示词通常用于指导用户对生成的图像进行控制。这些提示词可以分为正向提示词&#xff08;Positive Prompts&#xff09;和反向提示词&#xff08;Negative Prompts&#xff09;两类&#xff0c;它们分别影响图像生成过程中的…

MATLAB计算极限和微积分

一.函数与极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0c;x分别趋于0和1&#xff0c;代码如下&#xff1a; syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1&#xff1a; 1.计算双侧极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0…

输入输出自定义映射矩阵(数据结构树)

输出自定义FC其它算法实现&#xff0c;可以参考下面文章&#xff1a; https://rxxw-control.blog.csdn.net/article/details/125994252https://rxxw-control.blog.csdn.net/article/details/125994252下面我们看下我们的控制要求。在学习本篇博客之前大家可以熟悉下数据结构图…

内网横向渗透-1

目录 内网横向渗透 流量监听工具的使用 ARP欺骗 工具使用 服务密码攻击 hydra medusa ncrack hashcat 内网横向渗透 流量监听工具的使用 ARP欺骗 工具使用 ettercap 工具 可以进行arp欺骗、DNS欺骗&#xff0c;网络钓鱼等等&#xff01; driftnet -i eth0 可以用来…

GiantPandaCV | 视觉类表面缺陷检测项目相关技术总结

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;视觉类表面缺陷检测项目相关技术总结 本文由海滨撰写&#xff0c;首发于GaintPandaCV。 零、前言 做这个方向的项目也有一段时间了&#xff0c;作为…

在Postgresql 下安装QGIS

一.打开 Application Stack Builder 二.选择默认端口和安装目标 三.选择【Spatial Extensions】 四.选择安装位置 五.选择安装组件 六.选择数据库和输入对应账号密码 七.安装完成

【Linux】进程的初步认识

进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程&#xff0c;首先我们要知道两点 我们可以同时启动多个程序&#xff0c;也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些…

C# CAD SelectionFilter下TypedValue数组

SelectionFilter是用于过滤AutoCAD实体的类&#xff0c;在AutoCAD中&#xff0c;可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时&#xff0c;需要传入一个TypedValue数组&#xff0c;它用于定义选择规则。 在TypedValue数组中&#xff0c;每个元素表示一个选…

如何将视频转换为音频?10 个最佳视频音频文件转换器!

生活中最令人愉快的乐趣之一就是拍摄、编辑和分享视频。由于有如此多的设备能够捕捉视频&#xff0c;并且有如此多的分享视频的方式&#xff0c;有时音频旁白可能比图片更重要、更有启发性。更糟糕的是&#xff0c;您选择的视频可能无法在您的设备上播放。 在这种情况下&#…

中科大计网学习记录笔记(十一):CDN

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

多线程 --- 线程互斥

目录 1. 线程互斥 1.1. 相关背景概念 1.2. 互斥锁 1.2.1. 初始化互斥量 1.2.2. 销毁互斥量 1.2.3. 互斥量加锁 && 解锁 1.3. 互斥量 (锁) 的原理 1.3.2. 相关问题和解释 1.3.2. 锁的实现原理 1.3.3. 可重入 && 线程安全问题 1.3.4. 常见的线程不安全…

【c++】vector的增删查改

1.先定义一个类对象vector 为了防止和库里面发生冲突&#xff0c;定义一个命名空间&#xff0c;将类对象放在命名空间 里面 #include<iostream> using namespace std; namespace zjw {class vector {public:private:}; }2.定义变量&#xff0c;需要一个迭代器&#xff…