文章目录

  • 1、io的基本概念
  • 2、io流的分类
  • 3、Java中常用的IO类
    • 3.1四个抽象类
    • 3.2输入操作
    • 3.3输出操作
    • 3.4缓存流的使用

1、io的基本概念

I/O操作指的是进行输入、输出的操作,输入/输出操作都是基于数据流的,这些数据流表示了字节或字符流动的序列。Java中的I/O流提供了读写数据的标准方法,任何表示数据源的对象都会以数据流的方式读写它的数据方法。

java把用于操作输入/输出的类放在java.io包中。

2、io流的分类

按照流的方向分,可以分为输入流和输出流

  • 输入流:从外部读入数据到内存,外部可以是磁盘、网络等。
  • 输出流:将数据从内存写出到外部。

NOTE:我们这里的输入/输出可以从程序运行所在内存的角度来看,输入/输出的方向是单向的。

按照数据流的类性,可以分为字节流和字符流

字节流和字符流的不同之处在于操作数据单元的大小不同,字节流操作的数据单元是8位的字节,字符流操作的数据单元是16位的字符。

按处理流的方式,可以分为节点流和处理流。

  • 节点流:也可被称为低级流,它和数据源直接对接
  • 高级流:建立在低级流的基础上,对已存在的流进行连接和封装,通过封装后的流实现数据的读写功能。

3、Java中常用的IO类

接下来我们按照输入/输出流的方式讲解

3.1四个抽象类

InputStrem 字节为单位的输入流
OutputStream 字节为单位的输出流
Reader 字符为单位的输入流
Writer 字符为单位的输出流


这四个抽象类是所有输入/输出流的基类,它们中定义的方法用于操作数据流的传输

  • InputStream和Reader

read():从输入流中读取单个字节/字符,并返回读取的字节/字符数据

read(byte/char b[]):从输入流中最多读取b.length个字节/字符,将其存储在数组b中,并返回读取的字节/字符数据

read(byte/char b[], int off, int len):从输入流中最多读取len字节/字符,将其存储在数组b中,并返回读取的字节/字符数据,读取字节/字符的起点从off开始

以InputStream为例,具体代码如下

/**
*从输入流中读取单个字节,并返回读取的字节数据
*/
public abstract int read();
/**
*从输入流中最多读取b.length个字节,将其存储在数组b中,并返回读取的字节数据
*/
public int read(byte b[]) throws IOException {return read(b, 0, b.length);}
/**
*从输入流中最多读取len字节,将其存储在数组b中,并返回读取的字节数据,读取字节的起点从off开始
*/public int read(byte b[], int off, int len) throws IOException {if (b == null) {throw new NullPointerException();} else if (off < 0 || len < 0 || len > b.length - off) {throw new IndexOutOfBoundsException();} else if (len == 0) {return 0;}int c = read();if (c == -1) {return -1;}b[off] = (byte)c;int i = 1;try {for (; i < len ; i++) {c = read();if (c == -1) {break;}b[off + i] = (byte)c;}} catch (IOException ee) {}return i;}

Reader内的方法和InputStream内的方法类似,只是将byte换成了char

  • OutputStream和Writer

write(int b):将指定的字节/字符输出到输出流中

write(byte/char b[]):将字节/字符数组中的数据输出到输出流中

write(byte/char b[], int off, int len):将起始点为off,长度为len的字节/字符数组中的数据输出到输出流中。

以OutPutStream为例

 public abstract void write(int b);public void write(byte b[]) throws IOException {write(b, 0, b.length);}public void write(byte b[], int off, int len) throws IOException {if (b == null) {throw new NullPointerException();} else if ((off < 0) || (off > b.length) || (len < 0) ||((off + len) > b.length) || ((off + len) < 0)) {throw new IndexOutOfBoundsException();} else if (len == 0) {return;}for (int i = 0 ; i < len ; i++) {write(b[off + i]);}}

3.2输入操作

FileInputStream 文件输入流,用于从文件系统中获得输入字节
FileReader 对文件的读取,获取字符流

以FileInputStream为例,FileReader的实现和FileInputStream相同,只是操作单位不同

public class testInput {public static void main(String[] args) throws Exception{FileInputStream fis=null;try {//创建字节输入流fis=new FileInputStream("F:\\学习笔记\\Simon学习笔记\\java\\test.txt");//创建一个长度为1024的byte数组byte[] b=new byte[1024];//用于保存的实际字节数int count=0;//重复读取,直到去完为止while ((count=fis.read(b))>0){//转成字符串进行输出System.out.println(new String(b,0,count));}}catch (IOException e){e.printStackTrace();}finally {fis.close();}}
}

Note:字节读取结束的条件是方法read方法返回了-1;所以我们可以用(count=fis.read(b))>0进行判断,

因为IO不属于内存资源,需要手动关闭。但是java7引入了try(resource)的语法,只需要编写try语句,就可以让编译器自动的为我们关闭资源

所以代码可以改写为

try( fis=new FileInputStream("F:\\学习笔记\\Simon学习笔记\\java\\test.txt")) {      //创建一个长度为1024的byte数组byte[] b=new byte[1024];//用于保存的实际字节数int count=0;//重复读取,直到去完为止while ((count=fis.read(b))>0){//转成字符串进行输出System.out.println(new String(b,0,count));}//编译器在此自动为我们写入finally并调用close

3.3输出操作

FileOutputStream 文件输出流,用于将数据写入File的输出流,字节流
FileWriter 用于对文件的写入操作,字符流

以FileOutputStream为例,同理,FileWriter也是一样,只是操作单位不一样。

public class testOutPut {public static void main(String[] args) throws IOException {FileInputStream fis=null;FileOutputStream fos=null;try {//创建字节输入流fis=new FileInputStream("F:\\学习笔记\\Simon学习笔记\\java\\test.txt");//创建字符fos=new FileOutputStream("F:\\学习笔记\\Simon学习笔记\\java\\test2.txt");byte[] b=new byte[1024];int count=0;while((count=fis.read(b))>0){fos.write(b,0,count);}}catch (IOException e){e.printStackTrace();}finally {fis.close();fos.close();}}
}

3.4缓存流的使用

为什么需要缓存流:

一块缓存区可以理解为块操作,如今处理器支持按照块来读取数据,这会使得读取次数变少,进而提高性能。

BufferedInputStream 为输入流提供缓冲功能
BufferedOutputStream 输出流提供缓冲功能
BufferedReader 输入流提供缓冲功能
BufferedWriter 输出流提供缓冲功能
public class testBuffer {public static void main(String[] args)throws IOException {FileInputStream fis=null;FileOutputStream fos=null;BufferedInputStream bis=null;BufferedOutputStream bos=null;try {//创建字节输入流fis=new FileInputStream("F:\\学习笔记\\Simon学习笔记\\java\\test.txt");//创建字节输出流fos=new FileOutputStream("F:\\学习笔记\\Simon学习笔记\\java\\test3.txt");//创建字节缓存输入流bis=new BufferedInputStream(fis);//创建字节缓存输出流bos=new BufferedOutputStream(fos);byte[] b=new byte[1024];int count=0;//循环从缓存流中读取数据while((count=bis.read(b))>0){//向缓存流中写入数据,读取多少写入多少bos.write(b,0,count);}}catch (IOException e){e.printStackTrace();}finally {bis.close();bos.close();}}
}

关注公众号:10分钟编程,回复success,赠送你尚硅谷,黑马的Java和大数据视频。

IO编程,真的很简单相关推荐

  1. 指纹、面部、语音识别技术,破解真的很简单!| 知乎

    原标题:指纹.面部.语音识别技术,破解真的很简单!| 知乎 面部识别被今年央视315晚会狠狠地 打脸,这一技术并没有成熟到能令人 们放心使用的地步,但已经被普遍采 用到各种智能终端上,智能手机便是 其 ...

  2. 做饭真的很简单!做饭扫盲贴!

    http://bbs.mosh.cn/889225.html   <上一页 12下一页>   第1页第2页 评分 Is meng 威望值 530/800 发表 23 回复 345 积分 1 ...

  3. p20华为云电脑白屏_教你一招让华为P20秒变电脑,真的很简单!

    教你一招让华为P20秒变电脑,真的很简单! 2018年05月30日 17:45作者:鸿雁编辑:鸿雁 分享 华为P20/P20 pro发布至今已经两个多月,因为有着AI加持带来了更出色的拍照性能和更流畅 ...

  4. 苹果系统虚拟计算机win7,Mac虚拟机安装Win7 64位系统教程_苹果虚拟机安装Win7真的很简单...

    使用苹果笔记本的朋友一开始都是MAC原装系统,当然对于要玩游戏和工作的朋友来说Mac肯定不行,不管是工作需要还是测试在苹果电脑上安装Win7系统都是必要的,除了安装双系统之外,Mac虚拟机安装Win7 ...

  5. 单片机编程软件很简单(八),Keil单片机编程软件辅助功能讲解

    单片机编程软件的应用很多,在单片机编程软件的帮助下,我们对单片机的控制才变得如此简单.在市场上流通的单片机编程软件中,小编最为喜爱Keil单片机编程软件.在本文中,小编将为大家介绍Keil单片机编程软 ...

  6. 单片机编程软件很简单(17),Keil单片机编程软件之编译、链接

    单片机编程软件使用较多,诸多朋友大学期间便接触单片机编程软件.因此,大家对于单片机编程软件或多或少有所了解.本文中,将对Keil单片机编程软件加以介绍,主要在于介绍如何在这款单片机编程软件中进行项目设 ...

  7. 单片机编程软件很简单(23),keil单片机编程软件调试stm32

    单片机编程软件的使用意义较强,不论是工作还是学习,单片机编程软件都是常被使用的软件之一.本文对于单片机编程软件的介绍将基于如何采用keil单片机编程软件调试stm32,如果你对单片机编程软件抑或本文内 ...

  8. 单片机编程软件很简单(二),keil单片机编程软件心得秘笈

    单片机编程软件为常用软件之一,单片机开发人员均用过多款单片机编程软件.那么,用单片机编程软件进行开发时,大家是否有独特新得呢?本文对单片机编程软件的讲解基于Keil C51,主要为大家介绍使用这款单片 ...

  9. 单片机编程软件很简单(22),keil单片机编程软件优化等级+概念解析

    单片机编程软件是单片机使用过程中不可缺少的一环,因此对于单片机编程软件,相关人员应当具备一定了解.往期文章中,小编对单片机编程软件有过诸多介绍.本文对于单片机编程软件的介绍基于两点:1.keil单片机 ...

  10. 单片机编程软件很简单(五),keil单片机编程软件变量用法(下)

    对于单片机编程软件,想必大家均有所了解.针对单片机编程软件,小编曾对keil.IAR予以介绍.本文对于单片机编程软件的讲解,同样基于keil.本文中,将介绍keil单片机编程软件变量用法下篇.如果你对 ...

最新文章

  1. 线段树 ---- CF1004F Sonya and Bitwise OR(线段树上分治合并区间信息 + or 前缀和的log性质)
  2. vin端口是什么意思_端口有无开启
  3. 阿里 P8 聊分布式事务最终一致性的 6 种解决方案
  4. html调用接口_搜狗ocr识别接口
  5. 推荐算法---FM,协同过滤
  6. Spring Boot与RESTful API
  7. 号称“绝对安全”的量子通信到底是什么?
  8. 复杂系统建模计算机仿真是干嘛的,复杂系统建模和 与仿真.ppt
  9. 极速办公(word)如何文字居中
  10. c语言课后练习题第四章
  11. UCF101视频分类之CNN-LSTM-Code总结
  12. python PNG图片显示
  13. 校园网站毕业设计,学校网站毕业设计论文模板案例,校园网毕业设计
  14. JS手写实现call、apply、bind
  15. 【UVM基础】3、核心基类和机制
  16. csv_to_xlsx_pd
  17. 替换word中手动换行(软回车)为段落标记(硬回车)
  18. 非洲网民十分崇拜中国黑客,还表示只有他才能拯救非洲互联网
  19. QPSO Algorithm
  20. 笔记本出厂预装Win8改装Win7的操作步骤及常见问题

热门文章

  1. linux系统离线安装miniconda3 及创建python环境
  2. 前端模块化、组件化开发
  3. 华为新旗舰鸿蒙,华为新旗舰6月即将登场!鸿蒙系统+液态镜头,比Mate40更难购买...
  4. 那两年炼就的Android内功修养
  5. 【云栖大会】马云口中创造未来的年轻人,把数据+环保玩出了新花样
  6. sudo,,sudo-i ,,su的区别
  7. GHOST的口诀:备份122、还原123
  8. Gem Port和T-CONT实现业务复用
  9. 你的简历能帮你争取到面试机会吗
  10. 58到家数据库30条军规解读