Java中的几个关于文件流的问题.
DataInputStreamDataOutputStream
和
PiperInputStream
PipedInputStream
帮我详细的解释一下... 谢谢.
补充:要关于 PipedInputStream 的,详细的介绍, 谢谢.
补充:要关于 PipedInputStream 的,详细的介绍, 谢谢.
答案:至于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这是关于DataInputStream和...Output...的:
DataInputStream、DataOutputStream可提供一些对Java基本资料型态写入的方法,像是读写int、double、 boolean等的方法,由于Java的资料型态大小是规定好的,在写入或读出这些基本资料型态时,就不用担心不同平台间资料大小不同的问题。
这边还是举档案存取来进行说明,有时候您只是要储存一个物件的成员资料,而不是整个物件的资讯,成员资料的型态假设都是Java的基本资料型态,您不必要使用Object输入、输出相关串流物件,而可以使用DataInputStream、DataOutputStream来写入或读出资料,下面这个程式是个简单的示范:
Student.java
package onlyfun.caterpillar; public class Student { private String name; private int score; public Student() { name = "N/A"; } public Student(String name, int score) { this.name = name; this.score = score; } public void setName(String name) { this.name = name; } public void setScore(int score) { this.score = score; } public String getName() { return name; } public int getScore() { return score; } public void showData() { System.out.println("name: " + name); System.out.println("score: " + score); } }
DataStreamDemo.java
package onlyfun.caterpillar; import java.io.*; public class DataStreamDemo { public static void main(String[] args) { Student[] students = {new Student("Justin", 90), new Student("momor", 95), new Student("Bush", 88)}; try { DataOutputStream dataOutputStream = new DataOutputStream( new FileOutputStream("data.dat")); for(Student student : students) { dataOutputStream.writeUTF(student.getName()); dataOutputStream.writeInt(student.getScore()); } dataOutputStream.flush(); dataOutputStream.close(); DataInputStream dataInputStream = new DataInputStream( new FileInputStream("data.dat")); for(int i = 0; i < students.length; i++) { String name = dataInputStream.readUTF(); int score = dataInputStream.readInt(); students[i] = new Student(name, score); students[i].showData(); } dataInputStream.close(); } catch(IOException e) { e.printStackTrace(); } }}
这个程式在写入档案时,只提取物件的成员资料,而在读出时将这些资料读出,并将读回的资料设定给一个实例,是物件资料还原的一种方式。我觉得你还是下个中文的java帮助文档来看看,这应该比较好理解你所需要的东西