`

JavaI/0操作输入输出流简介(一)

阅读更多

         I/O操作给人感觉倒不是很难,就是设计到的类和方法太多,太繁琐了,如何辨别这些方法以及如何合理的对文件进行操作就显得很重要了。本文就来详细的介绍和总结Java I/o操作设计的相关内容

        

           1)输入和输出

            首先让我们来认识一个在I/O操作中经常会提及的名词“流。什么叫“流”呢?按照”Thinking in java“中的解释为”它(流)代表任何有能力产出数据的数据源对象或者有能力接受数据的接收端对象,'流'拼·屏蔽了实际的I/O设备中处理数据的细节“。

           很显然I/0操作肯定是要涉及两个方面的即输入和输出   InputStream作用来表示那些从不同数据源产生输入的类,这些数据源包括(及其相应的类)

            1)字节数组        ByteArrayInputStream  

                          允许将内存中的缓冲区当做InputStream使用

            2) String对象      StringBufferInputStream

                         将String转换成InputStream         

            3)文件                 FileInputStream

                         从文件中读取信息

            4)管道                 PipeInputStream(作为多线程中的数据源)    工作方式与实际的管道相似,即都是从一端输入,另一端输出

            5)一个由其他种类的流组成的序列,以便我们可以把这些InputStream流集合起来,转换成一个单一的InoutStream流中         SequenceInputStream

            6)其他数据源,如网络等。这个暂时就不扯了

            上述所有的数据源所对应的类都是InputStream的一个子类,除了上述子类外,我们还要知道一个重要的子类,就是FilterInputStream,但是它与上述的集中InputStream有有一点不一样,下面的代码是其构造函数

 protected FilterInputStream(InputStream in) {
	this.in = in;
    }

 看见没?它的构造函数还是InputStream .这是典型的”装饰者(或者叫包装者)“模式,它能给其他的InputStream提供额外的有用功能。

    FilterInputStream 这个类非常的重要

 

      有输入就会有输出咯,OutPutStream这个类决定了输出所要去往的目标,这些个目标有:

             1)字节数组    ByteArrayOutputStream

                                     在内存中创建缓存区,所有送往“流”的数据都会要放置在此缓冲区

             2)文件           FileOutputStream

                                     用户将信息写到文件中

             3)管道           PipeStreamStream

                                    任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现“管道化”概念。

             4)FilterOutputStream,跟FilterInputStream是一样的,也是一个典型的“装饰者”模式。

 

下面的一段代码简单简单的现实了FileInputStream 何FIleOutStream的用法

                 

public void writeFile(String pathName, String fileName, InputStream in) {
		if (in == null) {
			return;
		}
		File file = new File(pathName, fileName);
		File parentFile = file.getParentFile();
		if (parentFile != null && !parentFile.exists()) {
			parentFile.mkdirs();
		}
		OutputStream out = null;
		int len = -1;
		byte[] buf = new byte[2048];//每次读取2K的字节到内存中
		try {
			out = new FileOutputStream(file, false);
			while ((len = in.read(buf)) != -1) {//每次读取2K的字节到内存中
				out.write(buf, 0, len);//将内存中的数据写到文件中
			}
			out.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				System.out.println(e);
			}
		}
	}

public InputStream readFile(String filePath, String fileName) {
		File file = new File(filePath, fileName);
		if (!file.exists()) {
			return null;
		}
		InputStream in = null;
		try {
			in = new FileInputStream(file);
		} catch (IOException e) {
			System.out.println(e);
		}
		return in;
	}

 

 

      上面的代码只是最简单,最基本的数输入输出操作,但是呢,我们在I/O操作的时候,可能需要额外的增加一些动作或者控制,如定位输入流中的行号、增加缓存区,防止每次都进行实际的写操作等等,这些额外的功能当然可以通过继承的方式得到,但是继承的方式不好(这个就不用多说了吧,设计模式和effective java都反复的讲到 ),我们知道“装饰者”模式是一种替代继承方式的很好的策略,而在Java的I/O操作中,正式这种思想,其中所有装饰器的基类就是前面讲的FilterInput(Output)Stream咯。

      但是呢,装饰者模式也有不好的地方,最显著的地方就是由于及其的灵活,导致产生了大量的对象(但是类的数目不多,我们可以自由的组合这些类,从而实现不同的功能),因此有的时候增加了代码的读复杂度。这也是Java i/o操作让人感觉不好用的原因。

          1)通过FilterInputStream从InputStrem 读取数据 

    主要类型有:

                  DataInputStream         与DataOutputStream配合使用,我们可以从流中读取基本的数据类型如int,float,byte等等,对应的方法是reedInt()  readFloat() readByte()    

                  BufferedInputStream   可以防止每次读取都得进行实际的读操作,取而代之的是使用缓冲区,BufferedInputStream对外提供滑动读取的功能实现,通过预先读入一整段原始输入流数据至缓冲区中,而外界对BufferedInputStream的读取操作实际上是在缓冲区上进行,如果读取的数据超过了缓冲区的范围,那么BufferedInputStream负责重新从原始输入流中载入下一截数据填充缓冲区,然后外界继续通过缓冲区进行数据读取。这样的设计的好处是:避免了大量的磁盘IO,因为原始的InputStream类实现的read是即时读取的,即每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据)

                  LineNumberInputStream  可以用于跟踪六种的行号,但是这个其实没太大用处了,因为其他形式的inputstream得到行号的操作还是比较简单的

                  PushbackInputStream  这个用起来感觉更少了,不说了

         2)通过FilterOutStream像OutputStream中写入

           主要类型有:

                DataOutputStream    通过它可以向流中写入基本的数据类型。

                PrintStream  它最初的目的便是为了以可视化格式打印所有的基本数据类型和Sreing对象,有两个重要的方法print()和println() 它与DataOutStream的区别是(都是处理基本数据类型嘛),PrintStream处理数据的显示,而后者处理的是数据的存储。

                BufferedOutputStream 避免每次发送数据时都要进行实际的写操作。使用flush()方法可以清空缓冲区。

              

 

 

分享到:
评论

相关推荐

    Java I/O流通讯录

    使用Java编写的一个可使用I/O读写文件的通讯录,具体可实现添加联系人、删除联系人、修改联系人、查看联系人等,无前端页面控制台输入输出 学习JavaI/O流的可下载学习

    《Java程序设计》输入输出流.ppt

    本资源详细的讲解了java程序设计中输入输出流的知识,包括输入输出基类,File I/O,数据输入输出流,随机存取文件,文件的其它操作,java 中的unicode等.值得大家分享.

    Java I/O输入输出流详解

    一、文件的编码  开发时一定要注意项目默认的编码!!!!!!!!  文件操作的时候一定要记得关闭!!!!!!!!  ASCII:美国标准信息交换码,用一个字节的7位可以表示一个字符  ISO8859-1:拉丁码表,...

    Java I/O底层是如何工作的?

    本文服务的读者,迫切希望了解Java I/O操作是在机器层面如何进行映射,以及应用运行时硬件都做了什么。假定你熟悉基本的I/O操作,比如通过Java I/O API读写文件。这些内容不在本文的讨论范围。  目录  缓存处理...

    Java Zip算法压缩多个文件的例子.rar

    Java Zip算法压缩多个文件的例子,具体的实现原理是:先打开文件并读取,然后利用ZipEntry实例化待压缩的条目列表,将ZIP条目列表写入输出流,从源文件得到文件输入流,写入缓冲数据等。相关代码:  ...

    java IO流总结.md

    2.数据的流向:输入流、输出流 3.流的角色:节点流、处理流 节点流:直接从数据源或目的地读写数据 处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的...

    Java_IO操作总结

    详解Java I/O相关知识点.学习Java语言IO的数据流概念,讲述了每个类的具体应用范围,IO基本概念,输入输出流的处理,并且给出众多的实例代码。 。

    I/O流.xmind

    它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入输出源。

    java-io-guide:Java中的Java IO(输入和输出流)指南

    File示例列表,显示了使用Java I / O创建,读取,写入,修改文件以及获取文件信息的方法。 使用BufferInputStream读取文件 使用DataInputStream读取文件 以字节为单位获取文件大小KB MB GB TB 文件序列化示例 如何...

    基础深化和提高-IO流技术学习大全

    Java的I/O流(Input/Output Stream)技术是Java编程中用于处理输入和输出的重要部分。它提供了一种灵活而统一的方式来与文件、网络连接、内存等进行数据交换。 I/O流主要分为两种类型:字节流和字符流。 字节流: ...

    JAVA_API1.6文档(中文)

    java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供...

    Java BIO、NIO、AIO、Netty知识详解(值得珍藏)

    Java中I/O是以流为基础进行数据的输入输出的,所有数据被串行化(所谓串行化就是数据要按顺序进行输入 输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。 在Java类库中,IO部分的内容是很庞大的,...

    本项目拳皇游戏是一款基于Java语言的休闲类格斗游戏,支持双人联机对战,Java大作业项目

    异常的捕获主要用于网络连接异常的捕获,如socket的输入输出流。 1.2 Thread 线程技术主要用于两个主要方面。第一,网络连接的服务端使用了多线程,允许连接多个客户端并对其进行信息收发;第二,在GUI主面板中使用...

    Java 模拟文件管理器

    模拟文件管理器程序,实现控制台对文件和文件夹的管理操作。适合Java初学者,练习学习I/0输入输出,使用了IO中的File类、字符流和集合ArrayList等基础Java知识

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    编程课件+Java系列课程+PPT课件+Java教学

    # Java基础知识课件教程浓缩版 Java是一种跨平台、面向对象的编程语言,广泛应用于企业级应用、移动...- I/O流:讲解输入输出流的基本概念。 - 文件操作:指导文件的读写和操作。 六、多线程编程 - 线程基础:说明

    通过java操作excel表格的工具类库jxl

     输出流也关闭吧  os.close;  OK,只要把读和写结合起来,就可以在N个Excel中读取数据写入你希望的Excel新表中,还是比较方便的。  下面是程序一例:  程序代码:sql = "select * from tablename";  rs = stmt....

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Java中的IO流(一)字节流的常用操作

    文章目录前言基础概念IO流分类导向图何为输入流和输出流?各种字节流的用法①节点流②处理流③流的使用一般步骤④流的关闭具体用法Ⅰ文件流Ⅱ字节数组流Ⅲ缓冲流Ⅳ转换流Ⅴ数据流Ⅵ对象流(序列化和反序列化)Ⅶ打印...

    java开源包11

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

Global site tag (gtag.js) - Google Analytics