i:input 输入 读取; o:output 输出 写入; 流:数据(字符、字节)1个字符=1字节 一个字节=8个二进制; 输入:把硬盘中的数据,读取到内存中使用; 输出:把内存中的数据,写入到硬盘中保存 ; 字节流:字节输入流 InputStream 字节输出流 OutputStream字节符:字符输入流 Reader字符输出流 Writer 一切皆为字节。 java.io.OutputStream:字节输出流 此抽象类是表示输出字节流的所有类的超类; 定义了一些子类共性的成员方法 void close():关闭此输出流并释放与此流有关的所有系统资源 void flush():刷新此输出流并强制写出所有缓冲的输出字节 void write(byte[] b):将 b.length 个字节从指定的 byte 数组写入此输出流。 abstract void write(int b):将指定的字节写入此输出流 FileOutputStream extends OutputStream 文件字节输出流 作用:把内存中的数据写入到硬盘的文件中
1.代码 package d01_TestInput;/* * zt * 2020/8/7 * 11:36 * */ import java.io.BufferedOutputStream; TestBufferedOutputStream { public static void main(String[] args) throws Exception { //创建缓冲字节输出流 bos.flush(); } //关闭:默认刷新,并关闭节点流 bos.close(); } } 2.输出结果 ?
OutputStream 3.1、字节数组输出流 ByteArrayOutputStream 3.2、过滤输出流 FilterOutputStream 3.2.1、缓冲输出流 BufferedOutputStream 3.2.2、DataOutputStream 数据输出流 3.3、文件输出流 FileOutputStream 先序 下面这张图是来自这篇博客https://blog.csdn.net/u010145219 1、Bits 工具类 Bits 是一个工具类,一般是供 java io 包下的类使用的,用于处理字节,因为输入输出流分为 字节流 和 字符流。 6、static long getLong(byte[] b, int off):long 是8字节,将 b 数组的 off 至 off + 7 位置拼成一个long。 7、static double getDouble(byte[] b, int off):double 是8字节,先将 b 数组的 off 至 off + 7 位置拼成一个long,再利用Double类的静态本地方法
IO流分为输入流、输出流 输入输出流 又分为字节流、字符流 字节流 InputStream:抽象了应用程序读取数据的方式 OutputStream:抽象了应用程序写 出数据的方式 EOF = End (byte[] buf,int start, int size)读取数据到字节数组buf从buf的start位置开始存放size长度分数据 输出流的基本方法 out.write(int b) //写出一个 byte到流,b的低8位 out.write(byte[] buf) //将buf字节数组都写到流 out.write(byte[] buf, int start,int size) //字节数组buf 从start位置开始写size长度的字节到流 FileInputStream 具体实现了在文件上读取数据 FileInputStream 实现了向文件写出byte数据方法 public static 相当于一瓢一瓢(比如int 4滴4滴转移)把水“转移”过去 BufferedOutputStream—>write方法更方便,相当于一飘一瓢先放入桶中(缓冲区),再从桶中倒入到另一个缸中 读写效率对比:使用字节数组作为缓冲的流
本文讲解了 Java 中 字节流 OutputStream 类的语法,介绍了 OutputStream 类的应用场景,并给出了样例代码,字节输出流是用于将字节数据写入到输出目标的流。 一、什么是字节输出流 Java 字节输出流是用于将字节数据写入到输出目标的流,它以字节为单位进行写入操作,并提供了多种方法来写入不同类型的数据。 字节输出流是 OutputStream 类的子类,它提供了一系列的 write() 方法用于将字节数据写入到输出目标。常用的写入方法包括: write(int b):将指定的字节写入输出流。 ---- 四、字节输出流面试题 什么是 Java 字节输出流? Java 字节输出流的工作原理是什么? 与字符输出流相比,字节输出流有什么特点和优势? 在 Java 中如何使用字节输出流写入数据到文件? 如何在 Java 中使用字节输出流将数据写入网络连接? 在使用字节输出流写入文件时,如何确保写入的数据被刷新并且文件被正确关闭?
1.代码 package d01_TestInput;/* * zt * 2020/8/7 * 11:11 * */ import java.io.FileOutputStream; public TestFileOutputStream { public static void main(String[] args) throws Exception { //1.创建流
之前介绍的 FileOutputStream、ByteArrayOutputStream 等都是基础流,在构造时候不需要传入其他流。但是 BFOS 的构造需要传入一个字节输出流。 基本用法 这个流的功能可以根据名字看出来,是一个缓冲输出流,可以当做一个缓冲区,将输出的字节暂时存在缓冲区里,那么当缓冲区满了之后干嘛呢? 为了将水放掉,就需要给一个输出的目的地,这个目的地就是构造方法中需要传入的下游的输出流。其默认的缓冲区大小是 8KB。 ? 之前我们的缓冲区用的是 BAOS,参考 java 字节流入门(内存数组流->文件流)。那用 BFOS 可不可以? 单缓冲区 假如我们在内存中只需要维护一个缓冲区的数据,即一个字节数组。 先比比速度,BFOS+FOS vs BAOS + FOS (内存中只维护一个 BAOS 或一个 BFOS ,并接一个文件输出流)哪种比较快?
4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.OutputStream; 7 import java.util.Scanner; 8 9 /* 10 * 文件字节输出流 2014-7-29 11 * 1.给出输出流的目的地 12 * 2.创建指向目的地的输出流 13 * 3.人输出流把数据写入到目的地 14 * 4.关闭输出流 15 * 16 * 举例: 使用文件输出流写文件a.txt 17 * 措施:首先使用具有刷新功能的构造方法创建指向文件 a.txt的输出流, 18 * 并向a.txt文件写入“新年快乐”,然后在选择使用不刷新文件的构造方法 19 * 20 * 指向a.txt。 47 System.out.println(file.getName()+"的大小:"+file.length()+"字节"); 48 out.write
1、字节输出流:OutputStream public abstract class OutputStream extends Object implements Closeable , Flushable 这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。 方法摘要: ? 下面我们用 字节输出流 OutputStream 的典型实现 FileOutputStream 来介绍: //1、创建目标对象,输出流表示把数据保存到哪个文件。 下面我们用 字节输出流 InputStream 的典型实现 FileInputStream 来介绍: //1、创建目标对象,输入流表示那个文件的数据保存到程序中。
引言 在Java编程的世界中,字节输出流是我们处理输出数据的得力助手。无论是写入文件、网络传输还是其他场景,理解如何正确使用字节输出流至关重要。 一、什么是字节输出流 字节输出流(OutputStream)是 Java I/O 的核心组件之一,负责将字节数据写入输出目标。 通过本节的深入解析,你将了解到字节输出流的基本原理、常用方法,以及如何正确使用它来实现数据的输出。 基本原理 字节输出流的基本原理是将字节数据从程序输出到目标设备或目标位置。 字节输出流和字符输出流有什么区别? 答:字节输出流(OutputStream)和字符输出流(Writer)都是用于写入数据的流,但它们处理的数据单位不同。 此外,在写入完毕后要及时关闭流,以释放资源。 字节输出流和字节输入流的区别是什么? 答:字节输出流用于向输出目标写入字节数据,而字节输入流用于从输入源读取字节数据。
OutputStreamWriter(OutputStream out) 2)OutputStreamWriter(OutputStream out, String charset) 参数: OutputStream:字节输出流 ,将编码之后的字节数据写入文件中; charset:指定编码的名称,不区分大小写,不指定默认为UTF-8 2、实现步骤: 1、创建OutputStreamWriter对象,构造方法中可以传入参数字节输出流对象 ,即字节写入的文件,以及编码方式; 2、调用write方法,把字符转换成字节存储到缓冲区中; 3、调用flash方法,将缓冲区的字节数据刷新到文件中; 4、释放资源。 "MyBatis01\\outputStreamWriter.txt",true)); //写数据 osw.write("使用转换流写UTF-8格式的文件"); //将转换后的字节文件存储到缓冲区 ; //将转换后的字节文件存储到缓冲区 osw1.flush(); //释放资源 osw1.close(); } 字符转换流总结: 版权声明:本文内容由互联网用户自发贡献
1、字节缓冲流 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流 字节缓冲输出流 BufferedOutputStream 字节缓冲输入流 BufferedInputStream 这种类被称为:缓冲区类(高效类) 构造方法可以指定缓冲区的大小,但是我们一般用不上 (OutputStream out) //创建基本的字节输出流对象 // FileOutputStream fos = new FileOutputStream("bos.txt"); //字节缓冲输出流对字节输出流对象进行包装 // BufferedOutputStream bos = new BufferedOutputStream(fos); // 简单写法 原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。 2、字节缓冲流复制数据练习 把d:\a.txt内容复制到当前项目目录下的b.txt中
本章博客的知识点: 1、字节输出流和字符输出流的共存问题 2、转发时,两个servlet都输出信息的问题 详细知识,见OneServlet和TwoServlet源代码中的注释 转发:传参,访问顺序 1、字节输出流和字符输出流的共存问题 index.jsp: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> -- 1、字节输出流和字符输出流的共存问题---不能共存(跟get或post方式没关系)。即 :在同一个servlet响应中,不能同时采两种输出流。 另外:如果要用字节流输出中文,用write(byte[])方法 --> 字节输出流和字符输出流的共存问题 <form action ServletOutputStream out = response.getOutputStream();//获取字节输出流 out.print("HELLO--doGet
此抽象类是表示输出字节流的所有类的超类 定义了一些子类的共性成员方法: public void close() :关闭此输出流并释放与此流相关联的任何系统资源。 public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。 将 b.length字节从指定的字节数组写入此输出流。 从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 ,构造方法中绑定要读取的数据源 2.创建一个字节输出流对象,构造方法中绑定要写入的目的地 3.使用字节输入流对象中的方法read读取文件 4.使用字节输出流中的方法write,把读取到的字节写入到目的地文件中
流的输入及输出均是对程序而言 字节流输入 创建File对象,关联文件 File src = new File("D:/aa", "a.txt"); 1)、创建以src为输入流的对象, Inputstream null) { try { in.close(); } catch (IOException e) { System.out.println("关闭输入流失败"); } } } 字节流输出 创建File对象,关联文件 File src = new File("D:/aa", "a.txt"); 1)、创建以src为输出流的对象, Outputstream in = new FileOutputStream (src); 2)、建立字符串,转换为字节数组并写入 String str = "simple\n"; out.write(str.getBytes()); 3)、刷新输出流 out.flush(); flush()方法使流中的数据写入文件 2. 4)、读取结束后关闭输出流 out.close(); 进行异常处理 try { out = new FileOutputStream(src, true
2.字节流 java.io.OutputStream抽象类是表示字节输出流的所有超类,将指定的字节信息输出到目的地,他定义了字节输出流的基本共性功能方法 public void close :关闭此输出流并释放与此流关联的任何资源系统 public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。 public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。 () 关闭此输出流并释放与此输出流相关联的任何资源系统 public abstract int read() : 从输入流读取数据的下一个字节。 4.字符输出流 java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节 输出流的基本共性功能方法。
字节字符转换流 认识文本和文本文件 123 java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)文件是byte byte byte ...的数据序列文本文件是文本(char )序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果 字符流(Reader Writer)—->操作的是文本文本文件 123456 字符的处理,一次处理一个字符字符的底层任然是基本的字节序列字符流的基本实现 InputStreamReader 完成byte流解析为char流,按照编码解析 OutputStreamWriter 提供char流到byte流,按照编码处理 FileReader /FileWriter 字符流的过滤器 123456789101112131415161718192021 //BufferedReader ---->readLine 一次读一行 //BufferedWriter e.printStackTrace(); }finally { fis.close(); osw.close(); } } 字节字符读写流
“流”的分类 1.1 输入流和输出流 IO流根据数据流动的方向,可以分为输入流和输出流: 输入流:用于读取数据,从外部资源(如文件、网络等)读取数据到程序中。 输出流:用于写入数据,将数据从程序写入到外部资源。 1.2 字节流和字符流 根据处理的数据类型,可以分为字节流和字符流: 字节流:以字节为单位处理数据。适用于处理二进制数据,如图像、音频、视频等。 OutputStream流 OutputStream是所有字节输出流的抽象基类,主要用于写入字节数据。 Writer Writer是所有字符输出流的抽象基类,主要用于写入字符数据。 BufferedInputStream和BufferedOutputStream BufferedInputStream和BufferedOutputStream是字节输入和输出缓冲流,提供了更高效的字节读写操作
会把输出的内容写入 writer 的缓冲区中
out.flush();
// 最后一次的输出,由于没有手动 flush,会在整个页面输出到客户端的时候,自动写入到 writer
缓冲区
out.write ("这是 out 的第二次输出
");
// writer 的输出
response.getWriter().write("这是 writer 的第一次输出
");
response.getWriter 会把输出的内容写入 writer 的缓冲区中
最后一次的输出,由于没有手动 flush,会在整个页面输出到客户端的时候,自动写入到 writer缓冲区
2) 图解 out 流和 writer 流的两个缓冲区如何工作
<%
// out 输出
out.write("这是 out 的第一次输出
");
// out flush 之后。 会把输出的内容写入 writer 的缓冲区中
out.flush();
// 最后一次的输出,由于没有手动 flush,会在整个页面输出到客户端的时候,自动写入到 writer
缓冲区
out.write
,一个汉字可能占用2个或者3个甚至4个字节,这样如果逐个字节输出的话,当需要输出的内容是中文的时候,就会出现乱码。 中文乱码 改造的话就不能再是逐个字节的输出,而是需要将多个字节放在一起,同时读出来。 ? 无乱码 这样将多个字节内容,通过String的构造器将字节转换为字符串,就可以正确的输出中文了。 与输入流对应的,输出流将字符转为对应的int,然后逐个将int使用输出流的write方法,写入到文件中。 上例中不再需要循环逐个读入字符,而是将str转为字节,str.getBytes(),然后用输出流fos调用write方法的重载方法write(str.getBytes())即可。 缓冲流 上面讲解的普通流是逐个字节进行输入或输出,这样虽然可以完成工作,但是在效率上有很大的问题。