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;// 当读取到流的末尾时,会返回-1while((len = fis.read(data))!=-1) {// 注意规避数组中的冗余数据fos.write(data,0,len);}System.out.println("复制完毕!");fis.close();fos.close();}
}

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

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

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

相关文章

基于ssm+vue+Mysql的药源购物网站

开发语言:Java框架:ssmJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.…

Ubuntu系统设置中文及中文输入法(手把手,学不会打我)

前言 最近开始搞C系统编程的学习,整了个Ubuntu系统,进去发现是英文系统,我一开始觉得也能接受,就当练英文,反正那些命令也都是用英文,不过后面等我暗转了一个Chrome并且开始用这里的软件去搜问题时&#x…

【08】JAVASE-面向对象-类和对象【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture:波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。…

Linux:冯诺依曼体系结构、操作系统、初识进程

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数(lib)概念 总结 3.初识进程3.1 基本事实与引入3.2…

(1)探索 SpringAI - 基本概述

人工智能简介 A system is ability to correctly interpret external data, to learn from such data, and to use those learnings to achieve specific goals and tasks through flexible adaptation. 翻译:系统正确解释外部数据的能力,从这些数据中学…

飞腾D2000+X100 TYPE6全国产核心板

飞腾D2000X100 TYPE6核心板 产品概述 飞腾D2000X100 TYPE6核心板为增强型自主控制器核心板,其核心芯片CPU采用飞腾D2000/8核工业版CPU、飞腾桥片X100、双通道DDR4L插槽、PHY芯片等。 产品特点 l 基于飞腾D2000X100桥片 l 丰富的PCIE扩展资源,一路PCIE…

大面积车间降温用什么方法

生产车间降温用什么设备好,生产车间降温设备的选择取决于多种因素,如车间的大小、高度、通风条件、预算以及员工的工作环境需求等。以下是一些常见的生产车间降温设备及其特点: 工业风扇(包括大型吊扇): …

街道征迁项目档案管理系统

街道征迁项目档案管理系统是一个用于管理街道征迁项目档案的软件系统。该系统的主要功能包括档案录入、档案存储、档案检索、档案共享等。 系统的用户可以通过该系统录入征迁项目相关的档案信息,包括项目名称、征迁范围、土地面积、征迁补偿费用等。同时&#xff0c…

el-table分页多选导出excel表格

需求:使用el-table分页查询表格的时候记录上一页已选中的数据,之后点击导出按钮后对表格已选中数据导出excel表格,导出成功后清空选中的状态,本文章只记录分页导出的关键代码,其中包含之前的导出全部表格,导…

2024五一数学建模C题Python代码+结果表数据教学

2024五一数学建模竞赛(五一赛)C题保姆级分析完整思路代码数据教学 C题 煤矿深部开采冲击地压危险预测 第一问 导入数据 以下仅展示部分,完整版看文末的文章 import numpy as np import pandas as pd import matplotlib.pyplot as plt imp…

Edge浏览器新特性深度解析,写作ai免费软件

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

python u是什么意思

u:表示unicode字符串,默认模式,里边的特殊字符会被识别。 作用:后面字符串以unicode格式进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。 用法&#xff…

分享天某云对象存储开发的体验

最近体验了天某云对象存储的功能,作为一名资深开发者,开发体验差强人意,与阿里云存在一定的差距。 首先在开发文档上居然没有基于nodejs的代码示例,只有java,c#,go等的代码示例,虽然有javascript的,但那也只…

24 JavaScript学习:this

this在对象方法中 在 JavaScript 中,this 的值取决于函数被调用的方式。在对象方法中,this 引用的是调用该方法的对象。 让我们看一个简单的例子: const person {firstName: John,lastName: Doe,fullName: function() {return this.firstN…

牛客NC368 质数的计数【中等 基础数学,数论 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/190167d1990442da9adb133980259a27 思路 判断x是否是质数:这是判断质数最好的代码了public boolean isPrime(int x){if(x 2 || x3) return true;if(x%6!1 && x%6!5) return false; //不在6倍…

macOS13中切换不同jdk的“笨“方法

1.用以下命令先查看自己的jdk有哪些版本 /usr/libexec/java_home -V 2.sudo vim /etc/profile 修改前,jdk->1.8 修改后 source ~/.bash_profile

【95】哪些错误会记录Header log

关于header log怎么解析的见: https://blog.csdn.net/linjiasen/article/details/129823460?spm1001.2014.3001.5502 1、AER Mask Reg和Header Log Reg的关系 如果PCIe设备实现的AER capability,那么uncorrectable error mask reg和correctable error…

全栈开发之路——前端篇(1)介绍、框架确定、ide设置与项目创建

文章目录 前言一、前端框架React和VueReactVue 二、编译器选择和配置1.传统的下载和使用2.你可能遇到的问题1.ERR! syscall mkdir2.vue : File C:\nodejs\node_global\vue.ps1 cannot be loaded because running scripts is disabled on3.出现乱码问题 3.运行Vue 三…

模型智能体开发之metagpt-多智能体实践

参考: metagpt环境配置参考模型智能体开发之metagpt-单智能体实践 需求分析 之前有过单智能体的测试case,但是现实生活场景是很复杂的,所以单智能体远远不能满足我们的诉求,所以仍然还需要了解多智能体的实现。通过多个role对动…

C++:匿名对象

在C中,匿名对象是指在不分配给定变量名称的情况下创建的临时对象。这些对象通常用于传递参数给函数、作为函数的返回值或者在表达式中使用。 创建匿名对象 在C中,您可以使用类的构造函数来创建匿名对象。例如: MyClass(); // 创建一个匿名…