IO流

流的分类

  • 按操作数据不同,分为字节流和字符流。
  • 按数据流的流向分为输出流和输入流。
  • 按流的角色分为节点流和包装流。

抽象基类 字节流 字符流 输入流 InputStreanm Reader 输出流 OutputStreanm Writer

Java中跟io有关的类非常多,但是类的命名非常规则,所有的派生子类都是以上述四个基类作为后缀名来命名的。

文件流

FileInputStream 用于从文件中按字节读取,一般针对视频,音频,图像等文件进行读取,使用read()方法,返回类型是int,如果读到文件末尾则放回-1。

read() //读取一个字节数据
read(Byte b[]) //最多读取b.length个字节数据
read(Byte b[], int off, int len) //最多读取len个字节数据到数组的off偏移位置

有时我们按照字节读取数据输出到控制台, 当最后一次读取时,字节数组不会被全部覆盖,如果这时候直接用字节数组初始化一个字符串输出,那么 输出的内容会和期望的不一致,所以采用读取多长就输出多长的方式。

while((readLen = stream.read(data)) != -1) {
    System.out.print(new String(data, 0, readlen));
}

write()方法和前面的read()参数一致,同时也要注意一个问题,按照读取的长度来向文件写入数据。字符串转字节数组使用getBytes()方法

注意:当完成数据的读写时,一定要关闭流,释放资源

FileReaderInputStramReader(转换流) 的子类用于按字符读取文件内容,一般用于文本文件的处理。同样也使用read()方法读取。FileReader内没有read()方法,而是在父类中定义的。

read();//读取一个字符
read(char[] cbuf);//读取cbuf.length长度的字符
readn(char[] cbuf, int offset, int length)//从offset偏移的位置开始读取最多length长度的字符到数组中

可以将字符数组转为字符串类型

new String(char[]);
new String(char[], int, int);

FileWriterInputStramWriter(转换流) 的子类用于按字符写入文件,FileWriter内也没有write()方法,而是在父类中定义的。

new FileReader(filepath, true);//追加写
new FileWriter(filepath);//覆盖写
write(int);//写入一个字符
write(char[])
write(char[], int, int)
write(String);//写入字符串
write(String, int, int);//写入字符串的指定长度

注意:必须关闭流或者调用flush()方法才能将数据真正写入文件中

节点流和处理流

节点流指从特定的数据来源中读取数据,比如上述的四个文件流,还有访问管道和数组的流等,处理流也称为包装流,它连接一个节点流或者处理流来提供更强大的读写功能。

BufferedReader内有一个 Reader in,可以通过构造器用一个任意的Reader来初始化。

BufferedReader bf = new BufferedReader(new FileReader(filePath)) // 关联一个文件流

BufferdReader提供readLine()按行读取可以方便的读取文件内容。

同理在BufferedWriter中也有一个 Writer out。

BufferedWriter bf = new BufferedWriter(new FileWriter(filePath)) // 关联一个文件流

向文件中吸入数据是需要换行可以使用Writer提供的 newLine();

  • 对于包装流只需要关闭外部流,即关闭BufferedReader即可,在底层会关闭节点流。
  • BufferedInputStreamBufferedOutputStream是字节流对应的缓冲流,用法不再做具体的说明

有时我们保存一个数据,除了它的数值外还想保存它的类型,比如对于100,它可能是一个int类型,也有可能是字符串类型。再比如说,我们想要保存一个对象,它有多个对象,我们想要 保存这个对象的完整内容,并且可以从文件中恢复。针对这个问题,Java提供了 对象流

  • 保存数据时保存它的数据类型和值,称为 序列化
  • 通过文件恢复数据的类型和值称为 反序列化
  • 如果需要某个对象支持序列化,它的类必须实现 Serializabel,这个接口是一个标记接口,没有实现方法。

对象流也是包装流,创建对象时,也需要提供一个字节输出流初始化。

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

通过对象流可以向文件中写入基本数据类型的数据,字符串类型或者对象等

oos.writeInt(100);// int -> Integer (实现了 Serializable)
oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
oos.writeChar('a');// char -> Character (实现了 Serializable)
oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
oos.writeUTF("yjh学java");//String
oos.writeObject(new Person("junhao", 21, "杭州"));

使用对象输入流可以从文件中 按照顺序读取对象,这里读出的顺序必须和保存顺序是一致的。

System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
System.out.println(ois.readObject());
  • 序列化对象时,用关键字static和transient修饰的成员不会被序列化。
  • 序列化对象的属性也必须实现了了Serializable。
  • 序列化的类中条件SerialVersion可以提高版本兼容性。

标准输入输出流 类型 设备 System.out OutputStream 显示器 System.in InputStream 键盘

转换流是为了解决乱码的问题,通关转换流可以将字节流转换成字符流,将字符流转换成字符流。

InputStreamReader 将字节输入流转换为字符输入流,并且可以指定编码方式,比如指定gbk编码这样就很好解决了读取数据输出后中文乱码问题。

//将文件字节输入流转为字符流,指定编码方式gbk
InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
//可以继续包装为BufferedReader
BufferedReader br = new BufferedReader(isr);
//可以直接写成这样
BufferedReader br = new BufferedReader(new InputStreamReader(
                                            new FileInputStream(filePath), "gbk"));

OutputStreamWriter 将字节输出流转为字符输出流。

BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(
                                            new FileOutputStream(filePath), "gbk"));

默认情况下我们使用print函数,会输出内容到控制台上,而如果想要重定向输出,即想要输出内容到文件中,可以使用 System.setOut(PrintStream out) 方法。

//打印内容到指定文件中
System.setOut(new PrintStream("filePath"));

Properties

在集合中介绍过这是专门用来读取配置文件的集合类,先看看配置文件的格式: 键=值 中间不能有空格。用Properties类的load方法来加载文件信息。

//1. 创建 Properties 对象
Properties properties = new Properties();
//2. 加载指定配置文件
properties.load(new FileReader("src\\mysql.properties"));

方法 说明 list() 显示数据到指定的设备(控制台System.out) getProperty() 根据键获取值 setProperty() 设置键值对 store() 保存文件到配置文件中,中文存储为unicode码

Original: https://www.cnblogs.com/yjh1024/p/16614640.html
Author: Nights_Watch
Title: IO流

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620247/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 第十三章 后置处理Bean

    BeanPostProcessor: 对Spring工厂所创建的对象,进行再加工 注意: BeanPostProcessor是一个接口 程序员实现BeanPostProcessor…

    数据库 2023年6月14日
    078
  • 2022-8-26 jq简单了解

    Query 是一个 JavaScript 函数库。 jQuery 是一个轻量级的”写的少,做的多”的 JavaScript 库。jQuery 库包含以下功能…

    数据库 2023年6月14日
    0121
  • 简述JS正则RegExp对象

    RegExp对象 正则表达式是描述字符模式的对象。 正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。 参考教材:w3cschool | JavaScri…

    数据库 2023年6月11日
    088
  • Linux–>磁盘分区,挂载

    对于IDE硬盘,驱动器标识符为 “hdx~”,其中”hd”表明分区所在设备类型,这里是指IDE硬盘 “x”为…

    数据库 2023年6月14日
    099
  • 网页包抓取工具Fiddler工具简单设置

    当下载好fiddler软件后首先通过以下简单设置,或者有时候fiddler抓取不了浏览器资源了。可以通过以下设置。 设置完成后重启软件。打开网络看看有没有抓取到包。 Origina…

    数据库 2023年6月6日
    089
  • 【黄啊码】MySQL入门—1、SQL 的执行流程

    大家好!我是黄啊码,鉴于大家对于学习的热情,从今天起,将连载mysql的相关知识,需要学习的可以注意我的更新学习,后期估计会开启付费专栏,但当前完全可以白嫖,希望大家珍惜! 首先我…

    数据库 2023年6月16日
    083
  • Java学习-第一部分-第二阶段-第七节:泛型

    线程 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 程序(program) 是为完成特定任务、用某种语言编写的…

    数据库 2023年6月11日
    0107
  • Kafdrop

    Kafdrop 是一个用于查看 Kafka 主题和浏览消费者组的 Web UI docker run -d –rm -p 9000:9000 \ -e KAFKA_BROKERC…

    数据库 2023年6月14日
    0126
  • 多商户商城系统功能拆解27讲-平台端分销结算设置

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    091
  • 8 int和Integer的区别

    数据类型 int是基本数据类型,Integer是int的包装类,属于引用类型 初始值 int的初始值为0,Integer的初始值为null 存储位置 int是直接存储在栈中的,In…

    数据库 2023年6月6日
    096
  • Javaweb-Ajax详解

    一、概念 Ajax = Asynchronous JavaScript and XML(异步的JavaScript和XML) Ajax不是一种新的编程语言,而是一种用于创建更好更快…

    数据库 2023年6月16日
    082
  • Linux 常用命令

    Linux 常用命令 free -h:查看服务器下内存 df -lh:查看磁盘空间 du -sh *:查看文件夹下文件占用多少空间 uname -a:查看系统版本 which ja…

    数据库 2023年6月6日
    090
  • 学习笔记——Django项目中请求与响应(json数据)

    2022-10-04 测试json数据与Django项目与pycharm连接,在”postman”软件中。”postman”是一个接…

    数据库 2023年6月14日
    0148
  • 设计模式之(1)——简单工厂模式

    创建型模式:主要用于对象的创建; 结构型模式:用于处理类或者对象的组合; 行为型模式:用于描述类或对象怎样交互和分配职责; ————————————————————————————…

    数据库 2023年6月14日
    098
  • MySQL索引

    一、索引介绍 索引(index)是帮助MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,…

    数据库 2023年5月24日
    075
  • 23种设计模式之命令模式和策略模式的区别

    命令模式和 策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色。它们虽然同为行为类模式,但是两者的区别还是很明显的。策略模式的意图是封装算法,它认为&#8221…

    数据库 2023年6月6日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球