黑马程序员--java基础复习--IO--Piped、RandomAccessFile与SequenceInputStream
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也可以通过不同方法来构建。举例两种:
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
1 楼 hailongshih 3 小时前 支持下lz