A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 左星辰 中级黑马   /  2016-6-2 22:54  /  4903 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

10黑马币
序列流与序列化流有什么区别?

21 个回复

倒序浏览
序列流,SequenceInputStream, 可以将多个InputStream整合成一个, 然后使用SequenceInputStream读取数据时, 会从被整合的流中逐个读取.
使用方式整合两个输入流, SequenceInputStream(InputStream s1, InputStream s2)

整个多个输入流, SequenceInputStream(Enumeration<? extends InputStream> e)

读取方式和使用其他InputStream相同, read()方法读取一个, read(byte[])可以读取一批

在读到内部第一个输入流末尾时, 自动读取第二个, 以此类推, 直到读到最后一个流的末尾时, 返回-1
回复 使用道具 举报
序列流楼上说了  而序列化就是该流可以将一个对象写出   就是执行了序列化和反序列化的操作  该对象写出到一个文件中  比如我们玩角色版的游戏  当我们要退掉游戏的时间就用到了该流  他可以将对象的属性  比如游戏人的名字  等级 伤害都写到文件中  如果下次登录账户又会再次读取文件的信息   重新获取了该对象的信息
回复 使用道具 举报
感觉一楼说的已经很全面了
回复 使用道具 举报

序列流,SequenceInputStream, 可以将多个InputStream整合成一个, 然后使用SequenceInputStream读取数据时, 会从被整合的流中逐个读取.
回复 使用道具 举报

序列流,SequenceInputStream, 可以将多个InputStream整合成一个, 然后使用SequenceInputStream读取数据时, 会从被整合的流中逐个读取.
使用方式整合两个输入流, SequenceInputStream(InputStream s1, InputStream s2)

整个多个输入流, SequenceInputStream(Enumeration<? extends InputStream> e)

读取方式和使用其他InputStream相同, read()方法读取一个, read(byte[])可以读取一批

在读到内部第一个输入流末尾时, 自动读取第二个, 以此类推, 直到读到最后一个流的末尾时, 返回-1
回复 使用道具 举报
Bin丶 中级黑马 2016-6-10 21:51:25
7#
序列流,SequenceInputStream, 可以将多个InputStream整合成一个, 然后使用SequenceInputStream读取数据时, 会从被整合的流中逐个读取.
使用方式整合两个输入流, SequenceInputStream(InputStream s1, InputStream s2)

整个多个输入流, SequenceInputStream(Enumeration<? extends InputStream> e)

读取方式和使用其他InputStream相同, read()方法读取一个, read(byte[])可以读取一批

在读到内部第一个输入流末尾时, 自动读取第二个, 以此类推, 直到读到最后一个流的末尾时, 返回-1
回复 使用道具 举报
首先我感觉从定义入手可以很好地回答这个问题:
回复 使用道具 举报
序列流正如大家说的那样,不在讨论,序列化流是什么?我个人认为就是序列化之后的流,一个类为了方便在网上传输,所以加一个标记的序列化接口,让它形成可以方便数据传输的序列化流,个人理解
回复 使用道具 举报
序列化流就是操作对象的流 可以对对象进行流的写入跟读取  他们的写入称为序列化  就是把对象从内存写到目标地址 读取称为反序列化 就是直接把源地址中的对象读进内存
要使用序列化流的对象 必须将对象的类继承Serializable类  并给该子类写一个long类型的常量serialVersionUID 修饰private static final 否则该类修改的话 该类的对象反序列化将无法识别 这个常量可以根据自己的需求定义
序列化流 分为
ObjectOutputStream 序列化流
ObjectInputStream 反序列化流
回复 使用道具 举报
SumT 中级黑马 2016-6-21 00:57:12
11#
SequenceInputStream 序列流,表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
回复 使用道具 举报
一楼说的很明白了
回复 使用道具 举报
1L说的感觉很好了啊
回复 使用道具 举报
整合两个: SequenceInputStream(InputStream, InputStream)
序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.

整合多个: SequenceInputStream(Enumeration) 传入枚举引用
回复 使用道具 举报
序列化,其实是类继承、使用了微软自定义的一套东西,可以把该类转换为流,这样传输和存储时可以很方便的进行。你只需要一个方法,其他的,诸如如何去传输的,如何去存储的、存储的格式等,都由.NET环境自己去实现。

如果没有实现序列化,你需要自己手动的去操作,包括转换流、选择存储格式等,比较麻烦。

另外,在反序列化时,因为vs环境知道自己是如何将这个类进行存储的,所以可以自动的将该类还原。而如果手动去操作的话,恐怕是很麻烦的。
回复 使用道具 举报
序列化,其实是类继承、使用了微软自定义的一套东西,可以把该类转换为流,这样传输和存储时可以很方便的进行。你只需要一个方法,其他的,诸如如何去传输的,如何去存储的、存储的格式等,都由.NET环境自己去实现。

如果没有实现序列化,你需要自己手动的去操作,包括转换流、选择存储格式等,比较麻烦。

另外,在反序列化时,因为vs环境知道自己是如何将这个类进行存储的,所以可以自动的将该类还原。而如果手动去操作的话,恐怕是很麻烦的。
回复 使用道具 举报
Leaf_ 中级黑马 2016-8-31 23:23:38
17#
Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。
Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

( 一 )以字节为导向的 stream------InputStream/OutputStream
InputStream 和 OutputStream 是两个 abstact 类,对于字节为导向的 stream 都扩展这两个鸡肋(基类 ^_^ ) ;
1、 InputStream

1.1
ByteArrayInputStream -- 把内存中的一个缓冲区作为 InputStream 使用 .
construct---
(A)ByteArrayInputStream(byte[]) 创建一个新字节数组输入流( ByteArrayInputStream ),它从指定字节数组中读取数据( 使用 byte 作为其缓冲区数组)
(B)---ByteArrayInputStream(byte[], int, int) 创建一个新字节数组输入流,它从指定字节数组中读取数据。
---mark:: 该字节数组未被复制。
1.2
StringBufferInputStream -- 把一个 String 对象作为 InputStream .
construct---  
StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。

注释:不推荐使用 StringBufferInputStream 方法。此类不能将字符正确的转换为字节。
同 JDK 1.1 版中的类似,从一个串创建一个流的最佳方法是采用 StringReader 类。
1.3
FileInputStream -- 把一个文件作为 InputStream ,实现对文件的读取操作
construct---
(A)FileInputStream(File name) 创建一个输入文件流,从指定的 File 对象读取数据。
(B)FileInputStream(FileDescriptor) 创建一个输入文件流,从指定的文件描述器读取数据。
(C)-FileInputStream(String name) 创建一个输入文件流,从指定名称的文件读取数据。
method ---- read() 从当前输入流中读取一字节数据。
read(byte[]) 将当前输入流中 b.length 个字节数据读到一个字节数组中。
read(byte[], int, int) 将输入流中 len 个字节数据读入一个字节数组中。
1.4
PipedInputStream :实现了 pipe 的概念,主要在线程中使用 . 管道输入流是指一个通讯管道的接收端。
一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
construct---
PipedInputStream() 创建一个管道输入流,它还未与一个管道输出流连接。
PipedInputStream(PipedOutputStream) 创建一个管道输入流 , 它已连接到一个管道输出流。
1.5
SequenceInputStream :把多个 InputStream 合并为一个 InputStream . “序列输入流”类允许应用程序把几个输入流连续地合并起来,
并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。
然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。
construct---
SequenceInputStream(Enumeration) 创建一个新的序列输入流,并用指定的输入流的枚举值初始化它。
SequenceInputStream(InputStream, InputStream) 创建一个新的序列输入流,初始化为首先 读输入流 s1, 然后读输入流 s2 。

2、 OutputSteam

2.1
ByteArrayOutputStream : 把信息存入内存中的一个缓冲区中 . 该类实现一个以字节数组形式写入数据的输出流。
当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。
constructor
(A)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。
(B)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。
(C)--- ByteArrayOutputStream(int) 创建一个新的字节数组输出流,并带有指定大小字节的缓冲区容量。
toString(String) 根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符。
write(byte[], int, int) 将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。
write(int) 将指定字节写入该字节数组输出流。
writeTo(OutputStream) 用 out.write(buf, 0, count) 调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数。
2.2  
FileOutputStream: 文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。
constructor
(A)FileOutputStream(File name) 创建一个文件输出流,向指定的 File 对象输出数据。
(B)FileOutputStream(FileDescriptor) 创建一个文件输出流,向指定的文件描述器输出数据。
(C)FileOutputStream(String name) 创建一个文件输出流,向指定名称的文件输出数据。
(D)FileOutputStream(String, boolean) 用指定系统的文件名,创建一个输出文件。
2.3
PipedOutputStream: 管道输出流是指一个通讯管道的发送端。一个线程通过管道输出流发送数据,
而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
constructor
(A)PipedOutputStream() 创建一个管道输出流,它还未与一个管道输入流连接。
(B)PipedOutputStream(PipedInputStream) 创建一个管道输出流,它已连接到一个管道输入流。

( 二 )以字符为导向的 stream Reader/Writer
以 Unicode 字符为导向的 stream ,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。
Reader/Writer 为 abstact 类
以 Unicode 字符为导向的 stream 包括下面几种类型:
1. Reader

1.1
CharArrayReader :与 ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区
constructor
CharArrayReader(char[]) 用指定字符数组创建一个 CharArrayReader 。
CharArrayReader(char[], int, int) 用指定字符数组创建一个 CharArrayReader
1.2
StringReader : 与 StringBufferInputStream 对应其源为一个字符串的字符流。
StringReader(String) 创建一新的串读取者。
1.3
FileReader : 与 FileInputStream 对应
1.4
PipedReader :与 PipedInputStream 对应

2. Writer

2.1 CharArrayWrite : 与 ByteArrayOutputStream 对应
2.2   StringWrite :无与之对应的以字节为导向的 stream
2.3 FileWrite : 与 FileOutputStream 对应
2.4 PipedWrite :与 PipedOutputStream 对应

3、两种不同导向的 stream 之间的转换  
3.1
InputStreamReader 和 OutputStreamReader :
把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。
InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。
使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。
InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。
为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader ,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
例如: // 实现从键盘输入一个整数
view plaincopy to clipboardprint?
String s = null;              
InputStreamReader re = new InputStreamReader(System.in);   
               BufferedReader br = new BufferedReader(re);   
              try {   
               s = br.readLine();   
               System.out.println("s= " + Integer.parseInt(s));   
               br.close();   
               }   
              catch (IOException e)   
               {   
               e.printStackTrace();   
               }   
              catch (NumberFormatException e)// 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。   
               {   
               System.out.println(" 输入的不是数字 ");   
               }  
String s = null; InputStreamReader re = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(re); try { s = br.readLine(); System.out.println("s= " + Integer.parseInt(s)); br.close(); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e)// 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 { System.out.println(" 输入的不是数字 "); }

InputStreamReader(InputStream) 用缺省的字符编码方式,创建一个 InputStreamReader 。
InputStreamReader(InputStream, String) 用已命名的字符编码方式,创建一个 InputStreamReader 。

OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。
每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。

(三)Java IO 的一般使用原则:  
一、按数据来源(去向)分类:
1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )
2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )
3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )
5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )
二、按是否格式化输出分:
1 、要格式化输出: PrintStream, PrintWriter
三、按是否要缓冲分:
1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )
四、按数据格式分:
1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类
2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类
五、按输入输出分:
1 、输入: Reader, InputStream 类型的子类
2 、输出: Writer, OutputStream 类型的子类
六、特殊需要:
1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter
2 、对象输入输出: ObjectInputStream, ObjectOutputStream
3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4 、合并输入: SequenceInputStream
5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则四
第二,是输入还是输出:原则五
第三,是否需要转换流:原则六第 1 点
第四,数据来源(
回复 使用道具 举报
序列流又称合并流,用来合并流的。序列化流是用来读写对象的
回复 使用道具 举报
序列流,作用就是将多个读取流合并成一个读取流。实现数据合并。、
序列化流:目的是将一个具体的对象进行持久化,写入到硬盘上。

点评

赞  发表于 2016-9-5 15:32
回复 使用道具 举报
序列流SequenceInputStream是IO其他流的一个分类,是把多个字节输入流整合成一个使用的流;一般输入多个的话会把几个要整合的字节输入流对象添加进vector集合,然后用方法elements获取枚举作为参数.
序列化是对象操作流ObjecOutputStream在将对象写出到文件执行的操作,对象操作流写出的对象的类必须实现Serializable接口,从而使对象可序列化.对象操作流从文件中读取对象时,则要执行反序列化操作将文件中的字节数据翻译成对象.
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马