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缓冲区流

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

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

posted on 2021-05-18 10:19  coding途中  阅读(155)  评论(0编辑  收藏  举报

导航