IO流
IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。
Java 中是通过流处理IO 的,那么什么是流?
流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。
当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
一般来说关于流的特性有下面几点:
先进先出:最先写入输出流的数据最先被输入流读取到。
顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
File类
1、 文件可认为是相关记录或放在一起的数据的集合。文件一般存放在存储介质上:硬盘、u盘、光盘、软盘、云盘等。(云管段)
2、 java.io.File 类是专门对文件进行操作的类。(只能对文件本身进行操作,不能对文件内容操作)
3、 File类是“文件和目录路径名的抽象表示”。而不是指文件的内容。
4、 File类定义了一些与平台无关的方法操作,如:创建、删除文件和重命名等。
5、 Java中目录被看成是一个特殊的文件。List()方法可以返回目录中所有的子目录和文件。
6、 在linux下路径分隔符为(/),而在windos中则是为(\),在java中可以正确的处理不同系统中的分隔符。
File : 代表文件或者目录对象
File类常用构造方法和属性
常用构造方法:
1、public File(Stringpathname)
以pathname为路径创建File对象,如果pathname是相对路径,则是相对于Java的系统属性user.dir中的路径。(对eclipse创建的java工程来说,就是该工程的根目录。)
属性:
2、public static finalString separator 存储了当前系统的名称分隔符
在 LINUX和Mac系统上,此字段的值为 /;在 Windows 系统上,它为 \.为了程序的跨平台特性,文件的路径应该用这个属性值来代表。
3、public static finalchar pathSeparator 存储了当前系统默认路径分割符号
Windows系统是 ;; 即path环境变量中,不同的路径的分割符号。LINUX系统是::
什么是IO流
IO指的是Input/Output,IO流:输入输出流。 统称为数据流。(IO Stream)
在Java程序中,对于数据的输入 / 输出操作以流的方式进行;流是从起源到接收的有序数据。JDK提供了各种各样的流类,用以获取不同种类的数据;
IO流的分类
按流向分:
◦ 输入流:程序可以从中读取数据的流
◦ 输出流:程序能向其中写入数据的流
按数据传输单位分:
◦ 字节流:以字节为单位传输数据的流 (byte)
◦ 字符流:以字符为单位传输数据的流 (char)
按功能分:
◦ 节点流:用于直接操作目标设备的流
◦ 处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更强大、灵活的读写功能。
*字节流
FileInputStream: 输入流,负责读取数据
FileOutputStream: 输出流,负责写入数据
注意 :
1.字节流一般不用于读取字符数据文件,容量乱码。
2.字节流往往一般用于读取字节文件,例如:.class,图片,视频等多媒体文件
3.IO流对不会被垃圾回收器回收,需要手动close释放内存资源。
*字符流
FileReader : 输入流
FileWriter : 输出流
注意:千万不能用字符流读写字节数据文件
IO流的基类
分类 | 字节输出流 | 字节输入流 | 字符输出流 | 字符输入流 |
抽象基类 | OutputStream | InputStream | Writer | Reader |
访问文件 | FileOutputStream | FileInputStream | FileWriter | FileReader |
访问数组 | ByteArrayOutputStream | ByteArrayInputStream | CharArrayWriter | CharArrayReader |
访问管道 | PipedOutputStream | PipedInputStream | PipedWriter | PipedReader |
访问字符串 | StringWriter | StringReader | ||
缓冲流 | BufferedOutputStream | BufferedInputStream | BufferedWriter | BufferedReader |
转换流 | OutputStreamWriter | InputStreamReader | ||
对象流 | ObjectOutputStream | ObjectInputStream | ||
抽象基类 | FilterOutputStream | FilterInputStream | FilterWriter | FilterReader |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataOutputStream | DataInputStream |
InputStream字节输入流
继承自InputStream的流都是用于向程序中输入数据的,且数据的单位为字节(8位)
InputStream基本方法:
public abstract int read() throwsIOException
从输入流中读取数据的下一个字节, 返回读到的字节值.若遇到流的末尾,返回-1
public int read(byte[] b) throwsIOException
从输入流中读取 b.length 个字节的数据并存储到缓冲区数组b中.返回的是实际读到的字节总数
public int read(byte[] b, int off, int len)throws IOException
读取 len 个字节的数据,并从数组b的off位置开始写入到这个数组中
public void close() throws IOException
关闭此输入流并释放与此流关联的所有系统资源
public int available() throws IOException
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数
public skip(long n) throws IOException
跳过和丢弃此输入流中数据的 n 个字节,返回实现路过的字节数。
OutputStream字节输出流
继承自OutputStream的流是程序用于向外输出数据的,且数据的单位为字节(8位)
OutputStream主要方法:
public abstract void write(int b) throwsIOException
将指定的字节写入此输出流
public void write(byte[] b) throwsIOException
将 b.length 个字节从指定的 byte 数组写入此输出流
public void write(byte[] b, int off, intlen) throws IOException
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
public void flush() throws IOException
刷新此输出流并强制写出所有缓冲的输出字节
pulbic void close() throws IOException
关闭此输出流并释放与此流有关的所有系统资源
Reader字符输入流
继承自Reader的流都是用于向程序中输入数据的,且数据的单位为字符(16位)
read的主要方法:
public int read() throws IOException
读取单个字符,返回作为整数读取的字符,如果已到达流的末尾返回-1
public int read(char[] cbuf) throwsIOException
将字符读入数组,返回读取的字符数
public abstract int read(char[] cbuf,int off, int len) throws IOException
读取 len 个字符的数据,并从数组cbuf的off位置开始写入到这个数组中
public abstract void close() throwsIOException
关闭该流并释放与之关联的所有资源
public long skip(long n) throwsIOException
跳过n个字符。
Writer字符输出流
继承Writer的流都是向程序中输出数据,且数据的单位为字符(16 bit)
public void write(int c) throwsIOException
写入单个字符
public void write(char[] cbuf) throws IOException
写入字符数组
public abstract voidwrite(char[] cbuf, int off, int len) throws IOException
写入字符数组的某一部分
public void write(String str) throwsIOException
写入字符串
public void write(String str,int off, int len) throws IOException
写字符串的某一部分
public abstract void close() throwsIOException
关闭此流,但要先刷新它
public abstract void flush() throwsIOException
刷新该流的缓冲,将缓冲的数据全写到目的地