Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】
- 视频+资料(工程源码、笔记)【链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs】
- Java基础--学习笔记(零起点打开java世界的大门)--博客汇总表
目 录
01_字节缓冲流
2.7、字节缓冲流
02_字节流复制视频
案例:复制视频
03_为什么出现字符流
3.1、为什么出现字符流
3.2、编码表
05_字符串中的编码解码问题
3.3、字符串中的编码解码问题
06_字符流中的编码解码问题
3.4、字符流中的编码解码问题
07_字符流写数据的5种方式
3.5、字符流写数据的5种方式
08_字符流读数据的2种方式
3.6、字符流读数据的2种方式
09_字符流复制Java文件
案例:复制Java文件
10_字符流复制Java文件改进版
案例:复制Java文件(改进版)
1、API——FileWriter
2、API——FileReader
11_字符缓冲流
3.7、字符缓冲流
1、API——BufferedReader
2、API——BufferedWriter
12_字符缓冲流复制Java文件
案例:复制Java文件(字符缓冲流改进版)
13_字符缓冲流特有功能
3.8、字符缓冲流特有功能
14_字符缓冲流特有功能复制Java文件
案例:复制Java文件(字符缓冲流特有功能改进版)
15_IO流小结
3.9、IO流小结
1、字节流
2、字符流
16_集合到文件
案例:集合到文件
17_文件到集合
案例:文件到集合
18_点名器
案例:点名器
19_集合到文件改进版
案例:集合到文件(改进版)
1、Student.java
2、ArrayListToFileDemo.java
20_文件到集合改进版
案例:文件到集合(改进版)
01_字节缓冲流
2.7、字节缓冲流
字节缓冲流(提高数据读写效率)介绍
- BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
- BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。
构造方法:
- BufferedOutputStream(OutputStream out):创建字节缓冲输出流对象
- BufferedInputStream(InputStream in):创建字节缓冲输入流对象
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
- 字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作。
Class BufferedOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。BufferedOutputStream是具体类;FileOutputStream写字节数据时,会导致底层系统的调用;BufferedOutputStream可以向FileOutputStream写数据,通过设置缓冲区,以后可以一次性把数据写到文件中,底层调用次数减少,效率提高。
Class BufferedInputStream:提高读取数据的效率。
02_字节流复制视频
案例:复制视频
package com.itheima_03;import java.io.*;/*需求:把E:\\itcast\\字节流复制图片.avi 复制到模块目录下的 字节流复制图片.avi思路:1:根据数据源创建字节输入流对象2:根据目的地创建字节输出流对象3:读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)4:释放资源四种方式实现复制视频,并记录每种方式复制视频的时间1:基本字节流一次读写一个字节 共耗时:64565毫秒2:基本字节流一次读写一个字节数组 共耗时:107毫秒3:字节缓冲流一次读写一个字节 共耗时:405毫秒4:字节缓冲流一次读写一个字节数组 共耗时:60毫秒*/
public class CopyAviDemo {public static void main(String[] args) throws IOException {//记录开始时间long startTime = System.currentTimeMillis();//复制视频method1();//记录结束时间long endTime = System.currentTimeMillis();System.out.println("(1)共耗时:" + (endTime - startTime) + "毫秒");startTime = System.currentTimeMillis();method2();endTime = System.currentTimeMillis();System.out.println("(2)共耗时:" + (endTime - startTime) + "毫秒");startTime = System.currentTimeMillis();method3();endTime = System.currentTimeMillis();System.out.println("(3)共耗时:" + (endTime - startTime) + "毫秒");startTime = System.currentTimeMillis();method4();endTime = System.currentTimeMillis();System.out.println("(4)共耗时:" + (endTime - startTime) + "毫秒");}//字节缓冲流一次读写一个字节数组public static void method4() throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("字节流复制图片4.avi"));byte[] bys = new byte[1024];int len;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);}bos.close();bis.close();}//字节缓冲流一次读写一个字节public static void method3() throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("字节流复制图片3.avi"));int by;while ((by = bis.read()) != -1) {bos.write(by);}bos.close();bis.close();}//基本字节流一次读写一个字节数组public static void method2() throws IOException {//E:\\itcast\\字节流复制图片.avi//模块目录下的 字节流复制图片.aviFileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");FileOutputStream fos = new FileOutputStream("字节流复制图片2.avi");byte[] bys = new byte[1024];int len;while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}fos.close();fis.close();}//基本字节流一次读写一个字节public static void method1() throws IOException {//E:\\itcast\\字节流复制图片.avi//模块目录下的 字节流复制图片.aviFileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");FileOutputStream fos = new FileOutputStream("字节流复制图片1.avi");int by;while ((by = fis.read()) != -1) {fos.write(by);}fos.close();fis.close();}
}
03_为什么出现字符流
3.1、为什么出现字符流
字符流的介绍
由于字节流操作中文不是特别的方便,所以Java就提供字符流。
- 字符流 = 字节流 + 编码表
中文的字节存储方式
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?
- 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。
04_编码表
3.2、编码表
基础知识:
- 计算机中储存的信息都是用二进制数表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。
- 按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。这里强调一下:按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号。否则就会导致乱码现象。
字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A, 65)
字符集:
- 是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
- 计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。
常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等。
05_字符串中的编码解码问题
3.3、字符串中的编码解码问题
06_字符流中的编码解码问题
3.4、字符流中的编码解码问题
字符流抽象基类
- Reader:字符输入流的抽象类
- Writer:字符输出流的抽象类
字符流中和编码解码问题相关的两个类:
- InputStreamReader:是从字节流到字符流的桥梁
它读取字节,并使用指定的编码将其解码为字符
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
- OutputStreamWriter:是从字符流到字节流的桥梁
是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
07_字符流写数据的5种方式
3.5、字符流写数据的5种方式
构造方法:OutputStreamWriter(OutputStream out):创建一个使用默认字符编码的OutputStreamWriter
08_字符流读数据的2种方式
3.6、字符流读数据的2种方式
构造方法:InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader
字节流、字符流 读数据的方式一样!
09_字符流复制Java文件
案例:复制Java文件
10_字符流复制Java文件改进版
案例:复制Java文件(改进版)
简化书写,使用FileWriter、FileReader。编码解码问题:需要使用转换流lnputStreamReader、OutputStreamReader。
1、API——FileWriter
2、API——FileReader
11_字符缓冲流
3.7、字符缓冲流
字符缓冲流介绍
- BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途。
- BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
构造方法
- BufferedWriter(Writer out) 创建字符缓冲输出流对象
- BufferedReader(Reader in) 创建字符缓冲输入流对象
1、API——BufferedReader
2、API——BufferedWriter
封装长度为8192长度的字符数组。
12_字符缓冲流复制Java文件
案例:复制Java文件(字符缓冲流改进版)
13_字符缓冲流特有功能
3.8、字符缓冲流特有功能
BufferedWriter:
void newLine():写一行行分隔符,行分隔符字符串由系统属性定义。适应不同的系统:Windows:\r\n;Linux:\n;Mac:\rBufferedReader:
public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null。
14_字符缓冲流特有功能复制Java文件
案例:复制Java文件(字符缓冲流特有功能改进版)
15_IO流小结
3.9、IO流小结
抽象类:InputStream、OutputStream
1、字节流
2、字符流
16_集合到文件
案例:集合到文件
17_文件到集合
案例:文件到集合
18_点名器
案例:点名器
19_集合到文件改进版
案例:集合到文件(改进版)
1、Student.java
package com.itheima_06;public class Student {private String sid;private String name;private int age;private String address;public Student() {}public Student(String sid, String name, int age, String address) {this.sid = sid;this.name = name;this.age = age;this.address = address;}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}
2、ArrayListToFileDemo.java
package com.itheima_06;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class ArrayListToFileDemo {public static void main(String[] args) throws IOException {//2:创建ArrayList集合ArrayList<Student> array = new ArrayList<Student>();//3:创建学生对象Student s1 = new Student("itheima001", "林青霞", 30, "西安");Student s2 = new Student("itheima002", "张曼玉", 35, "武汉");Student s3 = new Student("itheima003", "王祖贤", 33, "郑州");//4:把学生对象添加到集合中array.add(s1);array.add(s2);array.add(s3);//5:创建字符缓冲输出流对象BufferedWriter bw = new BufferedWriter(new FileWriter("students.txt"));//6:遍历集合,得到每一个学生对象for (Student s : array) {//7:把学生对象的数据拼接成指定格式的字符串StringBuilder sb = new StringBuilder();sb.append(s.getSid()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",").append(s.getAddress());//8:调用字符缓冲输出流对象的方法写数据bw.write(sb.toString());bw.newLine();bw.flush();}//9:释放资源bw.close();}
}
20_文件到集合改进版
案例:文件到集合(改进版)
package com.itheima_06;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;public class FileToArrayListDemo {public static void main(String[] args) throws IOException {//2:创建字符缓冲输入流对象BufferedReader br = new BufferedReader(new FileReader("students.txt"));//3:创建ArrayList集合对象ArrayList<Student> array = new ArrayList<Student>();//4:调用字符缓冲输入流对象的方法读数据String line;while ((line = br.readLine()) != null) {//5:把读取到的字符串数据用split()进行分割,得到一个字符串数组String[] strArray = line.split(",");//6:创建学生对象Student s = new Student();//7:把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值//itheima001,林青霞,30,西安s.setSid(strArray[0]);s.setName(strArray[1]);s.setAge(Integer.parseInt(strArray[2]));s.setAddress(strArray[3]);//8:把学生对象添加到集合array.add(s);}//9:释放资源br.close();//10:遍历集合for (Student s : array) {System.out.println(s.getSid() + "," + s.getName() + "," + s.getAge() + "," + s.getAddress());}}
}
终于看完了。。。
Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】相关推荐
- c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...
查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答) 给定一个字符串str,找到不重复字符的最长子字符串. 比如我们有 "ABDEFGABEF", 最长的字符串是 ...
- 字符流中的编码解码问题
字符流中和编码解码问题相关的两个类 InputStreamReader:是从字节流到字符流的桥梁 它读取字节,并使用指定的编码将其解码为字符 它使用的字符集可以由名称指定,也可以被明确指定,或 ...
- [Java基础]字符流读写数据的方式
- [Java基础]字符流中的编码解码问题
- html表单判断字符数,JS判断字符串长度,结合element el-input el-form 表单验证(英文占1个字符,中文汉字占2个字符)...
首先看看判断字符串长度的几种方法(英文占1个字符,中文汉字占2个字符) 方法一: function strlen(str) { var len = 0; for (var i = 0; i < ...
- 请编写一个程序,输入一个由小写字母和其他字符构成的序列字符串保存在tt中,统计“a”到“z”26个字母各自出现的次数,并依次保存在pp数组中,并输出pp数组内容。
#include<stdio.h> #include<math.h> #define M 20 main() { char tt[M]; int pp[26]={0},i,r; ...
- IO流 字符流 字节流 缓冲流 文件的复制
IO流 IO概述 IO流就是一个管道,是用来在设备之间传输数据 input:相对于内存/程序 往进走输入流 output:相对于内存/程序 往硬盘写入 分类 根据数据进出方式 1.输出流: FileW ...
- 十五、IO流【黑马JavaSE笔记】(本文文中记录了个人学习感受)
文章目录 IO流 (一)File 1.File类的概述和构造方法 2.File类的创建功能 3.File类判断和获取功能 4.File类的删除功能 5.递归 6.案例(递归求阶乘) 7.案例(遍历目录 ...
- 【JAVA黑马程序员笔记】三P233-P312(List、Set、比较器、泛型、Map、File、IO流...)
P233 数据结构 栈:数据进入栈模型叫做压栈,数据离开栈模型为弹栈.栈是后进先出的模型. 队列:数据从后端进入队列模型的过程叫做入队列,离开队列的过程叫出队列.队列是先进先出的模型. 数组:查询数组 ...
最新文章
- LaTeX集合运算相关命令
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
- JAVA——保持cookie登录状态的HttpClient封装工具类
- oracle生成字母序号6,创建以字母数字开头的Oracle序列
- 绿地深蓝机器人_人工智能企业深兰科技获绿地控股3亿元战略投资
- Flask-认识flask
- Project Euler 3 Largest prime factor
- C++习题之变量和基本类型
- Centos7+LVS-DR+Apache负载均衡web实验
- eclipse 项目显示红叉
- HBase 教程(超详细)
- OKR案例——不同类型的OKR实例
- 西门子、三菱、台达PLC手机组态软件,支持modbus协议的ModbusTesla手机组态软件 只支持modbus tcp,只要下位机支持标准的modbus协议就可以
- 【通信原理 入坑之路】 —— 深入理解BPSK调制和解调的全过程及其Matlab实现
- 介绍一下Win11单独设置耳机音量的方法
- 读文献、写论文时,有什么好用的软件或网站推荐?
- ISP(六) 空间域图像变换(图像反转、对数变换、幂次变换、分段线性变换、直方图均衡与匹配)
- 五千字说清汽车基础软件及国产现状
- Linux查看服务器SN序列码
- Unity烘焙官方建议
热门文章
- oracle 9i aix 迁移,Oracle 9i 在AIX上的安装 (转)
- 域用户绑定计算机批量设置,Windows 2008 AD域账户与计算机名批量绑定
- mac homebrew装mysql_mac系统homebrew安装mysql
- 执行java脚本_怎么用bat执行java应用程序
- CUDA out of memory. Tried to allocate 392.00 MiB (GPU 0; 10.76 GiB total capacity; 652.77 MiB alread
- 关于Transformer和BERT,在面试中有哪些细节问题?
- 赠书福利 | 首本理论和实战结合的深度学习书籍
- NLP多任务学习:一种层次增长的神经网络结构 | PaperDaily #16
- 08 | 事务到底是隔离的还是不隔离的
- Java8新特性之构造器引用、方法引用