内容概要:

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. 华为云计算IE面试笔记-其它知识点

    * 虚拟化与云计算的区别?云计算和虚拟化关系?华为云计算怎么做的? 虚拟化是一种具体的技术,实现的是对硬件资源的虚拟化,提升资源利用率,降低能耗,云计算是一种概念各种技术组件的集合,针对的是对各种资源 ...

  2. VirtualBox VM 空间瘦身记(vmdk)

    本文地址:https://www.ebpf.top/post/shrink_vbox_vmdk_size 在使用 VirtualBox( VMDK 模式)管理虚拟机的时候,我们经常会遇到一些编译安装场 ...

  3. AOJ/搜索与递归及分治法习题集

    ALDS1_4_A-LinearSearch. Description: You are given a sequence of n integers S and a sequence of diff ...

  4. Python 通过 .cube LUT 文件对图像加滤镜

    Python 通过 .cube LUT 文件对图像加滤镜 一个好用的python给图片加滤镜的代码: https://github.com/CKboss/PyApplyLUT 这个是对C++代码的封装 ...

  5. verilog specify

    specify block用来描述从源点(source:input/inout port)到终点(destination:output/inout port)的路径延时(path delay),由sp ...

  6. Hive架构及搭建方式

    目录 前言 hive的基础知识 基本架构 metastore 内嵌服务和数据库 内嵌服务 服务和数据库单独部署 hcatalog 客户端 客户端的本地模式 beeline beeline的自动模式 j ...

  7. 【UE4 C++】读写Text文件 FFileHelper

    CoreMisc.h 读取 FFileHelper::LoadFileToString 读取全部内容,存到 FString FString TextPath = FPaths::ProjectDir( ...

  8. Go语言核心36讲(Go语言进阶技术七)--学习笔记

    13 | 结构体及其方法的使用法门 我们都知道,结构体类型表示的是实实在在的数据结构.一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型. 前导内容:结构体类型基础知识 当然了,结 ...

  9. [no code][scrum meeting] Beta 7

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月21日15:30,主持者:彭毛小民 下次例会时间:5月22日15:30,主持者:赵涛 昨日为5 ...

  10. gson中TypeAdapter实现自定义序列化操作

    最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度 ...