`

黑马程序员--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

相关推荐

    java-piped-streams-test

    java-piped-streams-test 注意:所描述的错误已被报告,其状态为Won't Fix 。 有关更多信息,请参阅 。 此存储库用于演示java.io.PipedInputStream (Oracle Java 实现,存在于 1.7 和 1.8)中的错误。 这是一个最小...

    java io最简java io

    Java IO(Input/Output)是Java编程语言中用于处理输入和输出操作的重要组成部分。它提供了丰富的类库,允许程序员在各种设备、文件、网络连接之间进行数据传输。在这个主题中,我们将深入探讨Java IO的基本概念、...

    java io流源代码

    Java IO流是Java平台中用于处理输入输出操作的核心部分,它允许程序与各种数据源(如文件、设备、网络)进行交互。IO流在Java中分为两大类:字节流和字符流,每种流又有输入流和输出流之分。字节流处理的是8位的字节...

    java学习笔记之Java-IO操作共19页.pdf.zi

    Java-IO操作共19页的笔记详细介绍了这一关键领域,旨在帮助开发者掌握如何有效地读取、写入和管理数据。Java IO API提供了一套丰富的类和接口,使得开发者可以方便地进行文件读写、网络通信、流处理等操作。 1. **...

    Piped-Backend

    综上所述,Piped-Backend可能是一个使用Java编写的系统,它利用了Netty来构建高效的网络通信管道,并可能集成IPFS以支持分布式文件存储。SponsorBlock的功能可能被整合进这个管道架构中,用于处理和过滤视频内容。...

    JavaIODemo-master.zip

    Java I/O(输入/输出)是Java编程语言中用于处理数据流的重要部分,它允许程序与外部资源(如文件、网络、硬件设备等)进行通信。`JavaIODemo-master.zip`是一个包含Java I/O示例代码的项目,可能是为了帮助开发者...

    io流的全部课件io流是java非常重要的一部分,所以给大家分享一下

    Java中的IO流是程序与外部资源交互的重要工具,它涵盖了数据的输入与输出操作,包括从硬盘、网络、内存等地方读取数据以及向这些地方写入数据。本课件全面探讨了Java IO流系统,旨在帮助开发者深入理解并熟练掌握这...

    彻底明白Java的IO系统

    Java的IO系统是Java平台中处理输入和输出的重要部分,它允许程序与外部资源进行数据交换,如文件、网络连接、设备等。IO系统的核心在于流(Stream),它定义了一种从源到目的地的数据传输机制。 1. **Input 和 ...

    piped piped串口映射工具

    标题中的“piped piped串口映射工具”是指一个用于串口通信的软件工具,它允许用户在不同的端口之间建立数据传输的桥梁。在IT行业中,串口(Serial Port)是计算机硬件的一种接口,常用于设备间的通信,如打印机、...

    io流详解代码

    在Java编程语言中,`IO流`(Input/Output流)是处理数据输入与输出的核心概念。`IO流`允许程序读取或写入数据到各种类型的源和目标,如键盘、显示器、文件、网络连接等。本部分的io流详解内容主要涵盖以下几个方面:...

    piped强大的端口映射工具

    虽然Piped的描述中提到了对Cisco设备的支持,但特别提到了华为设备,这可能意味着Piped在与华为网络设备的兼容性方面做了优化。华为作为全球领先的网络设备供应商,其设备广泛应用于企业网络中。Piped能够轻松配置...

    java_io流讲解.docx.zip

    Java IO流是Java平台中处理输入输出操作的核心机制,它为数据传输提供了高效且灵活的方式。在Java中,一切输入输出都围绕着“流”进行,流是数据传输的抽象概念,代表数据的序列,可以是文件、网络、内存等不同来源...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第10章_IO(共56页).rar

    Java IO API包含了许多类和接口,如InputStream、OutputStream、Reader、Writer等,它们构成了Java处理数据输入和输出的基础框架。 1. 字节流:字节流是Java IO中最基础的部分,它处理的是8位字节的数据。...

    JAVA IO 输入输出流

    Java IO 输入输出流是Java平台基础架构的重要组成部分,它提供了处理数据输入和输出的能力,使得程序可以与外部设备(如硬盘、网络、内存等)进行数据交换。在Java中,一切皆为对象,因此IO流操作也被设计为面向对象...

    2021Java程序员面试笔试真题库-完整版.rar

    Java程序员面试笔试真题库是求职者准备Java开发职位面试的重要参考资料,包含了各种技术领域的问题,旨在测试候选人的基础知识、编程能力以及实际问题解决技能。这份资料可能涵盖多个主题,如核心Java、集合框架、多...

    Java复习题(附答案)

    在Java复习中,了解并掌握这些基础知识至关重要。 1. **多线程**:Java语言的一个显著特点是支持多线程机制,这意味着一个Java程序可以同时执行多个任务。在Java中,可以通过继承Thread类或者实现Runnable接口来...

    Java高级 io 流特性

    Java的高级IO流特性是Java开发中的重要组成部分,它提供了高效、灵活的数据输入输出机制。在Java中,I/O(Input/Output)流是用于处理数据传输的核心概念,包括读取文件、网络通信、处理系统资源等场景。本文将深入...

    javaIO流javaIO流javaIO流

    Java IO流是Java平台中用于处理输入输出操作的核心机制,它允许...在分析给定的压缩包文件“file-io-app”和“io-app2”,我们可以预期它们可能包含了一些示例代码或练习项目,用于演示和练习Java IO流的各种使用方法。

    IO流题目.pdf

    Java中的IO流是用于处理数据输入和输出的重要工具,它提供了多种类和接口来支持不同类型的流操作。在Java中,处理流的类主要集中在`java.io`包中。以下是根据给定题目内容梳理出的一些关键知识点: 1. **包分类**:...

    java复习题库习题7.1(可编辑修改word版).docx

    【Java 输入与输出流知识点详解】 Java 输入与输出流是Java I/O框架的核心部分,用于在不同数据源之间传输数据,如文件、网络、内存缓冲区等。它们分为字节流和字符流两大类,各自都有输入流和输出流。 1. **字节...

Global site tag (gtag.js) - Google Analytics