java--IO流(详)
IO流也称为输入、输出流,就是用来读写数据的。
一.概述:
1.IO流的作用?
读写文件数据的
2.IO流是怎么划分的,大体分为几类,各自的作用?
- 字节流:字节输入流,字节输出流(读写字节数数据的)
- 字符流:字符输入流,字符输出流(读写字符数据的)
3.意义
- I表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读。
- O表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写。
二.分类
1.按流的方向分:
输入流,输出流;
2.按流中的最小单位分:
字节流:操控所以类型的文件;
字符流:只能操控重文本文件;
3.总结流的四大类:
字节流
字节输入流 字节输出流
InputStream OutputStream
FileInputStream FileOutputStream
字符流
字符输入流 字符输出流
Reader Writer (抽象类)
FileReader FileWriter(实现类,可以使用的)
文件字节输入流:FileInputStream(负责读取数据)
-- 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
按照字节读文件数据到内存中。
-- 构造器:
public FileInputStream(File file):创建字节输入流管道与源文件对象接通
public FileInputStream(String pathname):创建字节输入流管道与源文件路径接通。
-- 方法:
public int read(): 每次读取一个字节返回,读取完毕返回-1。
小结:
一个一个字节读取中文数据输出其实是被淘汰的,性能极差!
一个一个字节读取中文数据输出,会出现截断中文字节的情况,无法避免读取中文输出乱码的问题。
public static void main(String[] args) throws Exception {// 1、创建一个文件字节输入流管道与源文件接通。// InputStream is = new FileInputStream(new File("file-io-app\\src\\data.txt"));// 简化写法InputStream is = new FileInputStream("file-io-app\\src\\data.txt");// 2、读取一个字节返回 (每次读取一滴水)
// int b1 = is.read();
// System.out.println((char)b1);
//
// int b2 = is.read();
// System.out.println((char)b2);
//
// int b3 = is.read();
// System.out.println((char)b3);
//
// int b4 = is.read(); // 读取完毕返回-1
// System.out.println(b4);// 3、使用循环改进// 定义一个变量记录每次读取的字节 a b 3 爱// o o o [ooo]int b;while (( b = is.read() ) != -1){System.out.print((char) b);}}
文件字节输出流: FileOutputStream(可以直接创建文件,并存数据)
-- 作用:以内存为基准,把内存中的数据,按照字节的形式写出到磁盘文件中去。
简单来说,把内存数据按照字节写出到磁盘文件中去。
-- 构造器:
public FileOutputStream(File file):创建一个字节输出流管道通向目标文件对象。
public FileOutputStream(String file):创建一个字节输出流管道通向目标文件路径。
public FileOutputStream(File file , boolean append):创建一个追加数据的字节输出流管道通向目标文件对象。
public FileOutputStream(String file , boolean append):创建一个追加数据的字节输出流管道通向目标文件路径。
-- 方法:
public void write(int a):写一个字节出去 。
public void write(byte[] buffer):写一个字节数组出去。
public void write(byte[] buffer , int pos , int len):写一个字节数组的一部分出去。
参数一,字节数组;参数二:起始字节索引位置,参数三:写多少个字节数出去。
小结:
换行: os.write("\r\n".getBytes()); // 换行
追加数据管道: OutputStream os = new FileOutputStream("day10_demo/out01.txt" , true); // 追加管道!!
public static void main(String[] args) throws Exception {// 1、创建一个文件字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("file-io-app/src/out04.txt" , true); // 追加数据管道
// OutputStream os = new FileOutputStream("file-io-app/src/out04.txt"); // 先清空之前的数据,写新数据进入// 2、写数据出去// a.public void write(int a):写一个字节出去os.write('a');os.write(98);os.write("\r\n".getBytes()); // 换行// os.write('徐'); // [ooo]// b.public void write(byte[] buffer):写一个字节数组出去。byte[] buffer = {'a' , 97, 98, 99};os.write(buffer);os.write("\r\n".getBytes()); // 换行byte[] buffer2 = "我是中国人".getBytes();
// byte[] buffer2 = "我是中国人".getBytes("GBK");os.write(buffer2);os.write("\r\n".getBytes()); // 换行// c. public void write(byte[] buffer , int pos , int len):写一个字节数组的一部分出去。byte[] buffer3 = {'a',97, 98, 99};os.write(buffer3, 0 , 3);os.write("\r\n".getBytes()); // 换行// os.flush(); // 写数据必须,刷新数据 可以继续使用流os.close(); // 释放资源,包含了刷新的!关闭后流不可以使用了}
文件字符输入流:FileReader
-- 作用:以内存为基准,把磁盘文件的数据以字符的形式读入到内存。
简单来说,读取文本文件内容到内存中去。
-- 构造器:
public FileReader(File file):创建一个字符输入流与源文件对象接通。
public FileReader(String filePath):创建一个字符输入流与源文件路径接通。
-- 方法:
public int read(): 读取一个字符的编号返回! 读取完毕返回-1
public int read(char[] buffer):读取一个字符数组,读取多少个字符就返回多少个数量,读取完毕返回-1
小结:
字符流一个一个字符的读取文本内容输出,可以解决中文读取输出乱码的问题。
字符流很适合操作文本文件内容。
但是:一个一个字符的读取文本内容性能较差!!
public static void main(String[] args) throws Exception {// 目标:每次读取一个字符。// 1、创建一个字符输入流管道与源文件接通Reader fr = new FileReader("file-io-app\\src\\data06.txt");// 2、读取一个字符返回,没有可读的字符了返回-1
// int code = fr.read();
// System.out.print((char)code);
//
// int code1 = fr.read();
// System.out.print((char)code1);// 3、使用循环读取字符int code;while ((code = fr.read()) != -1){System.out.print((char) code);}}
文件字符输出流的使用:FileWriter
-- 作用:以内存为基准,把内存中的数据按照字符的形式写出到磁盘文件中去。
简单来说,就是把内存的数据以字符写出到文件中去。
-- 构造器:
public FileWriter(File file):创建一个字符输出流管道通向目标文件对象。
public FileWriter(String filePath):创建一个字符输出流管道通向目标文件路径。
public FileWriter(File file,boolean append):创建一个追加数据的字符输出流管道通向目标文件对象。
public FileWriter(String filePath,boolean append):创建一个追加数据的字符输出流管道通向目标文件路径。
-- 方法:
a.public void write(int c):写一个字符出去
b.public void write(String c)写一个字符串出去:
c.public void write(char[] buffer):写一个字符数组出去
d.public void write(String c ,int pos ,int len):写字符串的一部分出去
e.public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
小结:
字符输出流可以写字符数据出去,总共有5个方法写字符。
覆盖管道:
Writer fw = new FileWriter("Day10Demo/src/dlei03.txt"); // 覆盖数据管道
追加数据管道:
Writer fw = new FileWriter("Day10Demo/src/dlei03.txt",true); // 追加数据管道
换行:
fw.write("\r\n"); // 换行
结论:读写字符文件数据建议使用字符流。复制文件建议使用字节流。
public static void main(String[] args) throws Exception {// 1、创建一个字符输出流管道与目标文件接通// Writer fw = new FileWriter("file-io-app/src/out08.txt"); // 覆盖管道,每次启动都会清空文件之前的数据Writer fw = new FileWriter("file-io-app/src/out08.txt", true); // 覆盖管道,每次启动都会清空文件之前的数据// a.public void write(int c):写一个字符出去fw.write(98);fw.write('a');fw.write('徐'); // 不会出问题了fw.write("\r\n"); // 换行// b.public void write(String c)写一个字符串出去fw.write("abc我是中国人");fw.write("\r\n"); // 换行// c.public void write(char[] buffer):写一个字符数组出去char[] chars = "abc我是中国人".toCharArray();fw.write(chars);fw.write("\r\n"); // 换行// d.public void write(String c ,int pos ,int len):写字符串的一部分出去fw.write("abc我是中国人", 0, 5);fw.write("\r\n"); // 换行// e.public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去fw.write(chars, 3, 5);fw.write("\r\n"); // 换行// fw.flush();// 刷新后流可以继续使用fw.close(); // 关闭包含刷线,关闭后流不能使用}
三.编码和解码
我们正常写一个字节流输出“abc”还好,但是我们输出我们中国的文化瑰宝,汉字的时候为何会变成不知名的字符:
String s="中国";byte[] by=s.getBytes(StandardCharsets.UTF_8);byte[] by1=s.getBytes("GBK");System.out.println(Arrays.toString(by));System.out.println(Arrays.toString(by1));
这个时候我们就需要到了编码和解码
GBXXX字符集:
Unicode字符集:
我们通常使用的是GBK和UTF-8;
第一种:直接型
编码
●byte[] getBytes0:使用平台的默认字符集将该String编码为-系列字节, 将结果存储到新的字节数组中
●byte[] getBytes(String charsetName):使用指定的字符集将该String编码为-系列字节,将结果存储到新的字节数组中
解码
●String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
●String(bytel[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
第二种:字符流
字符输入转换流InputStreamReader
-- 作用:可以解决字符流读取不同编码乱码的问题。
也可以把原始的字节流按照指定编码转换成字符输入流
-- 构造器:
public InputStreamReader(InputStream is):可以使用当前代码默认编码转换成字符流,几乎不用!
public InputStreamReader(InputStream is,String charset):可以指定编码把字节流转换成字符流(核心)
小结:
字符输入转换流InputStreamReader:作用:可以解决字符流读取不同编码乱码的问题。
public InputStreamReader(InputStream is,String charset):可以指定编码把字节流转换成字符流(核心)
字符输出转换流:OutputStreamWriter
-- 作用:可以指定编码把字节输出流转换成字符输出流。
可以指定写出去的字符的编码。
-- 构造器:
public OutputStreamWriter(OutputStream os) : 用当前默认编码UTF-8把字节输出流转换成字符输出流
public OutputStreamWriter(OutputStream os , String charset):指定编码把字节输出流转换成字符输出流
小结:
字符输出转换流OutputStreamWriter可以指定编码把字节输出流转换成字符输出流。
从而实现指定写出去的字符编码!
四.缓冲流
1.概述
缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。
作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
2.缓冲流的作用:
缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
3.缓冲流种类:
字节缓冲流 字节缓冲输入流: BufferedInputStream
字节缓冲输出流:BufferedOutputStream
字符缓冲流 字符缓冲输入流:BufferedReader
字符缓冲输出流:BufferedWriter
4.字节缓冲流:
(1).字节缓冲流性能优化原理:
字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。
字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。
(2).缓冲输入,输出流
字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能,读写功能上并无变化。
字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能,读写功能上并无变化。
构造器 |
说明 |
public BufferedInputStream (InputStream is) |
可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道, 从而提高字节输入流读数据的性能 |
public BufferedOutputStream(OutputStream os) |
可以把低级的字节输出流包装成一个高级的缓冲字节输出流, 从而提高写数据的性能 |
5.字符缓冲输入流
(1)字符缓冲输入流:BufferedReader。
作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。
构造器 |
说明 |
public BufferedReader(Reader r) |
可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道, 从而提高字符输入流读数据的性能 |
字符缓冲输入流新增功能:
方法 |
说明 |
public String readLine() |
读取一行数据返回,如果读取没有完毕,无行可读返回null |
(2)字符缓冲流算解答:
字符缓冲流为什么提高了操作数据的性能?
字符缓冲流自带8K缓冲区 可以提高原始字符流读写数据的性能
字符缓冲流的功能如何使用?
public BufferedReader(Reader r) 性能提升了,多了readLine()按照行读取的功能(一次读取一行数据)
public BufferedWriter(Writer w) 性能提升了,多了newLine()换行的功能
java--IO流(详)相关推荐
- java io流详解_一文带你看懂JAVA IO流,史上最全面的IO教学啦
一.IO流是什么 惯例引用百科的回答流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...
- java IO流详解及特性
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- zipfile中怎么关闭流_深入学习JAVA -IO流详解
(一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相 ...
- Java IO流 详解(字节流、字符流、输入流、输出流、刷新)
一.IO流概述 I:Input输入 从其他存储设备[读]数据到内存中 输入过程 O:OutPut输出 从内存中[写]数据到其他存储设备 输出过程 二.IO流分类 1.根据数据的 ...
- JAVA—IO流详解
1. 流概述 1.1. 什么是IO IO:Input/Output即输入&输出,也称之为流(河流,水流),指的是数据从一个地点到另一个地点过程:对于计算机来说文件的拷贝过程,文件的编写保存,显 ...
- java byte char io流_一文带你看懂JAVA IO流,史上最全面的IO教学
原标题:一文带你看懂JAVA IO流,史上最全面的IO教学 一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符 ...
- javaio流_一文带你看懂JAVA IO流,史上最全面的IO教学啦
一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操 ...
- 一文带你看懂JAVA IO流(一),史上最全面的IO教学啦(附送JAVA IO脑图)
一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操 ...
- 一文带你看懂JAVA IO流,史上最全面的IO教学啦(附送JAVA IO脑图
一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操 ...
- java IO流进阶 模拟上传头像系统详解
目录 一.前言: 二.思路: PS:直接看代码中的注释也可以. ①分析: ②总结: 三.代码: ①准备工作: ②代码演示: ③运行效果: 四.撒❀: 一.前言: 这篇文章是对之前java IO流基础 ...
最新文章
- cygwin中写c语言程序,在windows下怎么利用Cygwin进行编程
- ThinkPHP5整合LayUI编辑器图片上传
- ByteBuf和相关辅助类
- Win7系统分区(C盘)扩容的一种可行的解决方案
- ehcache config xml file
- VC++ CryptoAPI最基本编程
- 使用tracert命令查看某一个网站的ip地址
- mysql bench建立一张表_使用MySQL Workbench建立数据库,建立新的表,向表中添加数据...
- 基本java,jquery异步 的级联下拉列表
- (转载)VS2010/MFC编程入门之四(MFC应用程序框架分析)
- Linux线程池的设计
- B. Code For 1 一个类似于线段树的东西
- 什么是BSP工程师?
- js年会抽奖_嘿!这真的是一个正经的抽奖程序!
- BioPython-1
- WM_QUERYENDSESSION与WM_ENDSESSION
- 设计mysql存储过程,MySQL的存储过程设计的例子
- Linux之动态网页——搭建博客
- 百望系统网络配置服务器地址,各省百旺参数设置服务器地址
- html 毛笔书写效果,利用canvas实现毛笔字帖(三)
热门文章
- python学习笔记011——内置函数__module__、__name__
- instanceOf,isInstance,Class,isAssignableFrom区别比较
- Andraoid 状态栏透明的方法
- 【iOS10 SpeechRecognition】语音识别 现说现译的最佳实践
- 解决目录和tgz文件等不显示相应颜色
- [原创]windows server 2012 AD架构 试验 系列 – 3 创建备份DC2
- python mysql 驱动安装
- HTTP测试、常用编解码转换工具
- 利用or构造SQL巧妙注射
- rsync单项同步文件