内容概要:

Java以流的形式处理所有输入和输出。流是随通信路径从源移动到目的地的字节序列。

内存与存储设备之间传输数据的通道

流的分类:

按方向

输入流:将存储空间中的内容读到内存中   硬盘-->内存   外部源-->程序

输出流:将内存中的内容写到存储设备中

按单位

字节流:以字节为单位,可以读写所有数据

字符流:以字符为单位,只能读写文本数据

按功能

节点流:具有实际传输数据的读写功能

过滤流:在节点流的基础之上增强功能

缓冲流

缓冲输入流

可以说没有定义缓冲流时,我在进行输入流时,就像拿着灌满水的水杯往缸里装水,定义缓冲区后,我就先将杯子里的水装进水桶里,待水桶装满,再将水桶中的水往缸里倒。

减少往缸里运水的次数,从而提高效率

  1. import java.io.BufferedInputStream;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5.  
  6. //BufferedInputStream
  7. public class Demo03 {
  8. public static void main(String[] args) throws IOException {
  9. FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
  10. //BufferedInputStream bis = new BufferedInputStream(fis);
  11. //定义缓冲区
  12. /*int data = 0;
  13. while ((data = bis.read()) != -1){
  14. System.out.print((char)data);
  15. }*/
  16. //自定义缓冲区
  17. byte[] buf = new byte[1024];
  18. int count = 0;
  19. while ((count = fis.read(buf)) != -1){
  20. System.out.println(new String(buf,0,count));
  21. }
  22. bis.close();//只需关闭缓冲输入流,输入流也会跟着关闭
  23. }
  24. }

缓冲输出流

  1. import java.io.BufferedOutputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5.  
  6. //字节输出缓冲流
  7. public class Demo04 {
  8. public static void main(String[] args) throws IOException {
  9. FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
  10. BufferedOutputStream bos = new BufferedOutputStream(fos);
  11. int count = 0;
  12. for (int i = 0; i < 10; i++) {
  13. bos.write("helloworld\n".getBytes());//写入缓冲区
  14. bos.flush();//刷新到硬盘,如果没有写,当断电时,会出现没有写到硬盘上的问题,导致数据丢失;在write中当缓冲区满时,会自动调用flushBuffer方法写出
  15. }
  16. bos.close();//关闭的时候内部也会调用flush方法
  17. System.out.println("打印结束");
  18. }
  19. }

一  什么叫序列化

通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输。

二 序列化有什么作用

1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输

2.方便存储,不管是存储成文件还是数据库,都行,存储为文件,下回要用可以直接反序列拿到对象

三 怎么序列化和反序列化

实现序列化接口就行(里面什么方法都没有,不用管的,只是一个标记接口而已)Serializable;

至于他们的代码怎么写,网上例子很多,随便搜一下就行了


  1. //ObjectOutputStream实现对象的序列化
    Student
  1. //序列化类必须实现Serializable接口
  1. //标志可以进行序列化
  1. import java.io.*;
  2. //序列化类必须实现Serializable接口
  3. class Student implements Serializable { //标志可以进行序列化
  4. private String name;
  5. private int age;
  6.  
  7. public Student() {
  8. }
  9.  
  10. public Student(String name, int age) {
  11. this.name = name;
  12. this.age = age;
  13. }
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18.  
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22.  
  23. public int getAge() {
  24. return age;
  25. }
  26.  
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30.  
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "name='" + name + '\'' +
  35. ", age=" + age +
  36. '}';
  37. }
  38. }
  39. //ObjectOutputStream实现对象的序列化
  40. public class Demo05 {
  41. public static void main(String[] args) throws IOException {
  42. //创建对象流
  43. FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
  44. ObjectOutputStream oos = new ObjectOutputStream(fos);
  45. //进行序列化(写入操作)
  46. Student s1 = new Student("张三",20);
  47. oos.writeObject(s1);
  48.  
  49. oos.close();
  50. System.out.println("序列化完毕");
  51. }
  52. }
  1. //使用ObjectInputStream实现反序列化(读取重构成对象)
  1. //使用ObjectInputStream实现反序列化(读取重构成对象)
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.ObjectInputStream;public class Demo06 {
  6. public static void main(String[] args) throws IOException, ClassNotFoundException {
  7. //创建对象流
  8. FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
  9. ObjectInputStream ois = new ObjectInputStream(fis);
  10. //读取文件(反序列化)
  11. Student s = (Student) ois.readObject();
  12.  
  13. ois.close();
  14. System.out.println("执行完毕");
  15. System.out.println(s.toString());
  16. }
  17. }

关于序列化类

  1. import java.io.*;
  2. import java.lang.reflect.Array;
  3. import java.util.ArrayList;
  4. import java.util.LinkedList;
  5. //1.序列化类必须要实现Serializable接口
  6. //2.序列化类中对象属性要求实现Serializable接口
  7. //3.序列化版本号ID serialVersionUID,保证序列化的类和反序列化的类是同一个类
  8. //4.使用transient(瞬间的) 修饰属性,这个属性不能序列化
  9. //5.静态属性不能序列化
  10. //6.序列化多个对象,可以借助集合实现
  11. //ObjectOutputStream实现对象的序列化
  12. public class Demo05 {
  13. public static void main(String[] args) throws IOException {
  14. //创建对象流
  15. FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
  16. ObjectOutputStream oos = new ObjectOutputStream(fos);
  17. //进行序列化(写入操作)
  18. Student s1 = new Student("张三",20);
  19. Student s2 = new Student("李四",18);
  20. ArrayList<Student> list = new ArrayList<>();
  21. list.add(s1);
  22. list.add(s2);
  23. oos.writeObject(list);
  24.  
  25. oos.close();
  26. System.out.println("序列化完毕");
  27. }
  28. }

then  ObjectInputStream

  1. //使用ObjectInputStream实现反序列化(读取重构成对象)
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.ObjectInputStream;
  6. import java.io.Serializable;
  7. import java.util.ArrayList;
  8.  
  9. public class Demo06 {
  10. public static void main(String[] args) throws IOException, ClassNotFoundException {
  11. //创建对象流
  12. // new String();//ctrl shift alt u
  13. FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
  14. ObjectInputStream ois = new ObjectInputStream(fis);
  15. //读取文件(反序列化)
  16. // Student s = (Student) ois.readObject();
  17. // Student s1 = (Student) ois.readObject();
  18. ArrayList<Student> list = (ArrayList<Student>) ois.readObject();
  19. ois.close();
  20. System.out.println("执行完毕");
  21. System.out.println(list.toString());
  22.  
  23. }
  24.  
  25. }

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. "错误: 找不到或无法加载主类"解决办法

    前言:记上次一个找了个把小时的问题(很烦这些配置) 原因: 从svn下checkOut的项目 在application的配置的输出class路径为main,而class文件路径是在项目名的根路径下,所 ...

  2. Decorator装饰器模式个人理解

    对于装饰器模式,其主要是为了:在不改变本体特征的情况下,对其进行包装.装饰,目的是为了补充.扩展.增强其功能. 有三个原则: 不能改变本体的特征 要对本体的功能进行扩展 装饰器脱离了本体则没有任何含义 ...

  3. Apache Struts2 S2-013远程代码执行漏洞复现

    墨者学院开的靶场 进入环境 Struts2-013好家伙,框架直接写脸上,怕人看不出来= = 看了看源码什么的啥都没发现= = 去了解了一下这个漏洞,爬回来继续做 漏洞原理 struts2的标签中&l ...

  4. 使用python -m pip install 和 pip install 安装包有什么区别?

    如果去看源码的话,你会发现 pip 作为执行文件的入口点是 pip._internal.main. 另一方面,pip 作为模块运行时入口是 _main.py,而该模块也只是调用 pip.interna ...

  5. 如何迁移 Spring Boot 到函数计算

    作者 | 田小单 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上 ...

  6. FFT&原根&NTT&MTT

    FFT bilibili 3b1b视频讲解 核心过程: 原根 Definition 若 \(a\) 模 \(m\) 的阶等于 \(\varphi(m)\),则称 \(a\) 为模 \(m\) 的一个原 ...

  7. SpringBoot-自动装配2

    配置文件到底能写什么?怎么写? SpringBoot官方文档中有大量的配置,直接去记忆的话,好像不是我们程序员的行事风格! 分析自动配置原理 能自动配置的组件一般都有命名为下面规则的两个类: xxxx ...

  8. 【Python123】练习1: Python基本语法元素 (第1周)

    实例1: 温度转换 这是"实例"题,与课上讲解实例相同,请作答检验学习效果.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬ ...

  9. 霍尔效应实验 execl数据处理

    execl 函数 =POWER() /*幂次*/ =ROUND() /*保留小数点后几位*/ =SQRT() /*开平方根*/ =POWER( x, 1/3 ) /*开立方根*/ =COUNTA() ...

  10. Flink Yarn的2种任务提交方式

    Flink Yarn的2种任务提交方式 Pre-Job模式介绍 每次使用flink run运行任务的时候,Yarn都会重新申请Flink集群资源(JobManager和TaskManager),任务执 ...