IO处理的其他类

------- android培训java培训、期待与您交流! ----------

IO处理的其他类:

SequenceInputStream可将多个输入流合并成一个输入流。

其构造方法:

SequenceInputStream(InputStream s1, InputStream s2)

SequenceInputStream(Enumeration<? extends InputStream> e)

第一个构造方法比较简单,传入两个字节输入流就可以了。

第二个构造方法需要做一个集合,就流对象通过泛型放到集合中。代码:

import java.io.*;
import java.util.*;
class JoinFileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        Vector<FileInputStream> v = new Vector<FileInputStream>();
        v.add(new FileInputStream("d:/abc1.txt"));
        v.add(new FileInputStream("d:/abc2.txt"));
        v.add(new FileInputStream("d:/abc3.txt"));
        Enumeration<FileInputStream> en = v.elements();
        SequenceInputStream sis = new SequenceInputStream(en);
        FileOutputStream fos = new FileOutputStream("d:/abc4.txt");
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = sis.read(buf)) != -1) {
            fos.write(buf, 0, len);
        }
        fos.close();
        sis.close();
    }
}

多个文件合并成一个文件搞定之后,可以再尝试一下把一个文件分割成多个文件。代码:

import java.io.*;
import java.util.*;
class SplitFileDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("d:/abc.avi");
        int count = 1;
        byte[] buf = new byte[1024 * 1024 * 50];
        int len = 0;
        while ((len = fis.read(buf)) != -1) {
            FileOutputStream fos = new FileOutputStream("d:/abc.avi."
                    + (count++) + ".part");
            fos.write(buf, 0, len);
            fos.close();
        }
        fis.close();
    }
}

还有两个不是很常用类叫做,ObjectOutputStream和ObjectInputStream可将对象从内存中持久化到硬盘文件中,只是需要将需要持久化的对象所在的类实现Serializable接口,即implements Serializable。

另外,对于类中的static成员变量,将不会输出到持久化的文件中。如果不需要将非静态的成员变量持久化到文件中的话,可以将成员变量前加上transient修饰符。

这个类用的比较少,作为了解,就没有写代码。

管道流PipedInputStream和PipedOuteputStream。需要结合多线程技术,避免管道两端都在等待。虽然不常用,但是作为一个结合多线程的例子,可以学习一遍代码:

import java.io.*;
import java.util.*;
class PipedDemo {
    public static void main(String[] args) throws IOException {
        PipedInputStream in = new PipedInputStream();
        PipedOutputStream out = new PipedOutputStream();
        out.connect(in);
        Read r = new Read(in);
        Write w = new Write(out);
        new Thread(r).start();
        new Thread(w).start();
    }
}
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("管道in创建了");
            int len = in.read(buf);
            System.out.println("读到了数据,阻塞结束了");
            String s = new String(buf, 0, len);
            System.out.println(s);
        }
        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("管道out创建了");
            Thread.sleep(3000);
            out.write("piped is coming".getBytes());
            out.close();
        }
        catch (Exception e) {
            throw new RuntimeException("管道输入流失败");
        }
    }
}

还有一个比较特殊的类RandomAccessFile,具备读写功能,它属于IO体系中,却直接继承Object类。这个类只能操作文件对象。

它的两个构造方法:

RandomAccessFile(File file, String mode)

RandomAccessFile(String name, String mode)

其mode只接受”r”、 ”rw”、 ”rws”、 ”rwd”四种。后两种不常用。

posted @ 2012-12-29 11:43  qinbin  阅读(226)  评论(0编辑  收藏  举报