• java IO教程《一》


    IO教程

    什么是IO?

    Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

    发展历程

    1. BIO(本文主要讲解,一下IO简称默认是BIO) 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。

    2. NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。

    3. AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

    OutputStream与InputStream

    stream

    流是数据序列。在Java中,流是由字节组成的。它被称为一条小溪,因为它就像一条不断流动的水流。 在Java中,会自动为我们创建3个流。所有这些流都与控制台相连。

    1) System.out:标准输出流

    2) System.in:标准输入流

    3) System.err:标准错误流

    让我们看看打印输出的代码和控制台的错误消息。

    System.out.println("hello word");  
    System.err.println("hello word");  

    获取控制台输入流

    int i=System.in.read();//获取console读取流 
    System.out.println((char)i);//打印  

    OutputStream与InputStream

    • OutputStream

    Java应用程序使用输出流将数据写入目的地;它可以是文件、数组、外围设备或套接字。

    • InputStream

    Java应用程序使用输入流从源读取数据;它可以是文件、数组、外围设备或套接字。

    让我们通过下图来了解Java OutputStream和InputStream的工作原理。

    IO过程IO过程

    OutputStream类详解

    OutputStream类是一个抽象类。它是表示字节输出流的所有类的超类。输出流接受输出字节并将它们发送到某个接收器。

    • OutputStream的实用方法:
    方法说明
    public void write(int)throw IOException 用于将字节写入当前输出流。
    public void write(byte[])throw IOException 用于将字节数组写入当前输出流。
    public void flush()throw IOException 刷新当前输出流。

    | public void close()throw IOException| 用于关闭当前输出流。 |

    • OutputStream层次结构

    OutputStream层次结构OutputStream层次结构

    InputStream类详解

    InputStream类是一个抽象类。它是表示字节输入流的所有类的超类。

    • InputStream类详解的实用方法:
    方法说明
    public abstract int read()throw IOException 从输入流中读取下一个字节的数据。它在文件末尾返回-1。
    public int available()throw IOException 返回可从当前输入流读取的字节数的估计值。
    public void close()throw IOException 用于关闭当前输入流。
    • InputStream层次结构

    inputStream层次结构inputStream层次结构

    实战演练(文件流)

    接一下讲一下最常用FileOutputStream 跟 FileInputStream两种文件IO流使用。

    FileOutputStream

    • Java.io.FileOutputStream类的声明:

    public class FileOutputStream extends OutputStream  

    显然FileOutputStream是OutputStream的一个具体实现类,用户写入文件流的。java中的OutputStream是一个顺序写入流,。

    • FileOutputStream 常用方法

    方法说明
    protected void finalize() 用于清除与文件输出流的连接
    void write(byte[]ary) 用于将ary.length字节从字节数组写入文件输出流
    void write(byte[]ari,int off,int len) 用于从偏移量off开始将len字节从字节数组写入文件输出流
    void write(int b) 用于将指定的字节写入文件输出流
    FileChannel getChannel() 用于返回与文件输出流关联的文件通道对象
    FileDescriptor getFD() 用于返回与流关联的文件描述符
    void close() 关闭文件流
    • 文件写入字节

    import java.io.FileOutputStream;  
    public class FileOutputStreamExample {  
        public static void main(String args[]){    
               try{    
                 FileOutputStream fout=new FileOutputStream("D:\testout.txt");    
                 fout.write(65);    
                 fout.close();    
                 System.out.println("success...");    
                }catch(Exception e){System.out.println(e);}    
          }    
    }  

    控制台输出

    Success...

    此时会发现我们的D盘里被写入了一个testout.txt文件。查看文件内容

    A
    • 文件写入字符串

    import java.io.FileOutputStream;  
    public class FileOutputStreamExample {  
        public static void main(String args[]){    
               try{    
                 FileOutputStream fout=new FileOutputStream("D:\testout1.txt");    
                 String s="hello word";    
                 byte b[]=s.getBytes(); 
                 fout.write(b);    
                 fout.close();    
                 System.out.println("success...");    
                }catch(Exception e){System.out.println(e);}    
          }    
    }  

    控制台输出

    Success...

    此时会发现我们的D盘里被写入了一个testout1.txt文件。查看文件内容

    hello word

    FileInputStream

    • Java.io.FileInputStream类的声明:

    public class FileInputStream extends InputStream  

    显然FileInputStream是OutputStream的一个具体实现类,用户读取文件流的。

    • FileInputStream 常用方法

    方法说明
    int available() 用于返回可从输入流读取的估计字节数
    int read() 用于从输入流中读取数据字节
    int read(byte[] b) 用于从输入流中读取最多为b.length字节的数据
    int read(byte[]b,int off,int len) 用于从输入流中读取从off起多达len字节的数据。
    long skip(long x) 用于跳过并丢弃输入流中的x字节数据
    FileChannel getChannel() 用于返回与文件输入流关联的唯一FileChannel对象
    FileDescriptor getFD() 用于返回FileDescriptor对象
    protected void finalize() 用于确保在没有更多文件输入流引用时调用close方法
    void close() 关闭文件流
    • 文件读取字节

    import java.io.FileInputStream;  
    public class DataStreamExample {  
         public static void main(String args[]){    
              try{    
                FileInputStream fin=new FileInputStream("D:\testout.txt");    
                int i=fin.read();  
                System.out.print((char)i);    
                fin.close();    
              }catch(Exception e){System.out.println(e);}    
             }    
            }  

    输出

    A
    • 文件读取字符串

    当读取字符串时候需要一个个字节去读取,当读取不到数据时候会返回给我们index= -1,此时停止读取关闭流。

    package com.javatpoint;  
      
    import java.io.FileInputStream;  
    public class DataStreamExample {  
         public static void main(String args[]){    
              try{    
                FileInputStream fin=new FileInputStream("D:\testout1.txt");    
                int i=0;    
                while((i=fin.read())!=-1){    
                 System.out.print((char)i);    
                }    
                fin.close();    
              }catch(Exception e){System.out.println(e);}    
             }    
            }  

    控制台输出

    hello word

    END

    下篇讲解IO缓冲区流

    欢迎关注公众号! 公众号回复:入群 ,扫码加入我们交流群! 扫码关注公众号获取更多学习资料

    点赞是认可,在看是支持点赞是认可,在看是支持

    欢迎关注我的公众号!里面可以加入微信技术交流群!
  • 相关阅读:
    ActionScript 条件编译
    FLASH通讯小结
    关于ob_start()
    剖析PHP中的输出缓冲
    Ext.app.controller的refs
    php多线程解决之stream_socket_client
    谷歌的JQuery库
    PHP计划任务之关闭浏览器后仍然继续执行的函数
    关于php调用可执行程序,在后台运行而不让页面等待
    把预定义的字符串转化为html标签
  • 原文地址:https://www.cnblogs.com/1ssqq1lxr/p/14779821.html
Copyright © 2020-2023  润新知