java IO数据操作流、对象序列化、压缩流代码解析

数据操作流

在io包中,提供了两个与平台无关的数据操作流:

数据输入流(DataInputStream)

数据输出流(DataOutputStream)

通常数据输出流会按一定格式将数据输出,再通过数据输入流按照一定格式将数据读入

DataOutputStream接口定义了一系列的writeXxx()的操作,可以写入各种数据类型的数据。

范例:使用数据操作流写入与读出数据

import java.io.DataOutputStream ;
import java.io.File ;
import java.io.FileOutputStream ;
public class DataOutputStreamDemo{
  public static void main(String args[]) throws Exception{  // 所有异常抛出
    DataOutputStream dos = null ;      // 声明数据输出流对象
    File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路径
    dos = new DataOutputStream(new FileOutputStream(f)) ;  // 实例化数据输出流对象
    String names[] = {"衬衣","手套","围巾"} ; // 商品名称
    float prices[] = {98.3f,30.3f,50.5f} ;   // 商品价格
    int nums[] = {3,2,1} ; // 商品数量
    for(int i=0;i<names.length;i++){ // 循环输出
      dos.writeChars(names[i]) ; // 写入字符串
      dos.writeChar('\t') ;  // 写入分隔符
      dos.writeFloat(prices[i]) ; // 写入价格
      dos.writeChar('\t') ;  // 写入分隔符
      dos.writeInt(nums[i]) ; // 写入数量
      dos.writeChar('\n') ;  // 换行
    }
    dos.close() ;  // 关闭输出流
  }
}; 
import java.io.DataInputStream ;
import java.io.File ;
import java.io.FileInputStream ;
public class DataInputStreamDemo{
  public static void main(String args[]) throws Exception{  // 所有异常抛出
    DataInputStream dis = null ;    // 声明数据输入流对象
    File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路径
    dis = new DataInputStream(new FileInputStream(f)) ; // 实例化数据输入流对象
    String name = null ;  // 接收名称
    float price = 0.0f ;  // 接收价格
    int num = 0 ;  // 接收数量
    char temp[] = null ;  // 接收商品名称
    int len = 0 ;  // 保存读取数据的个数
    char c = 0 ;  // '\u0000'
    try{
      while(true){
        temp = new char[200] ; // 开辟空间
        len = 0 ;
        while((c=dis.readChar())!='\t'){  // 接收内容
          temp[len] = c ;
          len ++ ;  // 读取长度加1
        }
        name = new String(temp,0,len) ; // 将字符数组变为String
        price = dis.readFloat() ;  // 读取价格
        dis.readChar() ;  // 读取\t
        num = dis.readInt() ;  // 读取int
        dis.readChar() ;  // 读取\n
        System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;
      }
    }catch(Exception e){}
    dis.close() ;
  }
}; 

对象序列化

对象序列化就是把对象变为二进制数据流的一种方法,通过对象的序列化可以方便的实现对象的传输或储存。

如果一个类想支持初始化,则该类必须实现java.io.Serilizable接口。该接口定义如下:

publicinterfaceSerilizable{}

该接口中不存在方法,因此该类属于一个标示接口,表示实现该的接口的类具备某种能力。

1.对象的序列化与反序列化

2.serialVersionUID

在序列化的操作中引入了一个serialVersionUID常量,可以通过此常量来验证版本的一致性,在进行反序列化的时候,JVM会把传进来的字节流中的serialVersionUID与本地对应类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

import java.io.Serializable ;
public class Person implementsSerializable{
     private String name ;    // 声明name属性,但是此属性不被序列化
     private int age ;         // 声明age属性
     publicPerson(String name,int age){     // 通过构造设置内容
          this.name= name ;
          this.age= age ;
     }
     publicString toString(){  // 覆写toString()方法
          return"姓名:" + this.name + ";年龄:" + this.age;
     }
}; 

3. 对象输出流:ObjectOutputStream

一个对象要想进行输出,就必须使用ObjectOutputStream类,该类定义如下

如果一个对象中的某个属性不希望被序列化的话,则可以使用transient关键字进行声明。

importjava.io.File ;
importjava.io.FileOutputStream ;
importjava.io.OutputStream ;
importjava.io.ObjectOutputStream ;
publicclass SerDemo01{
public static void main(String args[]) throwsException {
      File f = new File("D:" +File.separator + "test.txt") ;    //定义保存路径
      ObjectOutputStream oos = null ;   // 声明对象输出流
      OutputStream out = newFileOutputStream(f) ;   // 文件输出流
      oos = new ObjectOutputStream(out) ;
      oos.writeObject(new Person("张三",30));   // 保存对象
      oos.close() ;   // 关闭
}
}; 

4. 对象输入流:ObjectInputStream

importjava.io.File ;
importjava.io.FileInputStream ;
importjava.io.InputStream ;
importjava.io.ObjectInputStream ;
publicclass SerDemo02{
public static void main(String args[]) throwsException {
      File f = new File("D:" +File.separator + "test.txt") ;    //定义保存路径
      ObjectInputStream ois = null ;     // 声明对象输入流
      InputStream input = newFileInputStream(f) ;     // 文件输入流
      ois = new ObjectInputStream(input) ;   // 实例化对象输入流
      Object obj = ois.readObject() ;     // 读取对象
      ois.close() ;    // 关闭
      System.out.println(obj) ;
}
}; 

6.序列化一组对象

对象输出时只提供了一个对象的输出操作(writeObject(Objectobj)),并没有提供多个对象的输出,如果现在要对多个对象进行序列化的操作,则可以使用对象数组完成,由于数组是引用数据类型,所以可以直接使用Object类型进行接收。

importjava.io.File ;
importjava.io.IOException ;
importjava.io.FileOutputStream ;
importjava.io.OutputStream ;
importjava.io.ObjectOutputStream ;
importjava.io.FileInputStream ;
importjava.io.InputStream ;
importjava.io.ObjectInputStream ;
publicclass SerDemo05{
public static void main(String args[]) throwsException{
      Person per[] = {new Person("张三",30),newPerson("李四",31),
          new Person("王五",32)};
      ser(per) ;
      Object o[] = (Object[])dser() ;
      for(int i=0;i<o.length;i++){
          Person p = (Person)o[i] ;
          System.out.println(p) ;
      }
}
public static void ser(Object obj[]) throwsException {
      File f = new File("D:" +File.separator + "test.txt") ;    //定义保存路径
      ObjectOutputStream oos = null ;   // 声明对象输出流
      OutputStream out = new FileOutputStream(f);   // 文件输出流
      oos = new ObjectOutputStream(out) ;
      oos.writeObject(obj) ;   // 保存对象
      oos.close() ;   // 关闭
}
public static Object[] dser() throws Exception{
      File f = new File("D:" +File.separator + "test.txt") ;    //定义保存路径
      ObjectInputStream ois = null ;     // 声明对象输入流
      InputStream input = newFileInputStream(f) ;     // 文件输入流
      ois = new ObjectInputStream(input) ;   // 实例化对象输入流
      Object obj[] =(Object[])ois.readObject() ;    // 读取对象
      ois.close() ;    // 关闭
      return obj ;
}
}; 

数组能储存的对象数量有限,因此可以使用类集进行序列化的操作。

压缩流

在Java中为了减少传输时的数据量也专门提供了压缩流,可以将文件或者文件夹压缩成ZIP、JAR、GZIP等格式。

该流使用较少,因此只做简要介绍。

总结

以上就是本文关于java IO数据操作流、对象序列化、压缩流代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • java8中forkjoin和optional框架使用

    并行流与串行流 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作.Stream API 可以声明性地通过 parallel()与 sequential()在并行流与顺序流之间进行切换. 了解 Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进形拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运行的结果进行join汇总. Fork/Join 框架

  • java IO流将一个文件拆分为多个子文件代码示例

    文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位,对文件进行分割或合并. 看下基本思路: 如果有一个大文件,指定分割大小后(比如:按1M切割) step 1: 先根据原始文件大小.分割大小,算出最终分割的小文件数N step 2: 在磁盘上创建这N个小文件 step 3: 开多个线程(线程数=分割文件数),每个线程里,利用RandomAccessF

  • java的IO流详细解读

    流,就是一系列的数据. 当不同介质之间有数据交互的时候,JAVA就使用流来实现.数据源可以是文件,还可以是数据库.网络甚至其他的程序. 比如读取文件的数据到程序中,站在程序的角度来看,就叫做输入流. 字节流(以字节的形式读取和写入数据) InputStream字节输入流同时也是抽象类,只提供方法声明,不提供方法的具体实现. FileInputStream是InputStream的子类,下面以FileInputStream为例进行文件读取 package testIO; import java.i

  • Java中io流解析及代码实例

    IO流 Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的:常用的文件读取用的就是字符流,在网络通信里面用的就是字节流 下面这张图是Java中IO流的总体框架: 字节流 Java中字节流一般都是以stream结尾的,输入的字节流叫InputStream,输出字节流叫OutputStream;InputStream和OutputStream是表示自己输入/输出的所有类的超类,是抽象类(abstract) 常用的字节流有: 1.FileInp

  • IO中flush()函数的使用代码示例

    The java.io.Writer.flush() method flushes the stream. If the stream has saved any characters from the various write() methods in a buffer, write them immediately to their intended destination. Then, if that destination is another character or byte st

  • Java NIO框架Netty简单使用的示例

    之前写了一篇文章:Java 网络IO编程总结(BIO.NIO.AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文介绍一种更为简单的方式,即Java NIO框架. Netty是业界最流行的NIO框架之一,具有良好的健壮性.功能.性能.可定制性和可扩展性.同时,它提供的十分简单的API,大大简化了我们的网络编程. 同Java IO介绍的文章一样,本文所展示的例子,实现了一个相同的功能. 1.服务端 Server: package com.anxpp.io.calculat

  • java IO流读取图片供前台显示代码分享

    最近项目中需要用到IO流来读取图片以提供前台页面展示,由于以前一直是用url路径的方式进行图片展示,一听说要项目要用IO流读取图片感觉好复杂一样,但任务下达下来了,做为程序员只有选择去执行喽,于是找了点资料看了会api, 嘿感觉挺简单的,由于是第一次采用IO流的方式进行读取图片供页面显示,所以把以下代码记录一下 后台代码: /** * IO流读取图片 by:long * @return */ @RequestMapping(value = "/IoReadImage/{imgName}"

  • Java文件读写IO/NIO及性能比较详细代码及总结

    干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记.经常想得捡起,但总是因为一些原因,不能如愿. 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来. 文件读写是一个在项目中经常遇到的工作,有些时候是因为维护,有些时候是新功能开发.我们的任务总是很重,工作节奏很快,快到我们不能停下脚步去总结. 文件读写有以下几种常用的方法 1.字节读写(InputStream/OutputStream) 2.字符读取(FileReader/FileWriter) 3.

  • java IO数据操作流、对象序列化、压缩流代码解析

    数据操作流 在io包中,提供了两个与平台无关的数据操作流: 数据输入流(DataInputStream) 数据输出流(DataOutputStream) 通常数据输出流会按一定格式将数据输出,再通过数据输入流按照一定格式将数据读入 DataOutputStream接口定义了一系列的writeXxx()的操作,可以写入各种数据类型的数据. 范例:使用数据操作流写入与读出数据 import java.io.DataOutputStream ; import java.io.File ; import

  • java对象序列化与反序列化原理解析

    这篇文章主要介绍了java对象序列化与反序列化原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.序列化和反序列化的概念 对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 二.序列化和反序列化的作用 对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中. 在网络上传送对象的字节序列.网络上传输的都是二进制序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内

  • java io文件操作删除文件或文件夹的7种方法

    目录 一.删除文件或文件夹的四种基础方法 二.如何删除整个目录或者目录中的部分文件 前提准备 2.1. walkFileTree与FileVisitor 2.2.Files.walk 2.3.传统IO-递归遍历删除文件夹 本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇 为了

  • java io文件操作从文件读取数据的六种方法

    目录 1.Scanner 2.Files.lines (Java 8) 3.Files.readAllLines 4.Files.readString(JDK 11) 5.Files.readAllBytes() 6.经典管道流的方式 在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 Scanner(Ja

  • java io文件操作删除文件或文件夹的7种方法

    目录 本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇 如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力. 为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法 一.删除文件或文件夹的四种基础方法 下面的四个方法都可以删除文件

  • Java对象序列化操作详解

    本文实例讲述了Java对象序列化操作.分享给大家供大家参考,具体如下: 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再恢复为Java对象. 只能将支持 java.io.Serializable 接口的对象写入流中.每个 serializable 对象的类都被编码,编码内容包括类名和类签名.对象的字段值和数组值,以及从初始对象中引用的其他所有对象

  • python中IO流和对象序列化详解

    目录 一.IO流的操作 二.对象序列化 总结 一.IO流的操作 (1).什么是IO流(Input Output Stream)?IO流说的主要是计算机的输入和输出操作.常见的IO操作,一般说的是内存.IO流是一种常见的持久化(永久保存)技术:将数据从内存输出到磁盘保存下来.(2).IO流的分类根据数据流动(站在内存的角度上来说):输入流.输出流根据数据的类型:字符流.字节流注:字符流:字符只能操作有字符的数据(读到末尾是’’)字节流:字节是可以操作一切数据的(读到末尾是b’’),字节流操作大数据

  • java教程之对象序列化使用基础示例详解

    这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新"装配".像RMI.Socket.JMS.EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳. Java对象序列化机制一般来讲有两种用途: Java的JavaBeans: Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息,这需要将对象的状态保存到文件中,而后能够

  • 详解Java 对象序列化和反序列化

    之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反.在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候.基于此,Java中对象的序列化机制就可以很好的解决这种操作.本篇就简单的介绍Java对象序列化,主要内容如下: 简洁的代码实现 序列化实现的基本算法 两种特殊的情况 自定义序列化机制 序列化的版本控制 一.简洁的代码实现 在介绍对象序列化的使用方法之前,先看看

  • 简单总结Java IO中stream流的使用方法

    Java语言的输入输出功能是十分强大而灵活的,对于数据的输入和输出操作以"流"(stream)的方式进行.J2SDK提供了各种各样的"流"类,用以获取不同种类的数据,定义在包java.io中.程序中通过标准的方法输入或输出数据. Java中的流可以从不同的角度进行分类: 按照流的方向不同:分为输入流和输出流. 按照处理数据单位的不同:分为字节流(8位)和字符流(16位). 按照功能不同:分为节点流和处理流. 节点流:是可以从一个特定的数据源(节点)读写数据的流(例如

随机推荐