IO流(一)
内容概要:
Java以流的形式处理所有输入和输出。流是随通信路径从源移动到目的地的字节序列。
内存与存储设备之间传输数据的通道
流的分类:
按方向
输入流:将存储空间中的内容读到内存中 硬盘-->内存 外部源-->程序
输出流:将内存中的内容写到存储设备中
按单位
字节流:以字节为单位,可以读写所有数据
字符流:以字符为单位,只能读写文本数据
按功能
节点流:具有实际传输数据的读写功能
过滤流:在节点流的基础之上增强功能
缓冲流
缓冲输入流
可以说没有定义缓冲流时,我在进行输入流时,就像拿着灌满水的水杯往缸里装水,定义缓冲区后,我就先将杯子里的水装进水桶里,待水桶装满,再将水桶中的水往缸里倒。
减少往缸里运水的次数,从而提高效率
- import java.io.BufferedInputStream;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- //BufferedInputStream
- public class Demo03 {
- public static void main(String[] args) throws IOException {
- FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
- //BufferedInputStream bis = new BufferedInputStream(fis);
- //定义缓冲区
- /*int data = 0;
- while ((data = bis.read()) != -1){
- System.out.print((char)data);
- }*/
- //自定义缓冲区
- byte[] buf = new byte[1024];
- int count = 0;
- while ((count = fis.read(buf)) != -1){
- System.out.println(new String(buf,0,count));
- }
- bis.close();//只需关闭缓冲输入流,输入流也会跟着关闭
- }
- }
缓冲输出流
- import java.io.BufferedOutputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- //字节输出缓冲流
- public class Demo04 {
- public static void main(String[] args) throws IOException {
- FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
- BufferedOutputStream bos = new BufferedOutputStream(fos);
- int count = 0;
- for (int i = 0; i < 10; i++) {
- bos.write("helloworld\n".getBytes());//写入缓冲区
- bos.flush();//刷新到硬盘,如果没有写,当断电时,会出现没有写到硬盘上的问题,导致数据丢失;在write中当缓冲区满时,会自动调用flushBuffer方法写出
- }
- bos.close();//关闭的时候内部也会调用flush方法
- System.out.println("打印结束");
- }
- }
一 什么叫序列化
通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输。
二 序列化有什么作用
1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输
2.方便存储,不管是存储成文件还是数据库,都行,存储为文件,下回要用可以直接反序列拿到对象
三 怎么序列化和反序列化
实现序列化接口就行(里面什么方法都没有,不用管的,只是一个标记接口而已)Serializable;
至于他们的代码怎么写,网上例子很多,随便搜一下就行了
//ObjectOutputStream实现对象的序列化
Student
- //序列化类必须实现Serializable接口
- //标志可以进行序列化
- import java.io.*;
- //序列化类必须实现Serializable接口
- class Student implements Serializable { //标志可以进行序列化
- private String name;
- private int age;
- public Student() {
- }
- public Student(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "Student{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
- //ObjectOutputStream实现对象的序列化
- public class Demo05 {
- public static void main(String[] args) throws IOException {
- //创建对象流
- FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
- ObjectOutputStream oos = new ObjectOutputStream(fos);
- //进行序列化(写入操作)
- Student s1 = new Student("张三",20);
- oos.writeObject(s1);
- oos.close();
- System.out.println("序列化完毕");
- }
- }
- //使用ObjectInputStream实现反序列化(读取重构成对象)
- //使用ObjectInputStream实现反序列化(读取重构成对象)
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;public class Demo06 {
- public static void main(String[] args) throws IOException, ClassNotFoundException {
- //创建对象流
- FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
- ObjectInputStream ois = new ObjectInputStream(fis);
- //读取文件(反序列化)
- Student s = (Student) ois.readObject();
- ois.close();
- System.out.println("执行完毕");
- System.out.println(s.toString());
- }
- }
关于序列化类
- import java.io.*;
- import java.lang.reflect.Array;
- import java.util.ArrayList;
- import java.util.LinkedList;
- //1.序列化类必须要实现Serializable接口
- //2.序列化类中对象属性要求实现Serializable接口
- //3.序列化版本号ID serialVersionUID,保证序列化的类和反序列化的类是同一个类
- //4.使用transient(瞬间的) 修饰属性,这个属性不能序列化
- //5.静态属性不能序列化
- //6.序列化多个对象,可以借助集合实现
- //ObjectOutputStream实现对象的序列化
- public class Demo05 {
- public static void main(String[] args) throws IOException {
- //创建对象流
- FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
- ObjectOutputStream oos = new ObjectOutputStream(fos);
- //进行序列化(写入操作)
- Student s1 = new Student("张三",20);
- Student s2 = new Student("李四",18);
- ArrayList<Student> list = new ArrayList<>();
- list.add(s1);
- list.add(s2);
- oos.writeObject(list);
- oos.close();
- System.out.println("序列化完毕");
- }
- }
then ObjectInputStream
- //使用ObjectInputStream实现反序列化(读取重构成对象)
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.Serializable;
- import java.util.ArrayList;
- public class Demo06 {
- public static void main(String[] args) throws IOException, ClassNotFoundException {
- //创建对象流
- // new String();//ctrl shift alt u
- FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
- ObjectInputStream ois = new ObjectInputStream(fis);
- //读取文件(反序列化)
- // Student s = (Student) ois.readObject();
- // Student s1 = (Student) ois.readObject();
- ArrayList<Student> list = (ArrayList<Student>) ois.readObject();
- ois.close();
- System.out.println("执行完毕");
- System.out.println(list.toString());
- }
- }
IO流(一)的更多相关文章
- Java基础之IO流
很长时间都没有更新了,最近在补充JavaSE的一些细节部分 关于IO流的一些总结 首先要介绍的是File类,File类用于对文件和目录的一些操作 1.创建文件CreateNewFile() 2.对文件 ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- IO流总结
IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类: 按照操作数据的类型分为两种: 字节流和字符流. 按 ...
- IO流
流的概念和作用 学习JavaIO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特 ...
- Java IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- java IO流 之 其他流
一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一). public class ByteArrayInputStream extends ...
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
随机推荐
- "错误: 找不到或无法加载主类"解决办法
前言:记上次一个找了个把小时的问题(很烦这些配置) 原因: 从svn下checkOut的项目 在application的配置的输出class路径为main,而class文件路径是在项目名的根路径下,所 ...
- Decorator装饰器模式个人理解
对于装饰器模式,其主要是为了:在不改变本体特征的情况下,对其进行包装.装饰,目的是为了补充.扩展.增强其功能. 有三个原则: 不能改变本体的特征 要对本体的功能进行扩展 装饰器脱离了本体则没有任何含义 ...
- Apache Struts2 S2-013远程代码执行漏洞复现
墨者学院开的靶场 进入环境 Struts2-013好家伙,框架直接写脸上,怕人看不出来= = 看了看源码什么的啥都没发现= = 去了解了一下这个漏洞,爬回来继续做 漏洞原理 struts2的标签中&l ...
- 使用python -m pip install 和 pip install 安装包有什么区别?
如果去看源码的话,你会发现 pip 作为执行文件的入口点是 pip._internal.main. 另一方面,pip 作为模块运行时入口是 _main.py,而该模块也只是调用 pip.interna ...
- 如何迁移 Spring Boot 到函数计算
作者 | 田小单 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上 ...
- FFT&原根&NTT&MTT
FFT bilibili 3b1b视频讲解 核心过程: 原根 Definition 若 \(a\) 模 \(m\) 的阶等于 \(\varphi(m)\),则称 \(a\) 为模 \(m\) 的一个原 ...
- SpringBoot-自动装配2
配置文件到底能写什么?怎么写? SpringBoot官方文档中有大量的配置,直接去记忆的话,好像不是我们程序员的行事风格! 分析自动配置原理 能自动配置的组件一般都有命名为下面规则的两个类: xxxx ...
- 【Python123】练习1: Python基本语法元素 (第1周)
实例1: 温度转换 这是"实例"题,与课上讲解实例相同,请作答检验学习效果. ...
- 霍尔效应实验 execl数据处理
execl 函数 =POWER() /*幂次*/ =ROUND() /*保留小数点后几位*/ =SQRT() /*开平方根*/ =POWER( x, 1/3 ) /*开立方根*/ =COUNTA() ...
- Flink Yarn的2种任务提交方式
Flink Yarn的2种任务提交方式 Pre-Job模式介绍 每次使用flink run运行任务的时候,Yarn都会重新申请Flink集群资源(JobManager和TaskManager),任务执 ...