• Java学习IO篇


    Java学习IO篇

    Posted on 2013-09-05 11:06 DM张朋飞 阅读(266) 评论(0编辑 收藏

            来吧,同志们,为复习网络编程做准备……

    一.理论准备

            流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行,设备可以是文件、网络、内存等。流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序(小马哥说的是机器)为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流,可以将流想象成一个“水流管道”(很多资料都这么讲的),自然就出现了方向的概念。

            流把I/O设备内部的具体操作给隐藏起来了。所有InputStream和Reader的派生类都有一个基本的,继承下来的,能读取单个或byte数组的read( )方法。

            Java分为字节流(Stream结尾)和字符流(Reader、Write结尾),再分为输入流(InputStream、Reader)和输出流(OutputStream、Write),输入输出相对于内存而言。在读字符的时候用字符流,如文本文件、XML(我想xml明明是字母字符组成的,属于ASCII文件,为何不用stream读取呢?)等。在读二进制文件时候用字节流,如RAR、EXE等不是文本以外的文件(图片)。Buffered开头的流只是加了缓冲区,为了读写提高效率。字符流不能直接输出,需要转换成字节流才能输出(这个确实是刚知道的)!

            Java 2 SDK中有三种基本类型的节点:文件(file)、内存(memory)、管道(pipe)。

    下面来看郑莉教材上IO章节的那个经典图片。

            继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据,且数据的单位都是字节(byte=8bit),如图,深色的为节点流,浅色的为处理流。

    1_thumb2

              继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit),如图,深色的为节点流,浅色的为处理流。

    2_thumb2

    二.用法分析

            Java IO的一般使用原则(部分来自百度文库): 
            (1) 按数据来源(去向)分类:

    1. 是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
    2. 是byte[]:ByteArrayInputStream, ByteArrayOutputStream
    3. 是Char[]: CharArrayReader, CharArrayWriter
    4. 是String: StringBufferInputStream, StringReader, StringWriter
    5. 网络数据流:InputStream, OutputStream, Reader, Writer 
      (2) 按是否格式化输出分: 
      要格式化输出:PrintStream, PrintWriter 
      (3) 按是否要缓冲分: 
      要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter。

           (4) 按数据格式分:

    1. 二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
    2. 纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类 
      (5) 按输入输出分: 
      输入:Reader, InputStream类型的子类;输出:Writer, OutputStream类型的子类 
      (6) 特殊需要:
    1. 从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
    2. 对象输入输出:ObjectInputStream, ObjectOutputStream
    3. 进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter 
    4. 合并输入:SequenceInputStream
    5. 更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

           (7) 决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要): 
    考虑最原始的数据格式是什么:是否为文本?是输入还是输出?是否需要转换流:InputStreamReader, OutputStreamWriter?数据来源(去向)是什么:文件?内存?网络?是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)是否要格式化输出:print。

    三.若干实例

             还是寒假时候写的,权当复习了,折叠代码的插件找不到了,先看着吧。

             1.System.in

    import java.io.BufferedReader;
    
    import java.io.IOException;
    
    import java.io.InputStreamReader;
    
    
    
    /*
    
     * System.in是InputStream static final的,包含了多态,叫同步式或者阻塞式
    
     * 读取ASCII和二进制文件(图片),而字母就是ASCII字符(个人理解)。
    
     */
    
    public class TestSystemIn {
    
    
    
    	public static void main(String[] args) {
    
    		InputStreamReader isr = new InputStreamReader(System.in);
    
    		BufferedReader br = new BufferedReader(isr);//有readline
    
    		String s = null;
    
    		try {
    
    			s = br.readLine();
    
    			while(s!=null) {
    
    				if(s.equalsIgnoreCase("exit")) {
    
    					break;
    
    				}
    
    				System.out.println(s.toUpperCase());
    
    				s = br.readLine();
    
    			}
    
    			br.close();
    
    		}catch (IOException e) {
    
  • 相关阅读:
    Mac开发利器之程序员编辑器MacVim学习总结(转)
    FFmpeg的H.264解码器源代码简单分析
    Google推荐的图片加载库Glide
    Java集合及concurrent并发包总结(转)
    ArrayList、Vector和LinkedList等的差别与用法(基础回顾)
    应用最广泛的模式-工厂方法模式
    Android 开发 命名规范(基础回顾)
    Java线程问题(基础回顾)
    Mac下使用wireshark解决Interface为空的办法
    Express4.10.2开发框架中默认app.js的代码注释
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3303535.html
Copyright © 2020-2023  润新知