1.IO 流引入

概述:以应用程序为参照物,读取数据为输入流(Input),写数据为输出流(Output),大量输入输出数据简称 IO 流

原理:

2.IO 流的分类

读写的文件分类

  • 二进制文件:打开后是乱码,或者是 16 进制,无法生成文件的文件
  • 文本文件:打开文件内容可以直接阅读

IO流读取数据内容分类

  • 字符流:读取的内容最小单位是 char 类型
  • 字节流:读取的内容最小单位是 byte 类型

3.IO 流的访问方式分类

随机读写文件:文件中存在一个游标,通过移动游标的方式,改变读写数据的位置

顺序读写文件:每次都从文件开始的位置开始读写

4.IO 字节流

输入输出字节流:InputStream、OutputStream

API:

  • int read():从流中读取一个字节,返回值为 int 类型
  • void wirte(int b):把一个字节写入到流中(把int 类型的低八位)
  • void close():关闭管道流

4.1.文件输出/入字节流

文件流:FileInputStream(文件输入流)、FileOutputStream(文件输出流)

特点:文件流是节点流,直接可以操作磁盘的文件

节点流概念:能够介质(文件、网络、控制台)直接相连的流

API:

  • FileInputStream(File file)
  • FileInputStream(String name)
  • FileOutputStream(String name)
  • FileOutputStream(String name, boolean append)
  • FileOutputStream(File file, boolean append)
  • FileOutputStream(File file)
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; /**
* 完成文件的拷贝
*/
public class FileStreamDemo {
public static void main(String[] args) throws IOException {
// 1.创建一个文件输入流
FileInputStream fis = new FileInputStream("test.txt");
// 2.创建一个文件输出流
FileOutputStream fos = new FileOutputStream("text.txt");
// 3.创建一个数组
byte[] data = new byte[1024]; while (true) {
// 4.读取数据
int len = fis.read(data);
// 7.判断读取的长度是否为 -1
if (len == -1){
System.out.println("文件拷贝成功");
break;
}
// 5.写数据
fos.write(data, 0, len);
}
// 6.关闭管道流
fis.close();
fos.close(); }
}

4.2.ByteArray 字节流

Byte 字节流:ByteArrayInputStream(比特数组输入流)、ByteArrayOutputStream(比特数组输出流)

特点:包含一个缓冲区,该缓冲区存储从流中读取的数据

API:

  • ByteArrayInputStream(byte[] buf)
  • ByteArrayInputStream(byte[] buf, int offset, int length)
import java.io.*;

/**
* 文件拷贝
*/
public class ByteArrayStreamDemo {
public static void main(String[] args) throws IOException {
// 1.创建一个文件管道流
FileInputStream fis = new FileInputStream("E:\\software\\developSoftware\\Java\\JavaSE\\basic\\src\\test.txt");
// 2.创建另一个文件输出流
FileOutputStream fos = new FileOutputStream("E:\\software\\developSoftware\\Java\\JavaSE\\basic\\src\\123.txt");
// 3.创建数组管道流
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
// 5.定义数组
byte[] data = new byte[1024];
while (true) {
// 4.读取数据
int len = fis.read(data);
// 7.跳出
if (len == -1) break;
// 6.写数据
bos.write(data, 0, len);
}
bos.writeTo(fos);
// 8.关闭管道
fis.close();
fos.close();
bos.close();
}
}

4.3.Data 字节流

Data 字节流:DataInputStream(数据输入流)、DataOutputStream(数据输出流)

特点:读取数据就是 Java 的数据类型,属于处理流

import java.io.*;

public class DateStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建输入管道流
DataInputStream dis = new DataInputStream(new FileInputStream("test.txt"));
//2.创建一个输出管道流
DataOutputStream dos = new DataOutputStream(new FileOutputStream("text.txt"));
//3.边读边写
byte[] data = new byte[1024];
while (true){
int len = dis.read(data);
if (len == -1) break;
dos.write(data, 0 ,len);
}
//4.关闭管道
dis.close();
dos.close();
}
}

4.4.缓冲字节流

缓冲字节流:BufferedInputStream(缓冲输入字节流)、BufferedOutputStream(缓冲输出字节流)

特点:

  • 处理了,一边和程序连接,一边和修饰流或者节点流连接。不能直接面对外部介质(文件、网络)
  • 缓冲流中的缓冲区为了提高读取或写入的效率,将读取或写入的文字暂时存储在缓冲区,当缓冲区满了之后,一起将数据读出或写入,减少读写的次数

API:

  • BufferedInputStream(InputStream is)
  • BufferedOutputStream(InputStream is)
  • int read(byte[] b):将读取文件内容放置在 byte[] 数组中,然后返回读取的字节数。int:读取的字节数。如果读到末尾,返回 -1
import java.io.*;

public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建一个输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
//2.创建一个输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("text.java"));
//3.边读边写
byte[] data = new byte[1024];
while (true){
int len = bis.read();
if (len == -1) break;
bos.write(data, 0, len);
bos.flush(); //当缓冲区满了就会自动刷出
}
//4.关闭流
bis.close();
bos.close();
}
}

5.IO 字符流

5.1.输入输出字符流

输入输出字符流:Reader(输入字符流)、Writer(输出字符流)

特点:

  • 读写的内容是字符
  • 是抽象类
  • 是字符流的根类
  • 读取的文件是文本文件

PAI:

  • int read():读取文本文件内容
  • void write(int ):写入文件
  • void close():关闭管道

5.2.文件输入输出字符流

FileReader(文件输入字符流)、FileWriter(文件输出字符流)

特点:读数据方式是字符、属于节点流

API:

  • FileReader(String fileName):根据路径加载文件,并且建立和程序的输入管道
  • FileWriter(String fileName):根据路径加载文件,并且建立和程序的输出管道
  • int reader(char[] c)
  • void write(char[] c);
  • void flush();
  • void close();
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//获取文件路径
String path = FileReaderDemo.class.getResource("").getPath();
//1.创建文件输入字符流
FileReader reader = new FileReader(path + "test.txt");
//2.输出字符流
FileWriter writer = new FileWriter(path +"text.txt");
while (true){
//3.读取文件内容
int buf = reader.read();
if (buf == -1) break;
//将字符写入文件
writer.write(buf);
//情况缓冲区
writer.flush();
}
//关闭管道流
reader.close();
writer.close();
}
}

11.IO 流的更多相关文章

  1. 11 IO流(八)——装饰器设计模式,Filter装饰流

    声明:本文部分图片及内容引用自:https://www.cnblogs.com/qiumingcheng/p/5219631.html java装饰器设计模式 举一个形象的例子,人可以说话,而扩音器可 ...

  2. java 21 - 11 IO流的标准输入流和标准输出流

    标准输入输出流 System类中的两个成员变量: public static final InputStream in "标准"输入流. public static final P ...

  3. 021.11 IO流 序列流

    序列流:SequenceInputStream特点:流对象有序排列解决问题:将多个输入流合并成一个输入流,将多个源合并成一个源,对于多个源的操作会变简单. 构造函数参数就是输入流,一初始化就合并了多个 ...

  4. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  5. IO流

    流的概念和作用 学习JavaIO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特 ...

  6. 黑马程序员_Java基础:IO流总结

    ------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...

  7. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...

  8. JavaEE基础(二十二)/IO流

    1.IO流(序列流) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方式 整合两个: ...

  9. JavaEE基础(二十一)/IO流

    1.IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出. 2 ...

  10. JavaEE基础(二十)/IO流

    1.IO流(IO流概述及其分类) 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操作类型分 ...

随机推荐

  1. quartus之LPM_MULT测试

    quartus之LPM_MULT测试 1.基本作用 一个专用的乘法器,可以调用DSP单元的IP,可以提高设计中的运算效率. 2.实际操作 `timescale 1ns/1ns module mult_ ...

  2. KingbaseES 对象重命名需要注意的事项

    前言: Oracle 对视图或同义词依赖的底层对象表,如果被重命名,则视图或同义词失效.Oracle DBA 经常利用这个特点,对表进行重建,在重建过程中,无法通过视图或同义词访问,这就保证了数据的安 ...

  3. archlinux 安装后xfce没有声音,声音无法调节

    参照 http://ivo-wang.github.io/2018/02/17/fix/ sudo pacman -S alsa-utils pavucontrol sudo pacman -S pi ...

  4. 《写给程序员的Python教程》阅读随笔---python禅学(Zen_of_python)

    Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Comp ...

  5. MySQL登录退出与导入导出

    登录退出MySQL 登录命令 mysql -u 用户名 -p 密码 -h IP -P 端口 mysql -u root -p password -h 127.0.0.1 -P 3306 一般登录命令 ...

  6. ET介绍——事件机制EventSystem

    事件机制EventSystem ECS最重要的特性一是数据跟逻辑分离,二是数据驱动逻辑.什么是数据驱动逻辑呢?不太好理解,我们举个例子 一个moba游戏,英雄都有血条,血条会在人物头上显示,也会在左上 ...

  7. #AC自动机,树状数组#洛谷 2414 [NOI2011] 阿狸的打字机

    题目 分析 首先考虑按照题意建出一个AC自动机, 然后\(s[x]\)在\(s[y]\)出现的次数也就是 在fail树上,根节点到\(y\)中一共出现了多少个\(x\), 在\(x\)的终止节点处统计 ...

  8. #博弈论#HDU 2516 取石子游戏

    题目 \(n\)个石子,两人轮流取.先取者第1次可以取任意多个, 但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜.先取者负输出"Second win".先取 ...

  9. C# 继承、多态性、抽象和接口详解:从入门到精通

    C# 继承 在 C# 中,可以将字段和方法从一个类继承到另一个类.我们将"继承概念"分为两类: 派生类(子类) - 从另一个类继承的类 基类(父类) - 被继承的类 要从一个类继承 ...

  10. 实战:如何优雅的从 Skywalking 切换到 OpenTelemetry

    背景 最近公司将我们之前使用的链路工具切换为了 OpenTelemetry. 我们的技术栈是: OTLP Client──────────►Collect────────►StartRocks (Ag ...