字节流可以序列化任何文件,包括图片音频等等,字符流只能对文字操作,比如txt文件,字节流序列化后的保存的文件时二进制文件,比如先写入一段文字,又写入一张照片,使其存储方便,且其他软件无法识别,只有按照写入的顺序序列化读取才可以识别,能够起到加密的作用。字符流生成的文件,用记事本即可看到内容。
比如你写“大家好”,字节流打开后是乱码,字符流打开则是文字,不必用序列化的方式读取即可阅读到内容。
序列化的好处就是一次可以写入一个对象,使其可以读取恢复,方便数据传输,比如服务器非即时的与客户端传递数据,现将其序列化存储,再用客户端以对象的方式读取,对于封装数据会很方便。
以上均为个人见解,希望对你有所帮助。
至于PipedInputStream(抱歉你可能写错了)
在官方网的解释是这样的:
传送输入流应该连接到传送输出流;传送输入流会提供要写入传送输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能会死锁该线程。传送输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。
ADPipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道.PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据.这两个类主要用来完成线程之间的通信.一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据. 。
PipedInputStream与PipedOutputStream类的编程实例(两个线程间进行通信的实例程序)。
//Sender.java 发送者,这个线程主要用于向另一个线程发送数据。
import java.io.*;。
public class Sender extends Thread{ //表明是个线程类。
private PipedOutputStream out = new PipedOutputStream(); //发送者是要向外面写数据,所以发送者内部创建PipedOutputStream对象用于向外写数据。
public PipedOutputStream getOutputStream(){ //返回管道输出流对象。
return out;
//这是一个线程类,所以它应该覆盖Thread的run方法,run方法在线程类启动时自动运行。
public void run(){ //这里的run方法用于向PipedOutputStream中写入一串数据 。
字串2
String strInfo = new String("hello,receiver!");。
try{ //write和close方法都可能有异常出现。
out.write(StrInfo.getBytes());。
out.close();
catch(Exception e){。
e.printStackTrace();。
//Receiver.java //接收者,也是一个线程类。
import java.io.*;。
public class Receiver extends Thread{。
private PipedInputStream in = new PipedInputStream(); //接受者是要读取外面的数据,所以接受者内部创建PipedInputStream对象用于读取外面的数据。
public PipedInputStream getInputStream(){ //返回管道输入流对象。
return in;
//这是一个线程类,所以它应该覆盖Thread的run方法,run方法在线程类启动时自动运行。
public void run(){ //这里的run方法用于接收数据 。
byte[] buf = new byte[1024]; //字节数组。
try{ //read和close方法都可能有异常出现。
int len = in.read(buf); //读取数据,len表示实际读取到的内容(长度)
System.out.println("the following message comes from sender:\n" = new String(buf ,o,len) ); 。
字串8
in.close();
catch(Exception e){。
e.printStackTrace();。
//PipedStreamTest.java //启动类。
import java.io.*;。
public calss PipedStreamTest{。
public static void main(String[] args) throws Exception {。
Sender t1 = new Sender(); //创建发送者对象;。
Receiver t2 = new Receiver(); //创建接收者对象;。
PipedOutputStream out = t1.getOutputStream();。
PipedInputStream in = t2.getIntStream();。
out.connect(in); //用于连接到PipedInputStream上,与in.connect(out)等价,connect方法有异常出现的可能。
t1.start(); //启动线程。
t2.start(); //启动线程。
PipedWriter和PipedReader类,它用来处理字符文本的管道通信. 。
使用管道流类,可以实现名个/doc/">程序模块之间的松耦合通信,这样我们在/doc/">程序中就可以灵活的将多个这样的模块的输入流与输出流相联,然后以拼装成满足各种应用的/doc/">程序,而不用对模块内部进行修改.使用管道连接的模块具有强内聚弱耦合的特点,若模块被替换或被拆卸不会影响到其他的模块. 。
字串7
管道流实际上就是整行的读取和写入,不用每个字节每个字节的读取和写入。
读写是两个不同的分支,通常都是分开单独使用的。
可以通过BufferedReader 流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre = null;。
try {
String file = "D:/test/test.txt";。
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流。
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环。
System.out.println(str);//原样输出读到的内容。
};
备注一: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
可以通过“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:
OutputStreamWriter pw = null;//定义一个流。
pw = new OutputStreamWriter(new FileOutputStream(“D:/test.txt”),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.txt”实例。
pw.write("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write。
pw.close();//关闭流。
备注二:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
大致是输入\输出流
他们包括以下具体的分类
1:字节流
2:字符流
3:缓冲字节流
4:缓冲字符流
【Listing 1:用管道流截取控制台输出】
PipedInputStream pipedIS = new PipedInputStream();。
PipedOutputStream pipedOS = new PipedOutputStream();。
try {
pipedOS.connect(pipedIS);。
catch(IOException e) {。
System.err.println("连接失败");。
System.exit(1);。
PrintStream ps = new PrintStream(pipedOS);。
System.setOut(ps);。
System.setErr(ps);。
ps对象就是你需要的了
详见 http://www.ibm.com/developerworks/cn/java/l-console/。