Java IO流(一)

1. IO流概述

1.1 什么是IO流

        在计算机中,input/output(I/O、i/o 或非正式的 io 或 IO)是信息处理系统(例如计算机)与外界(可能是人类或其他信息处理系统)之间的通信。 输入是系统接收到的信号或数据,输出是系统发送的信号或数据。

        Java将数据的输入/输出(I/O)操作当作流处理,流是一组有序的数据序列,也可称为数据流。

        数据流分为两种形式:输入流和输出流。站在当前系统的角度,数据流入系统的是输入流,数据流出系统的是输出流。如下图所示:

1.2 I/O的流分类

        为支持Java程序的I/O操作,Java在java.io包下提供了丰富的I/O相关API(80余个类和接口)。为了快速掌握Java I/O的核心API,需要先了解I/O流的分类。

        可以按照不同的角度对流进行分类:

        1、按照数据流的方向不同可以分为输入流和输出流

        2、按处理数据单位不同可以分为字节流和字符流

        3、按使用方式不同可分为节点流与处理流,也称为基础流和高级流

  • 节点流:真实连接数据源与程序之间的"管道",负责实际搬运数据的流,读写一定是建立在节点流的基础上进行的
  • 处理流:不能独立存在,必须连接在其它流上,使得在读写数据的过程中,当数据流经当前处理流时对其做某些加工处理,简化我们对数据的相关操作

        实际应用中我们会串联一组高级流并最终连接到基础流上,使得对数据的读写以流水线加工的方式实现。这个过程称为流的连接,也是IO的精髓所在。

2. 字节流

2.1 字节流概述

        字节流,顾名思义,是指数据流中的数据以字节为单位进行操作,主要用于处理二进制数据。

        InputStream和OutputStream是字节流的核心类,是2个抽象类,定义了基础的数据流读写方法,字节流中的其他类均为两个类的子类。

        FileInputStream和FileOutputStream是字节流中最为常用的类,分别继承自InputStream和OutputStream,属于基础流。

        BufferedInputStream和BufferedOutputStream是字节流中较为常用的高级流,间接继承自InputStream和OutputStream,主要提供了缓冲区功能。

2.2 创建 FOS 对象

        FileOutputStream,是文件的字节输出流,可以以字节为单位将数据写入文件。

        其构造方法有:

  • FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写数据的文件输出流
  • FileOutputStream(String filename):创建一个向具有指定名称的文件中写数据的文件输出流

        这里需要注意:若指定的文件已经包含内容,那么当使用FOS对其写入数据时,会将该文件中原有数据全部清除。

        若想在文件的原有数据之后追加新数据则需要以下构造方法创建FOS:

  • FileOutputStream(File file,boolean append):创建一个向指定 File 对象表示的文件中写数据的文件输出流
  • FileOutputStream(String filename,boolean append):创建一个向具有指定名称的文件中写数据的文件输出流

        以上两个构造方法中,第二个参数若为true,那么通过该FOS写出的数据都是在文件末尾追加的。

2.3 FileOutputStream示例

        编写代码,向文件写入数据:分别测试覆盖写操作和追加写操作。代码示意如下:

package api_03;

import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputDemo {
    public static void main(String[] args) throws IOException {
        /*
         * 文件输出流有两种创建方式,分别表示的是覆盖写操作和追加写操作
         * 构造方法如下:
         * FileOutputStream(File file)
         * FileOutputStream(String path)
         * 以上形式创建的文件流是覆盖写模式,当创建时指定的文件已经存在,则会将该
         * 文件数据全部清除,然后通过当前流写出的内容作为该文件的数据
         *
         * FileOutputStream(File file,boolean append)
         * FileOutputStream(String path,boolean append)
         * 当构造方法第二个参数为true时,当前文件流为追加写模式,
         * 即:若文件已经存在,原有数据保留,通过当前流写出的内容都被追加到文件中。
         */
        FileOutputStream fos  = new FileOutputStream("./src/api_03/fos.txt", true);
//     String str = "这是第一次写出的内容\n";
        String str = "这是第二次写出的内容\n";
        byte[] data = str.getBytes("utf-8");
        fos.write(data);
        System.out.println("写出完毕!");
        fos.close();
    }
}

2.4 创建 FIS 对象

        FileInputStream(常简称为 FIS对象),作为文件的字节输入流,使用该流可以以字节为单位从文件中读取数据。

        FileInputStream有两个常用的构造方法:

  • FileInputStream(File file):创建一个从指定 File 对象表示的文件中读取数据的文件输入流
  • FileInputStream(String name):创建用于读取给定的文件系统中的路径名name所指定的文件的文件输入流

2.5 读和写

        FileInputStream继承自InputStream,其提供了以字节为单位读取文件数据的方法read:

  • int read():从此输入流中读取一个数据字节,若返回-1则表示EOF(End Of File)
  • int read(byte[] b):从此输入流中将最多 b.length 个字节的数据读入到字节数组b中

        FileOutputStream继承自OutputStream,其提供了以字节为单位向文件写数据的方法write:

  • void write(int d):将指定字节写入此文件输出流,这里只写给定的int值的”低八位”
  • void write(byte[] d):将 b.length 个字节从指定 byte 数组写入此文件输出流中
  • void write(byte[] d,int offset,int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流

2.6 FileInputStream示例

        编写代码,读取文件内容。代码示意如下:

package api_03;

import java.io.FileInputStream;
import java.io.IOException;
public class FileInputDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis
                = new FileInputStream("./src/api_03/fos.txt");
        // 存放读取到的数据的容器
        byte[] data = new byte[1024];
        // 执行一次读取,将读到的数据存入data中
        int len = fis.read(data);
        System.out.println("实际读取到了"+len+"个字节");

        String str = new String(data,0,len,"utf-8");
        System.out.println(str);
        fis.close();
    }
}

2.7 文件复制示例

        编写代码,实现文件复制。代码示意如下:

package api_03;

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

public class FileCopyDemo1 {
    public static void main(String[] args) throws IOException {
        /*
         * 1:创建文件输入流,用于读取原文件
         * 2:创建文件输出流,用于写复制文件
         * 3:循环从原文件读取一组字节并写入
         *   到复制文件中,完成复制工作
         * 4:关闭两个流
         */
        FileInputStream fis
                = new FileInputStream("./src/api_03/fos.txt");

        FileOutputStream fos
                = new FileOutputStream("./src/api_03/fos_cp.txt");

        byte[] data = new byte[1024*10];
        int len = -1;
        // 当读取到流的末尾时,会返回-1
        while((len = fis.read(data))!=-1) {
            // 注意规避数组中的冗余数据
            fos.write(data,0,len);
        }

        System.out.println("复制完毕!");
        fis.close();
        fos.close();
    }
}

        在上述操作中,需要特别注意读取到流的末尾时可能遇到的数组中数据冗余问题。

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

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

相关文章

c#Excel:2.写入Excel表 3.读取Excel表

--写入Excel表-- 该例首先从数据库aq中读取学生信息表staq(参考数据库章节),然后将学生信息表中的数据写入Excel表格中 (1)在OfficeOperator项目的ExcelOperator类中定义索引器,用于获取Excel表格中的单元格,代码如下…

理解Linux文件系统

文章目录 一、引言二、Linux文件系统概述1、文件系统的结构2、文件系统目录树的逻辑结构 二、文件系统的特性1、super block:文件系统的超级块2、inode:文件系统的索引节点3、inode table4、block:文件系统的数据块5、块组描述符表&#xff0…

QT:核心控件-QWidget

文章目录 控件enableobjectNamegeometrysetWindowTitleopacitycursorFonttooltipstyleSheet 控件 什么是控件? 如上所示,就是控件,而本篇要做的就是对于这些控件挑选一些比较有用的常用的进行讲解分析 在QT的右侧,会有对应的空间…

第 8 章 机器人平台设计(自学二刷笔记)

重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 学习到当前阶段大家对ROS已经有一定的认知了,但是之前的内容更偏理论,尤其是介绍完第6…

ccpc热身赛题目1:中文系Roliy的困惑

代码 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();char [] charArr new char[32];for (int i 0; i < charArr.length; i) {charArr[i] 0…

python 怎么调用R

如何在python中调用R&#xff1f;这其中包括了如何调用R的对象&#xff08;函数和包&#xff09;&#xff0c;R和python的对象如何互相转换&#xff0c;以及如何调用R的脚本&#xff08;外界参数的输入&#xff09;。python提供了一个模块rpy2&#xff0c;可以较好地完成这项工…

RCE学习(一)

一.知识点 RCE&#xff1a;远程命令/代码执行漏洞&#xff0c;简称为RCE漏洞&#xff0c;可以直接向服务器后台远程注入操作系统的命令或者代码&#xff0c;从而拿到服务器后台的权限。RCE分为远程执行命令&#xff08;执行ping命令&#xff09;和远程代码执行eval 简单来说就…

Python-Socket编程实现tcp-udp通信

本文章是记录我准备大创项目时学的socket编程的用法&#xff0c;纯属记录生活&#xff0c;没有教学意义&#xff0c;视频我是看b站up主王铭东学的&#xff0c;讲的很详细&#xff0c;我只粗略学了个大概&#xff0c;我想要通过tcp&#xff0c;udp传输yolo目标检测中的物体坐标信…

java面试(微服务)

SpringCloud五大组件 Nacos&#xff1a;注册中心Ribbon&#xff1a;负载均衡Feign&#xff1a;远程调用sentinel&#xff1a;服务熔断Gateway&#xff1a;网关 注册中心 Eureka Nacos 负载均衡 Ribbon负载均衡流程 Ribbon的负载均衡策略 RoundRobinRule&#xff1a;简单的…

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测 目录 分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测分类效果基本介绍程序设计参考资料分类效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多分类预测。最小二乘支持向量机(Least Squares Support Vecto…

网络应用层之(6)L2TP协议详解

网络应用层之(6)L2TP协议 Author: Once Day Date: 2024年5月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

python算法题

需求 代码 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:if max(nums) >target:for i in range(len(nums)-1):if nums[i1] > target and nums[i] <target:return i1if max(nums) <target:return len(nums)if min(nums) > …

kubectl_入门_Pod控制器

Pod控制器 在k8s中&#xff0c;按照pod的创建方式可以将其分为两类 自主式pod&#xff1a;k8s直接创建出来的pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建控制器创建的pod&#xff1a;通过控制器创建的pod&#xff0c;这种pod删除了之后还会自动重建 1. 什么…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

C语言 | Leetcode C语言题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* rotateRight(struct ListNode* head, int k) {if (k 0 || head NULL || head->next NULL) {return head;}int n 1;struct ListNode* iter head;while (iter->next ! NULL) {iter iter->next;n;}int add n…

第12章 软件测试基础(第一部分)概念、质量保证、测试用例、测试执行过程

一、软件测试 &#xff08;一&#xff09;定义 动态验证计算机程序对有限的测试用例集是否可产生期望的结果的过程。测试计划是描述了要进行的测试活动的范围、方法、资源和进度的文档。编写测试计划目的&#xff1a;使测试工作顺利进行、使项目参与人员沟通更舒畅、使测试工…

操作系统:线程

目录 前言&#xff1a; 1.线程 1.1.初识线程 1.2.“轻量化”进程 1.3.线程与进程 2.线程控制 2.1.pthread原生线程库 2.2.线程控制的接口 2.2.1.线程创建 2.2.线程退出|线程等待|线程分离|线程取消 2.3.pthread库的原理 2.4.语言和pthread库的关系 2.5.线程局部…

redis核心数据结构——跳表项目设计与实现(跳表结构介绍,节点类设计,随机层级函数)

跳表结构介绍。跳表是redis等知名软件的核心数据结构&#xff0c;其实现的前提是有序链表&#xff0c;思想的本质是在原有一串存储数据的链表中&#xff0c;间隔地抽出一半元素作为上一级链表&#xff0c;并将抽提出的元素和原先的位置相关联&#xff0c;这样重复下去直到最上层…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

数据分析及AI技术在旅游行业的应用

引言 旅游行业是一个充满潜力和机遇的领域&#xff0c;而数据分析和人工智能&#xff08;AI&#xff09;技术的迅猛发展为这个行业带来了前所未有的机遇和挑战。本文将探讨数据分析及AI技术在旅游行业中的具体应用及其带来的影响。 数据分析在旅游行业的4种应用 在旅游行业…