`

黑马程序员--java基础复习--IO--Piped、RandomAccessFile与SequenceInputStream

 
阅读更多

---------------------- 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(InputStream s1, InputStream s2) 
 第二个很好看懂,关键是第一个,当我们有两个以上的输入流需要读取到一个目的地时,则可以用第一个构造方法来构造SequenceInputStream,而InputStream的Enumeration也可以通过不同方法来构建。举例两种:

  • 利用集合框架中的工具类Collections,
    package test;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.SequenceInputStream;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    
    public class TestSequenceStream {
    
    	public static void main(String[] args) throws Exception {
    		FileInputStream fis1 = new FileInputStream("d:/1.txt");
    		FileInputStream fis2 = new FileInputStream("d:/2.txt");
    		FileInputStream fis3 = new FileInputStream("d:/3.txt");
    		
    		ArrayList<FileInputStream> aList = new ArrayList<FileInputStream>();
    		
    		aList.add(fis1);
    		aList.add(fis2);
    		aList.add(fis3);
    		//就这一步,使用集合的工具类	
    		Enumeration<FileInputStream> en = Collections.enumeration(aList);
    		
    		SequenceInputStream sis = new SequenceInputStream(en);
    		FileOutputStream fos = new FileOutputStream("D:/合体.txt");
    		
    		byte[] buf = new byte[1024];
    		int len = 0;
    		while((len = sis.read(buf)) != -1 ){
    			fos.write(buf, 0, len);
    		}
    		
    		sis.close();
    		fos.close();
    		
    	}
    
    }
    
     
  • 利用内部类形式
    package test;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.SequenceInputStream;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.Iterator;
    
    public class TestSequenceStream {
    
    	public static void main(String[] args) throws Exception {
    		FileInputStream fis1 = new FileInputStream("d:/1.txt");
    		FileInputStream fis2 = new FileInputStream("d:/2.txt");
    		FileInputStream fis3 = new FileInputStream("d:/3.txt");
    		
    		ArrayList<FileInputStream> aList = new ArrayList<FileInputStream>();
    		
    		aList.add(fis1);
    		aList.add(fis2);
    		aList.add(fis3);
    		
    		//这一步用的是内部类
    		final Iterator<FileInputStream> iterator = aList.iterator();
    		Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
    			public boolean hasMoreElements() {
    				return iterator.hasNext();
    			}
    			public FileInputStream nextElement() {
    				return iterator.next();
    			}			
    		};
    		
    		SequenceInputStream sis = new SequenceInputStream(en);
    		FileOutputStream fos = new FileOutputStream("D:/合体1.txt");
    		
    		byte[] buf = new byte[1024];
    		int len = 0;
    		while((len = sis.read(buf)) != -1 ){
    			fos.write(buf, 0, len);
    		}
    		
    		sis.close();
    		fos.close();
    		
    	}
    
    }
    
     

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

0
1
分享到:
评论
1 楼 hailongshih 2013-07-08  
支持下lz

相关推荐

Global site tag (gtag.js) - Google Analytics