内容概要:

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流(一)的更多相关文章

  1. Java基础之IO流

    很长时间都没有更新了,最近在补充JavaSE的一些细节部分 关于IO流的一些总结 首先要介绍的是File类,File类用于对文件和目录的一些操作 1.创建文件CreateNewFile() 2.对文件 ...

  2. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  3. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  4. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  5. IO流总结

    IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类:  按照操作数据的类型分为两种: 字节流和字符流.  按 ...

  6. IO流

    流的概念和作用 学习JavaIO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特 ...

  7. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  8. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  9. java IO流 之 其他流

    一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一).   public class ByteArrayInputStream extends ...

  10. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

随机推荐

  1. 二、mybatis之数据输出

    上一篇我们做了一个入门案例,是我们做mybatis的基本步骤,不熟悉的可以回顾一下https://www.cnblogs.com/jasmine-e/p/15330355.html,在这篇文章中只是简 ...

  2. 数据库语法整理及WAF绕过方式

    关系型数据库 关系型数据库:指采用了关系模型来组织数据的数据库. 直白的说就是:关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织 当今主流的关系型数据库有:Oracle,M ...

  3. 借jQuery对象拷贝学习深拷贝与浅拷贝

    jQuery.extend([deep], target, object1, [objectN]) 即用一个或多个其他对象来扩展一个对象,返回被扩展的对象. deep:如果设为true,则递归合并. ...

  4. mysql面试题及答案,mysql最新面试题,mysql面试题大全汇总

    mysql最新面试题及答案汇总 Mysql 的存储引擎,myisam和innodb的区别.mysql最新面试题 答: 1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用.表锁,不会出现死锁, ...

  5. 前端快闪四: 拦截axios请求和响应

    马甲哥继续在同程艺龙写一点大前端: 今天我们来了解一下 如何拦截axios请求/响应? axios是一个基于 promise 的网络请求库,可以用于浏览器和 node.js, promise 类似于C ...

  6. The Data Way Vol.1|风口下的开源市场:如何看待开源与商业的关系?

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  7. 洛谷2408不同字串个数/SPOJ 694/705 (后缀数组SA)

    真是一个三倍经验好题啊. 我们来观察这个题目,首先如果直接整体计算,怕是不太好计算. 首先,我们可以将每个子串都看成一个后缀的的前缀.那我们就可以考虑一个一个后缀来计算了. 为了方便起见,我们选择按照 ...

  8. 【Java虚拟机6】Java内存模型(Java篇)

    什么是Java内存模型 <Java虚拟机规范>中曾试图定义一种"Java内存模型"(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异, ...

  9. Tekton+Argocd实现自动化流水线

    目录 什么是tekton 安装tekton 安装Dashboard Tekton提供的CRD 安装argocd 创建argocd 安装客户端 连接argocd server 创建App 集群中查看效果 ...

  10. spring security实现简单的url权限拦截

    在一个系统中,权限的拦截是很常见的事情,通常情况下我们都是基于url进行拦截.那么在spring security中应该怎么配置呢. 大致步骤如下: 1.用户登录成功后我们需要拿到用户所拥有的权限,并 ...