一、认识IO流

I/O就是用于设备之间进行数据交互的对象所属的类型
IO流的体系结构:根据分类,有四种流对象类型
字节流:可以直接操作字节信息的流对象
字节输入流:InputStream
字节输出流:OutputStream
字符流:
字符输入流:Reader
字符输出流:Writer

二、字节流

InputeStream

1、字节输入流的顶层父类
2、常用方法:
int read() :
从当前的字节输入流中,读取并返回一个字节,返回-1表示未读取到。
int read(byte[] arr):
将最多arr.length个字节,读取到arr数组中返回读取的字节个数,-1表示未读取到
int available()
返回流中剩余可以读取的字节个数
void close() 关闭流对象
3、InputStream是一个抽象类,不能直接创建对象,只能由子类创建对象

FileInputStream

1、InputSteam的一个具体子类,用于和磁盘上的文件进行交互
2、FileInputStream,不仅一次可以读取一个字节,也可以一次读取多个字节,也可以读取图片,音乐,视频,等一些非纯文本文件。
3、构造方法:
FileInputStream(String Path):将字符串(文件路径)封装成字节输入流,不能是一个目录
FileInputStream(File f):将file对象封装成字节输入流
注意:无论是哪个构造方法,都只能封装的是文件的路径,封装文件夹路径是没有任何意义的,文件夹本身没有任何数据 的,如果指定文件不存在,或者它是一个目录,而不是一个常规文件,否则抛出 FileNotFoundException

OutputStream

1、字节输出流的顶层抽象父类
2、常用方法:
void write(int b);将一个字节信息写出到指定的设备中
void write(byte[] arr):将一个字节数组所有信息,写出到指定的设备中
void write(byte[] arr,int offset,int len);将一个字节数组的部分信息,写出到指定的设备中
将数组arr中从索引offset开始,总字节数为len个字节信息写出到指定设备中
void close();
3、抽象类

FileOutputStream

1、可以将字节数据写出到指定设备中
2、构造方法
FileOutputStream(File f):将f描述的文件路径封装成一个字节输出流对象
FileOutputStream(String name):将抽象路径字符串name封装成一个字节输出流对象
使用字节输出流的时候,写出数据,写入到指定的设备中
3、注意:
使用流写出到磁盘上,存储的数字,既没有编码,也没有解码,如果使用编辑器打开这些文件的时候,编辑器,读取数据,根据编码表,进行解码,看到就是解码后的内容

package com.DaYu;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;public class Demo01 {public static void main(String[] args) throws IOException {//      构造方法FileInputStream fis = new FileInputStream("a.txt");//        File f = new File("a.txt");
//      FileInputStream fis1 = new FileInputStream(f);FileOutputStream fos = new FileOutputStream("b.txt");
//
//      File f = new File("c.txt");
//      FileOutputStream fos1 = new FileOutputStream(f);//     read(byte[] arr)方法byte[] bytes = new byte[3];int len = fis.read(bytes);System.out.println(Arrays.toString(bytes));System.out.println(len);System.out.println(fis.available());int i = 0;
//      read()方法while((i = fis.read())!=-1) {System.out.println(i);}//        write()方法       fos.write(98);// 写一个字节byte[] bytes1 = { 99, 100, 101, 102, 103 };fos.write(bytes);fos.write(bytes1, 1, 4);
//      关闭资源fis.close();fos.close();    }
}

文件拷贝(复制)

1、含义:
将一个文件中的数据,拷贝到指定的文件中
2、本质上就是将原文件中的信息,读取到内存中,将内存中的数据,写出到指定的位置(文件)

public static void main(String[] args) throws IOException {//      创建字节输入流对象FileInputStream fis = new FileInputStream("a.txt");
//      创建字节输出流对象FileOutputStream fos = new FileOutputStream("b.txt");//     使用字节输入流,读取磁盘中文件的数据int i;
//      使用while循环读取文件中的每一个字节while ((i = fis.read()) != -1) {//          将读到的字节信息,通过字节输出流,写出到指定的文件中fos.write(i);}
//      关闭流fis.close();fos.close();
}

文件拷贝效率的提升

利用read(byte[] arr)和write(byte[] bytes)创建数组进行读写,数组的大小是可以进行任意的选择,数组越大,拷贝的次数少,效率高,一般情况,数组的大小使用1024的整数倍。

 public static void many2many_2() throws IOException {//      创建字节输入流对象FileInputStream fis = new FileInputStream("a.txt");
//      创建字节输出流对象FileOutputStream fos = new FileOutputStream("b.txt");//     创建一个数组byte[] arr = new byte[100];int len;while ((len = fis.read(arr)) != -1) {//          将读到的数据写出到指定文件中fos.write(arr,0,len);}
//      关闭流fis.close();fos.close();}

高效缓冲流

1、BufferedInputStream和BufferedOutputStream
2、高效缓冲流对FileInputStream,FileOutputStream进行加强,底层创建一个数组(容量为8192个字节)进行缓冲,不需要频繁访问磁盘,提高了效率。
3、构造方法
BufferedInputStream(InputStream in) :将指定的具体的输入流对象传入到构造方法中,形成了一个带有缓冲区的高效流
BufferedOutputStream(OutputStream os):将指定的具体的字节输出流对象传入到构造方法中,形成了一个带有缓冲区的高效输出流

public class Demo02 {//高效缓冲流使用的注意事项public static void main(String[] args) throws Exception {FileInputStream fis = new FileInputStream("a.txt");
//      高效输入流对象BufferedInputStream bis = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream("aaBuff.txt");
//      高效的输出流对象BufferedOutputStream bos = new BufferedOutputStream(fos);int i ;while((i = bis.read()) != -1) {bos.write(i);}
//       使用缓冲流要注意关流bis.close();bos.close();}
}

输出流中的close方法和flush方法

1、close方法会先调用flush()
2、close方法用于流对象的关闭,一旦调用了close方法,那么这个流对象就不能再使用了
3、flush只是将缓冲区中的数据刷新到指定文件中,而不会将流对象关闭,可以继续使用流对象
如果flush这个方法使用的过于频繁,就丧失了缓冲区的作用

三、字符流

1、抽象父类Reader Writer
2、Reader:
read():读取一个字符,返回值如果是-1,表示到文件的末尾
read(char[] chs):将一堆字符读入到指定的chs字符数组中
Writer:
writer(int c): 写出一个字符
writer(char[] chs):写出一个字符数组
writer(char[] chs,int offset,int len):将字符数组的一部分写出到指定的文件中
writer(String str):将一个字符串写出到指定文件中
3、对于抽象类而言,也是不能直接创建对象的,需要使用具体的类型来进行创建
FileReader,FileWriter

public class Demo03 {public static void main(String[] args) throws Exception {FileReader fr = new FileReader("F:/test/b.txt");char[] chs = new char[3];int len = fr.read(chs);System.out.println(chs);FileWriter fw = new FileWriter("F:/test/c.txt");char[] chs1 = { 's', 'o', 's' };fw.write(30000);fw.write(chs1);fw.write(chs1, 0, 2);fw.write("中文");fr.close();fw.close();}
}

字符流的小数组拷贝

1、使用FileReader read(byte[] arr)方法将多个字符读入到数组中,返回的值表示的是有效字符的个数,如果返回-1 表示读取到了文件的末尾
2、使用FileWriter中的write(byte[] arr)(使用该方法进行拷贝,会出现最后一次的数组中会遗留上一次的字符)和write(byte[] arr,int offset,int len),将读到的字符写出到指定的位置
3、说明:
FileWriter中也是带有一个缓冲区的,大小8192
要记得关流

public static void main(String[] args) throws IOException {//      字符小数组进行拷贝FileReader fr = new FileReader("a.txt");FileWriter fw = new FileWriter("acopy.txt");
//      创建一个字符数组char[] chs = new char[4];int len;while ((len = fr.read(chs)) != -1) {//           将读到的字符写出到指定文件中fw.write(chs,0,len);}
//      不要忘记关流fr.close();fw.close();}

使用字符流进行拷贝的注意点

1、没有必要使用字符流来进行拷贝,因为字符流会先将字节信息转成字符,读取到内存中,最后还要将这些字符信息转成字节信息,写出到另一个文件中去,中间做了两次没有意义的操作,浪费时间。
2、如果在读到字符之后,需要人为的阅读和修改这个字符,那么就需要使用字符流。
3、字符流只能拷贝纯文本文件,不能操作非纯文本文件。

高效的缓冲字符流

1、riteBufferedReader:
readLine();可以从输入流中,一次读取一行数据,返回一个字符串,如果到达文件末尾,则返回null
2、BufferedWriter:
newLine();换行,在不同的操作系统中,换行符各不相同,newLine()方法就是可以给我们根据操作系统的不同,提供不同的换行符

public static void main(String[] args) throws IOException {//      创建字符输入流FileReader fr = new FileReader("a.txt");
//      创建字符输出流FileWriter fw = new FileWriter("aac.txt");//      进行包装BufferedReader br = new BufferedReader(fr);BufferedWriter bw = new BufferedWriter(fw);String str;while ((str = br.readLine()) != null) {bw.write(str);bw.newLine();}br.close();bw.close();}

四、转换流

1、OutputStreamWriter:是字符流通向字节流的桥梁,可以指定编码形式
构造方法:OutputStreamWriter(OutputStream out, String charsetName)
创建一个转换流的对象,可以把将来方法中接收到的字符串,通过指定的编码charsetName,编码成字节信息,再通过字节流,进行写出
使用:直接使用writer中的方法即可
2、InputStreamReader:字节流到字符流的桥梁,可以指定编码格式
构造方法:InputStreamReader(InputStream in, String charsetName)
创建一个转换流对象,可以使用in这个字节输入流从磁盘中读取字节信息,通过指定的编码格式,将字节信息转成相对 应的字符,返回给调用者
使用:直接使用Reader中的方法即可
3、说明;
无论是读取的时候还是写出的时候,都要参考读取文件和写出文件的编码形式
读取源文件时,解码的形式必须和源文件的编码形式一致
写出到目标源文件时,编码形式必须和目标文件的编码形式一致

public static void main(String[] args) throws IOException {//      子节流到字符流的桥梁InputStream fis = new FileInputStream("b.txt");
//      能够按照指定的编码  格式去读取相应的字节数InputStreamReader isr = new InputStreamReader(fis, "utf-8");FileWriter fw = new FileWriter("isr.txt");int i;while ((i = isr.read()) != -1) {fw.write(i);}fis.close();fw.close();}private static void OutputStreamWriters() throws FileNotFoundException, UnsupportedEncodingException, IOException {// 从一个文件中获取字符信息使用字符流FileReader fr = new FileReader("a.txt");// 创建一个字符流到字节流的对象(转换流)OutputStream os = new FileOutputStream("b.txt");OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");int i;while ((i = fr.read()) != -1) {osw.write(i);}fr.close();osw.close();
}

Java基础---认识IO流---字节流、字符流---缓冲流---转换流相关推荐

  1. 【Java基础】· IO流习题详解

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  2. Java基础学习—— IO流

    Java基础学习-- IO流 1 文件 1.1 文件的创建 1.2 文件常用的方法 2 IO流 2.1 FileInputStream 2.2 FileOutputStream 2.3 文件的拷贝 2 ...

  3. Java学习笔记(7)——Java基础之IO多线程网络思维导图

    Java面向对象学习笔记之:包括IO(字节流,字符流,节点流,处理流).线程(线程创建,线程控制,线程同步).网络(TCP Scoket,  UDP Scoket)(全屏观看Java学习笔记(7)-- ...

  4. Java基础之IO模型

    Java基础之IO模型 I/O 常见的IO模型 Java中3种常见的IO模型 BIO(Blocking I/O) NIO(Non-blocking/New I/O) AIO(Asynchronous ...

  5. java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类

    目录 1.概念 2.常用的文件操作 2.1 创建文件 2.2 获取文件相关信息 2.3 目录的操作和文件删除 3. IO流原理及流的分类 3.1 流的分类 4.InputStream 字节输入流 4. ...

  6. java io流过滤流_JAVA io流 文件流 字节流 字符流 过滤流 缓冲流

    一.概念 1.1.按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 1.2.按数据传输单位分类: 字节流:以字节(8位二进制)为单位进行处理.主要用于读写诸如图 ...

  7. Java基础(17)——字节流、字符流

    目录 第一章 IO概述 1.1 什么是IO 1.2 IO的分类 1.3 IO的流向说明图解 1.4 顶级父类们 第二章 字节流 2.1 一切皆为字节 2.2 字节输出流[OutputStream] 2 ...

  8. Java基础之IO流

    IO流用来处理设备间数据传输,java对数据的操作是通过流的方式,而这些操作流的对象被封装在IO包中.流可以分为字符流和字节流.字符流可以设置编码方式,这就使得处理文本更加方便. IO常用基类 字节流 ...

  9. Java基础知识——IO流

    简介 IO是指Input/Output,即输入和输出.以内存为中心: Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等 Output指把数据从内存输出到外部,例 ...

最新文章

  1. 邮箱数据库营销的概念及其特点介绍
  2. 安装centos 6.7
  3. 远程服务器如何创建分支,git如何远程创建分支
  4. 小程序开发(6)-之自定义导航栏
  5. HDOJ 1036 Average is not Fast Enough!
  6. 连接mysql超过连接次数处理办法
  7. 整数划分之四 【区间dp】讲解于思考方法
  8. 基于摄像头循迹的电子设计竞赛论文
  9. 一、显示VOC2007数据集中的图像及标注信息
  10. SStap 测试UDP转发...未通过!
  11. Git克隆、拉取最新代码、上传代码到远程仓库
  12. 一元二次方程的简单解法
  13. 读博后降维打击数学建模!
  14. DACAI串口屏使用
  15. 01-JAVA基础—>赏金任务—>三色球问题
  16. Pytorch房价预测
  17. Android8.1.0安装Xposed框架
  18. SAX错误–序言中不允许包含内容
  19. ES6 计算属性名快速上手
  20. WDM 驱动程序开发

热门文章

  1. monodevelp注释显示中文
  2. Problem E: 成绩排序
  3. java string常用的占位符形式
  4. php 二维数组按照某value值求出最大值最小值
  5. 北上深 | 商汤招聘智能视频和数字人算法研究员(全职/实习)
  6. 智能文档分析:NLP和OCR的融合技术
  7. 深度学习可解释性!深度taylor分解
  8. 小米3Android密码怎么解吗,小米路由器3管理密码忘记了怎么办?
  9. 搞定python不就那么点事吗?
  10. 收藏 | 使用Pytorch从头实现Canny边缘检测