一、啥是I/O

  概念:I/O为输入,输出流的统称,流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。

  本质:本质是数据传输,即数据在两设备间的传输称为流,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

  分类:

根据处理数据类型的不同分为:

  • 字符流【字符流以字符为单位,且只能处理字符类型的数据】
  • 字节流【字节流以字节(8bit)为单位,能处理所有类型的数据(如图片、avi等)】

根据数据流向不同分为:

  • 输入流【只能进行操作】
  • 输出流【只能进行操作】

  结构导图:

二、流类型详解

流转换

  定义:InputStreamReader和OutputStreamWriter是字符和字节的桥梁,也可称之为字符转换流。

  原理:字节流+编码。在读和写的过程中使用指定的charset(字符集),来操作字节与字符之间的转换。

  调优:可以考虑在转换流的外层包装一层缓存流,避免频繁转换调用

对象序列化

  定义:将一个对象写出,或者读取一个对象到程序中。也就是执行了序列化反序列化的操作。

  使用方式:

  • 读:ObjectInputStream.readObject()
  • 写:ObjectOutputStream.writeObject()

  PS:只有实现了 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取,且必须要使用相对应的对象输入输出流才可正常操作对象。

  PS:输出输入的内容在文本编辑器打开是二进制的形式,所以看着像乱码,这是正常的,若只要对象的内容应选用PrintStream。

public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
/*写*/
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\testObjectOutputStream.txt"));//创建对象输出流
String[] arr = {"abc", "bde"};
List<String> list = Arrays.asList(arr);
oos.writeObject(list);
oos.flush();
oos.close(); /*读*/
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\testObjectOutputStream.txt"));
System.out.println((List) ois.readObject());
}
}

写到文件中的内容:

缓冲流

  定义:一种使用内存机制(内存缓冲)来操作流的特殊流

原理:

  • 使用了底层流对象从具体设备上获取数据,并将数据存储到缓冲区的数组内。
  • 通过缓冲区的read()或者方法从缓冲区获取具体的字符数据,这样就提高了效率。
  • 如果用read方法读取字符数据,并存储到另一个容器中,直到读取到了换行符时,将另一个容器临时存储的数据转成字符串返回,就形成了readLine()功能。

  使用方式:通常用作其他流的2次封装,利用内存机制来提高流的读写效率。

基本数据操作

  定义:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型(其他数据类型就不支持了,如要读一个图片那就凉了...)。

/**
* 测试(DataInputStream/DataOutputStream)读写基础java数据类型
*/
public class Test {
public static void main(String args[]) throws IOException {
/*使用桌面文件创建一个输入流*/
DataInputStream in = new DataInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\testObjectOutputStream.txt"));
/*创建一个输出流(PS:这里这个文件并没有存在于桌面上,运行时会自动创建并写入信息)*/
DataOutputStream out = new DataOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\testObjectOutputStream1.txt"));
/*用缓存机制来优化一个可能开销很大的输入流*/
BufferedReader d = new BufferedReader(new InputStreamReader(in)); /*读取输入流内容,并把内容转换为大写,在控制台输出并写入新文件*/
String count;
while ((count = d.readLine()) != null) {
String u = count.toUpperCase();
System.out.println(u);
out.writeBytes(u + " ,");
}
d.close();
out.close();
}
}

打印控制

定义:一种主要用于输出的流

特点:除了保留Ouput流的基础方法,还添加了一组print()/println()方法,且不会抛出异常,方法内部实现已经有try{}catch块。

/**
* 测试打印输出流
*/
public class Test {
public static void main(String args[]) throws IOException {
//构建一个字符输出流(字节输出流同理,不在演示)
Writer w = new FileWriter("C:\\Users\\Administrator\\Desktop\\testObjectOutputStream.txt");
//优化:构建缓冲流
BufferedWriter bw = new BufferedWriter(w);
//构建字符打印流,用于向指定文件输出内容
PrintWriter pw = new PrintWriter(bw);
//println会换行输出,print不会换行
pw.println(true);//写入boolean型
pw.println("测试和写入");//写入字符串
pw.println(123);//写入int类型
//关闭流
pw.close();
bw.close();
w.close();
}
}

文件操作

定义:即专门操作文件的一组流

使用方式:

/**
* 测试文件流
*/
public class Test {
public static void main(String args[]) throws IOException {
/*简单演示常用文件流的构造方法,输出流同理不在描述*/ //使用(绝对/相对)路径的方式构建文件输入流
FileInputStream fileInputStream1 = new FileInputStream("D:\\log.txt");
//使用文件对象构建文件输入流
FileInputStream fileInputStream2 = new FileInputStream(new File("D:\\log.txt"));
}
}

数组操作

  定义:操作字节/字符数组的一组流

  原理:流在内存中创建一个字节数组缓冲区,需要读/写的数据保存在该字节数组缓冲区中。

管道操作

定义:一种可以让多线程通过管道进行线程间的通讯的流,必须结合使用

  管道流的详细讲解可以看这里~,讲解得非常详细,非多线程编程使用的场景较少,可作为了解。

参考资料:

Java基础一篇过(三)I/O流总结的更多相关文章

  1. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

  2. JS基础入门篇(三十五)—面向对象(二)

    如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)

  3. java基础梳理--朝花夕拾(三)

    1.了解面向对象的编程思想以及面向对象的特性: 对象: EveryThing is Object: 万物皆是对象,在程序中,我们可以将类.接口.方法.属性等都认为是对象: 面向对象: 是一种程序设计方 ...

  4. java基础——入门篇

    整体大纲图 1.认识java 核心知识点:JVM.搭建Java开发环境.java的发展史.java特点.java程序类型.垃圾收集器.J2SE下载和安装.环境变量的配置和测试.以及简单的开发工具的使用 ...

  5. Java基础扫盲系列(三)— Java内省技术

    前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...

  6. 【Java基础总结】Java基础语法篇(上)

    Java基础语法 思维导图 一.Java语言介绍 1.Java应用平台 JavaSE(Java Platform Standard Edition):开发普通桌面和商务应用程序,是另外两类的基础 Ja ...

  7. Java基础知识二次学习--第八章 流

    第八章 流   时间:2017年4月28日11:03:07~2017年4月28日11:41:54 章节:08章_01节 视频长度:21:15 内容:IO初步 心得: 所有的流在java.io包里面 定 ...

  8. Java基础知识盘点(三)- 线程篇

    创建线程的方式及实现 一.继承Thread类创建线程类 1.定义Thread的子类,并重写run方法,因为该方法的方法体就是代表了线程要完成的任务,因此run方法又叫做执行体. 2.创建Thread子 ...

  9. Java基础知识学习(三)

    面向对象部分 首先要了解面向对象的思想,与C#一致,都是面向对象的语言 访问修饰符 public 共有的,对所有类可见. protected 受保护的,对同一包内的类和所有子类可见. private ...

随机推荐

  1. 0基础算法基础学算法 第八弹 递归进阶,dfs第一讲

    最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开 ...

  2. play ball小游戏-Alpha版本发布说明

    Alpha版本发布说明 一.功能介绍 本团队所做的微信小程序是一款小球经碰撞后最终到达目的位置通关的休闲益智类游戏.Alpha版本具有的功能大体如下: 1. 闯关模式 多达12关普通竖屏关卡.4关特殊 ...

  3. 个人项目(C语言)

    GitHub地址:https://github.com/dachai9/personal-project.git 1. WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数 ...

  4. 《Head First 设计模式》:外观模式

    正文 一.定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 要点: 外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外 ...

  5. rust 模块组织结构

    rust有自己的规则和约定用来组织模块,比如一个包最多可以有一个库crate,任意多个二进制crate.导入文件夹内的模块的两种约定方式... 知道这些约定,就可以快速了解rust的模块系统. 先把一 ...

  6. guzzle下载图片(laravel+vue)

    先再laravel安装guzzle扩展包:composer require guzzlehttp/guzzle 之后再控制器操作: use GuzzleHttp\Client; //远程api数据的获 ...

  7. LuaProfiler

    Lua Profiler机制的源码解析 https://www.jianshu.com/p/f6606b27e9de

  8. 如何用CMake构建Android C++库

    https://fireflytech.org/2017/11/04/compiling-cc-libraries-for-android/ https://blog.csdn.net/xhp2014 ...

  9. adb 打开手机端口进行无线模式调试

    打开手机端口 让手机在指定的端口可以接收到TCP/IP连接. 确保手机开启了usb调试 用usb线把手机和电脑连接起来 执行命令:adb tcpip 5555 执行成功后就可以把usb线拔掉了,端口可 ...

  10. 在react项目添加看板娘(react-live2d)

    有留意到看板娘这么个东西,简直就是我们程序员+动漫迷的挚爱.但是回观网上,大多只是在老旧的html的静态引入.vue甚至也有几个不怎么维护的,还是老旧的不行的SDK2.X的版本.这这这这!我们的rea ...