关于IO流你知道什么?
wptr33 2025-03-10 21:13 29 浏览
让我们来探讨一下IO流吧
一.流的概念:
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。它的特性是进行数据传输;
例如从水源地长江把水导入自来水厂,然后又从自来水厂把水送到各家各户。从长江到自来水厂之间的管道我们可以称之为输入流,从自来水厂把水送到各家各户的管道我们称之为输出流,我们大概可以这么理解。
二.流的继承体系
在java中,为了对不同来源和性质的流对象调用统一的方法,java中的流首先定义了顶层输入/输出流的接口或抽象类,这样不同性质具体的流对象就会有统一的调用方法以便使用,在使用流对象时,尽量的按照在具体流所实现的接口(抽象类)中定义的方法使用。
三.流的分类
流按照流向数据流向可以分为输入流和输出流。
流按照处理数据类型的单位不同可以分为字节流和字符流。
四.字节流和字符流
字节流:InputStream和OutputStream是java中可以按照最小字节单位读取的流,即每次读写一个字节,字节流是直接连接到输入源的流。
字符流:是以字符为单位进行数据处理的IO流。本质其实就是基于字节流读取时,去查找指定的码表。
字节流与字符流之间的区别:
1. 读写单位不同:字节流式以字节(8位2进制)为单位,字符流是以字符为单位,根据码表映射字符,一次可能读多个字节。
2. 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
3. 一次读入或读出是8位二进制。
4. 字符流:一次读入或读出是16位二进制。
结论:只要是纯文本数据优先使用字符流,除此之外都使用字节流。
五.输入流和输出流的用途
输入流是指程序从数据源中读取数据。只进行读操作;
输出流是指将数据从程序中写到指定的文件中;
六.输入流字节流InputStream与输出字节流InputStream
1.InputStream是一个抽象类,是所有输入字节流的父类。
2.ByteArrayInputStream、StringBufferInputStream、FileInputStream是三中基本的戒指了,他们分别从数组、StringBuffer、和本地文件中读取数据。
3.PipedInputStream是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
4.ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。
1.OutputStream 是所有的输出字节流的父类,它是一个抽象类。
2.ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
3.PipedOutputStream 是向与其它线程共用的管道中写入数据。
4.ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。
七.节点流和处理流的概念
节点流:直接与数据相连,进行数据的读写;
处理流:是指在节点流上套接了一层。
常用的节点流
1.文件 :FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter 文件进行处理的节点流
2.数组 :
ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
3.字符串 :StringReader、 StringWriter 对字符串进行处理的节点流
4.管 道 :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 对管道进行处理的节点流
常用的处理流
1. 缓冲流:
2. BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
2.转换流:InputStreamReader 、OutputStreamReader实现字节流和字符流之间的转换。
3.数据流: DataInputStream 、DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来。
八.转换流
InputStreamReader、OutputStreamWriter 要InputStream或OutputStream作为参数,实现从字节流到字符流的转换。
九.常用例子
使用FileInputStream类读取文件内容
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 数据输入流测试
*
*
*/
public class firstIO {
//程序的主方法
public static void main(String [] args) throws IOException{
int i=0;
FileInputStream in=null;
try {
in=new FileInputStream("C:\\Users\\15080\\Desktop\\aaaa.txt");//从文件外读数据
} catch (FileNotFoundException e) {
// TODO: handle exception
System.out.println("找不到文件位置");
System.exit(-1);
}
try {
int num=0;//用于字节个数的计数
while((i=in.read())!=-1){
System.out.println((char)i);//将得到的ASCII码值转换成字符型
num++;
}
in.close();
System.out.println("传输字节个数:"+num);
} catch (Exception e) {
// TODO: handle exception
System.out.println("读取文件错误");
}
}
}
使用FileOutputStream写入文件
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* 输入输出流测试
*
*
*/
public class outIO {
//程序主方法
public static void main(String []args){
int i=0;
FileInputStream in=null;
FileOutputStream out=null;
try {
//实例化FileInputStream,FileOutputStream对象
in=new FileInputStream("C:\\Users\\15080\\Desktop\\aaaa.txt");
out=new FileOutputStream("C:\\Users\\15080\\Desktop\\bbbb.txt");
while((i=in.read())!=-1){
out.write(i);
System.out.println((char)i);
}
in.close();
out.close();
System.out.println("文件已复制");
} catch (Exception e) {
// TODO: handle exception
System.out.println("文件复制错误");
System.exit(-1);
}
}
}
使用FileRead、FileWriter复制文件
import java.io.FileReader;
import java.io.FileWriter;
public class TestFieldWriter1 {
public static void main(String []args){
FileReader fr=null;
FileWriter fw=null;
try {
fr=new FileReader("C:\\Users\\15080\\Desktop\\eeee.txt");//要读取的文件
fw=new FileWriter("C:\\Users\\15080\\Desktop\\ffff.txt");//要复制的目的文件
int i=0;
while((i=fr.read())!=-1){
fw.write(i);
System.out.println((char)i);//将得到的ASCII码值转换成字符型
}
fr.close();
fw.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
相关推荐
- 什么是Java中的继承?如何实现继承?
-
什么是继承?...
- Java 继承与多态:从基础到实战的深度解析
-
在面向对象编程(OOP)的三大支柱中,继承与多态是构建灵活、可复用代码的核心。无论是日常开发还是框架设计,这两个概念都扮演着至关重要的角色。本文将从基础概念出发,结合实例与图解,带你彻底搞懂Java...
- Java基础教程:Java继承概述_java的继承
-
继承概述假如我们要定义如下类:学生类,老师类和工人类,分析如下。学生类属性:姓名,年龄行为:吃饭,睡觉老师类属性:姓名,年龄,薪水行为:吃饭,睡觉,教书班主任属性:姓名,年龄,薪水行为:吃饭,睡觉,管...
- java4个技巧:从继承和覆盖,到最终的类和方法
-
日复一日,我们编写的大多数Java只使用了该语言全套功能的一小部分。我们实例化的每个流以及我们在实例变量前面加上的每个@Autowired注解都足以完成我们的大部分目标。然而,有些时候,我们必须求助于...
- java:举例说明继承的概念_java继承的理解
-
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物,同理,...
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
-
前情回顾前面两天我们重点调研了了一下Cursor的原理和Cursor中一个关键的工具edit_file的实现,但是其他CodingAgent也需要稍微摸一下底,看看有没有优秀之处,下...
- 学会这几个插件,让你的Notepad++使用起来更丝滑
-
搞程序开发的小伙伴相信对Notepad++都不会陌生,是一个占用空间少、打开启动快的文件编辑器,很多程序员喜欢使用Notepad++进行纯文本编辑或者脚本开发,但是Notepad++的功能绝不止于此,...
- 将 node_modules 目录放入 Git 仓库的优点
-
推荐一篇文章Whyyoushouldcheck-inyournodedependencies[1]...
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
-
“再熬一年,90%的程序员可能再也用不着写for循环。”凌晨两点半,王工还在公司敲键盘。他手里那份需求文档写了足足六页,产品经理反复改了三次。放在过去,光数据库建表、接口对接、单元测试就得写两三天。现...
- git 如何查看stash的内容_git查看ssh key
-
1.查看Stash列表首先,使用gitstashlist查看所有已保存的stash:...
- 6万星+ Git命令懒人必备!lazygit 终端UI神器,效率翻倍超顺手!
-
项目概览lazygit是一个基于终端的Git命令可视化工具,通过简易的TUI(文本用户界面)提升Git操作效率。开发者无需记忆复杂命令,即可完成分支管理、提交、合并等操作。...
- 《Gemini CLI 实战系列》(一)Gemini CLI 入门:AI 上命令行的第一步
-
谷歌的Gemini模型最近热度很高,而它的...
- deepin IDE新版发布:支持玲珑构建、增强AI智能化
-
IT之家8月7日消息,深度操作系统官方公众号昨日(8月6日)发布博文,更新推出新版deepin集成开发环境(IDE),重点支持玲珑构建。支持玲珑构建deepinIDE在本次重磅更...
- 狂揽82.7k的star,这款开源可视化神器,轻松创建流程图和图表
-
再不用Mermaid,你的技术文档可能已经在悄悄“腐烂”——图表版本对不上、同事改完没同步、评审会上被一句“这图哪来的”问得哑口无言。这不是危言耸听。GitHub2025年开发者报告显示,63%的新仓...
- 《Gemini CLI 实战系列》(五)打造专属命令行工具箱
-
在前几篇文章中,我们介绍了GeminiCLI的基础用法、效率提升、文件处理和与外部工具结合。今天我们进入第五篇...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
如何将AI助手接入微信(打开ai手机助手)
-
SparkSQL——DataFrame的创建与使用
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
redission YYDS spring boot redission 使用
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
- 最近发表
-
- 什么是Java中的继承?如何实现继承?
- Java 继承与多态:从基础到实战的深度解析
- Java基础教程:Java继承概述_java的继承
- java4个技巧:从继承和覆盖,到最终的类和方法
- java:举例说明继承的概念_java继承的理解
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
- 学会这几个插件,让你的Notepad++使用起来更丝滑
- 将 node_modules 目录放入 Git 仓库的优点
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
- git 如何查看stash的内容_git查看ssh key
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)