Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
BIO(本文主要讲解,一下IO简称默认是BIO) 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
流是数据序列。在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);//打印
Java应用程序使用输出流将数据写入目的地;它可以是文件、数组、外围设备或套接字。
Java应用程序使用输入流从源读取数据;它可以是文件、数组、外围设备或套接字。
让我们通过下图来了解Java OutputStream和InputStream的工作原理。
IO过程
OutputStream类是一个抽象类。它是表示字节输出流的所有类的超类。输出流接受输出字节并将它们发送到某个接收器。
方法 | 说明 |
---|---|
public void write(int)throw IOException | 用于将字节写入当前输出流。 |
public void write(byte[])throw IOException | 用于将字节数组写入当前输出流。 |
public void flush()throw IOException | 刷新当前输出流。 |
| public void close()throw IOException| 用于关闭当前输出流。 |
OutputStream层次结构
InputStream类是一个抽象类。它是表示字节输入流的所有类的超类。
方法 | 说明 |
---|---|
public abstract int read()throw IOException | 从输入流中读取下一个字节的数据。它在文件末尾返回-1。 |
public int available()throw IOException | 返回可从当前输入流读取的字节数的估计值。 |
public void close()throw IOException | 用于关闭当前输入流。 |
inputStream层次结构
接一下讲一下最常用FileOutputStream 跟 FileInputStream两种文件IO流使用。
public class FileOutputStream extends OutputStream
显然FileOutputStream是OutputStream的一个具体实现类,用户写入文件流的。java中的OutputStream是一个顺序写入流,。
方法 | 说明 |
---|---|
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
public class FileInputStream extends InputStream
显然FileInputStream是OutputStream的一个具体实现类,用户读取文件流的。
方法 | 说明 |
---|---|
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
下篇讲解IO缓冲区流
欢迎关注公众号! 公众号回复:
入群
,扫码加入我们交流群!
点赞是认可,在看是支持