本帖最后由 曹睿翔 于 2013-5-14 22:07 编辑
合并流SequenceInputStream是能对多个流进行合并成一个读取流,它在构造时需要传入Enumeration,而这个只用Vector中有,所以这个多个读取流要加入Vector集合中。 注意:它只是对读取流进行合并。 它使用步骤: 1. 创建Vector<InputStream> 2. 将要合并的InputStream加入Vector 3. 通过Vector获取Enumeration 4. 创建SequenceInputStream,将Enumeration作为参数传入。 代码: - public class SequenceDemo {
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- File file1 = new File("D:\\abc.txt");
- File file2 = new File("D:\\def.txt");
- File file3 = new File("d:\\java.txt");
-
- //将三个文件封装到vector集合中
- Vector<FileInputStream> vec = new Vector<FileInputStream>();
-
- vec.add(new FileInputStream(file1));
- vec.add(new FileInputStream(file2));
- vec.add(new FileInputStream(file3));
-
- //返回Enumeration
- Enumeration<FileInputStream> enu = vec.elements();
- SequenceInputStream seq = new SequenceInputStream(enu);
- PrintStream ps = new PrintStream("d:\\合并.txt");
-
- byte[] ch = new byte[1024];
- int len = 0;
- while((len = seq.read(ch))!= -1){
- ps.write(ch, 0, len);
- }
- seq.close();
- ps.close();
- }
- }
复制代码 管道流
管道流分为字节管道流(PipedInputStream和PipedOutputStream)和字符管道流(PipedReader和PipedWriter):它是IO技术和多线程技术的结合。在一条线程上写入的数据可以在另外一条线程上读取,它们是一对对配合使用的。如果在一条线程上使用管道读取和写入流会发生死锁的情况。
其使用步骤:
1. 分别定义写入和读取的Runnable接口子类,把相应的管道流作为构造参数传入给定义的私有管道流成员。
2. 将配对的管道流通过connect()方法连接起来。
3. 启动线程- 示例代码:
- import java.io.*;
- class Read implements Runnable{
- private PipedInputStream in;
- Read(PipedInputStream in)
- {
- this.in = in;
- }
- public void run(){
- try
- {
- byte[] buf = new byte[1024];
- System.out.println("读取前。。没有数据阻塞");
- int len = in.read(buf);
- System.out.println("读到数据。。阻塞结束");
- String s= new String(buf,0,len);
- System.out.println(s);
-
- in.close();
-
- }
- catch (IOException e)
- {
- throw new RuntimeException("管道读取流失败");
- }
- }
- }
-
- class Write implements Runnable
- {
- private PipedOutputStream out;
- Write(PipedOutputStream out)
- {
- this.out = out;
- }
- public void run()
- {
- try
- {
- System.out.println("开始写入数据,等待6秒后。");
- Thread.sleep(6000);
- out.write("piped lai la".getBytes());
- out.close();
- }
- catch (Exception e)
- {
- throw new RuntimeException("管道输出流失败");
- }
- }
- }
-
- class PipedStreamDemo
- {
- public static void main(String[] args) throws IOException
- {
-
- PipedInputStream in = new PipedInputStream();
- PipedOutputStream out = new PipedOutputStream();
- in.connect(out);
-
- Read r = new Read(in);
- Write w = new Write(out);
- new Thread(r).start();
- new Thread(w).start();
- }
- }
复制代码 RundomAccessFile(重点,即可读又可写) 此类的实例支持对随机访问文件的读取和写入。 该类不是算是IO体系中子类。而是直接继承自Object。 但是它是IO包中成员。因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。 其实完成读写的原理就是内部封装了字节输入流和输出流。
通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,,读写rw等。 如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。 - import java.io.*;
- class RandomAccessFileDemo
- {
- public static void main(String[] args) throws IOException
- {
- //writeFile_2();
- //writeFile();
- //readFile();
- RandomAccessFile raf = new RandomAccessFile("raf1.txt","rw");
- raf.write("hha".getBytes());
- }
- //读取,模式设置为“r”
- public static void readFile() throws IOException
- {
- RandomAccessFile raf = new RandomAccessFile("raf.txt","r");
- //调整对象中的指针,seek前后都能设置,所以比skipBytes使用范围广。
- //raf.seek(8*0);//里边存入的数据都是8个字节为一组,如果没有规律,读取就困难了
- //跳过指定的字节数,只能往后走,不能往回走。
- raf.skipBytes(8);
- byte [] buf = new byte[4];
- raf.read(buf);
- String name =new String(buf);
- int age = raf.readInt();
- System.out.println("name="+name);
- System.out.println("age="+age);
- raf.close();
- }
- public static void writeFile_2() throws IOException
- {
- RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
- raf.seek(8*0);//修改数据,网络分段下载原理,要重点掌握。
- raf.write("周期".getBytes());
- raf.writeInt(103);
- raf.close();
- }
- //写入,模式设置为“rw”
- public static void writeFile() throws IOException
- {
- RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
- raf.write("李四".getBytes());
- // raf.write(97);write(int x)方法只写入低8位。如果写入的数字在byte取值范围内,那么可以read()正常读取,如果超出,读取时就会出现数据错乱。
- raf.writeInt(97);//要把四个字节都写入,所以用writeInt
- raf.write("王五".getBytes());
- raf.writeInt(99);
- raf.close();
- }
- }
复制代码 |