---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------?
在IO中还有一些更特殊的流对象
1、PipedInputStream和PipedOutputStream
这两个流对象,在创建的时候必须是成对出现的,一般用于多线程,一个线程写数据,一个线程读数据。然后配合每个线程所有的其他IO流来达到多线程间的数据传递。Piped流只要有一个不再活动时,则该管道就被视为损毁。一般的创建格式为:
public class TestPipedStream {
public static void main(String[] args) {
PipedInputStream inputStream = new PipedInputStream();//创建管道读取流
PipedOutputStream outputStream = null;
try {
outputStream = new PipedOutputStream(inputStream); //创建管道写入流,并连接读取流
} catch (IOException e) {
e.printStackTrace();
}
new Thread(new PipedIn(inputStream)).start();//开启读取线程
new Thread(new PipedOut(outputStream)).start();//开启写入线程
}
}
class PipedIn implements Runnable{
PipedInputStream inputStream ;
public PipedIn(PipedInputStream inputStream){
this.inputStream = inputStream;
}
public void run()
}
class PipedOut implements Runnable{
PipedOutputStream outputStream;
public PipedOut(PipedOutputStream outputStream){
this.outputStream = outputStream;
}
public void run()
}
?
?
2、RandomAccessFile
这个流更厉害了,一般的流都是从文件的头读取到尾,或者从头写到尾,而且只有读或者写的功能;这个流则可以随便从文件的那个部分开始读写,而且这一个类里边既有读又有些的功能,这些功能非常全面,可以读写一个字节,还可以读写一个基本数据类型,还可以读写一个UTF字符串,很强大有木有。另外,关联文件的读写权限还可以用这个类来设置哦。这里有一个例子
/**
* 本例子的目的是在键盘输入人名和年龄,以逗号分开,存储到指定文件上,
* 并且姓名不限制中英文。然后还可以在指定文件上取出人名和年龄,
* 这个其实可以封装成一个工具类,大家可以试试,在创建类的时候知道文件路径就可以。
*/
package test;
import java.io.*;
public class RandonAccessFileDemo {
public static void main(String[] args) throws IOException {
writeFile();
readFile();
}
public static void writeFile() throws IOException {
File file = new File("d:\\ran.txt");
if (file.exists())
file.delete();
RandomAccessFile raf = new RandomAccessFile(file, "rw");//关联一个文件
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//控制台输入
System.out.println("请输入用户名和年龄,以逗号隔开,结束请输入over");
String line = null;
while ((line = br.readLine()) != null) {
// 结束标记
if ("over".equals(line.toLowerCase()))
break;
String[] strs = line.split(",");//将输入的字符串分解
raf.write(new Byte((byte) 0));//先写入一个字节作为初始判断标记
raf.writeUTF(strs[0]);//写入姓名
raf.writeInt(Integer.parseInt(strs[1]));//写入年龄
}
raf.close();
}
public static void readFile() throws IOException {
RandomAccessFile raf = new RandomAccessFile("d:\\ran.txt", "r");
raf.seek(0);
String name = null;
int ch = -1;
while ((ch = raf.read()) != -1) {//判断数据有没有到结尾
name = raf.readUTF();//读取姓名
int age = raf.readInt();//读取年龄
System.out.println("name: " + name);
System.out.println("age : " + age);
}
raf.close();
}
}
?
3、SequenceInputStream
这个流可以将多个输入流结合成一个输入流,它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
它有两个构造函数
SequenceInputStream(Enumeration<? extends InputStream>?e)?
SequenceInputStream(
