浅谈Java中的IO流

在进行设备、文件之间的数据传输的时候,如 文件的上传和下载 ,我们可以使用IO流来进行处理。
在对文件和目录进行操作时,我们需要将其包装称为Java程序可以处理的形式,此时,就需要用到File类了。

File类

public class File 
extends Object 
implements Serializable, Comparable<File>

文件和目录路径名的抽象表示形式。
File类可以用来表示文件,也可以用来表示目录。

构造方法

File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname) 
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child) 
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(URI uri) 
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

成员方法

常用的File类的成员方法有:
用于创建的成员方法

public boolean createNewFile() throws IOException
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
public boolean mkdir() 
创建此抽象路径名指定的目录。
public boolean mkdirs() 
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。 

在创建文件或目录时需要注意的是:如果创建文件或者目录忘了写盘符路径,那么就会默认在项目路径下。

用于删除的成员方法

public boolean delete()
删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。

在使用删除功能需要注意的是:使用Java中的删除时,删除是不走回收站的。要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹。

用于重命名的成员方法

public boolean renameTo(File dest)
重新命名此抽象路径名表示的文件。

使用重命名功能需要注意的是:如果原文件和目标文件的路径名相同,则进行的是重命名操作;如果原文件和目标文件的路径名不相同,则执行的是剪切操作。

用于进行判断的成员方法

public boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。 
public boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
public boolean exists()
测试此抽象路径名表示的文件或目录是否存在。 
public boolean canRead()
测试应用程序是否可以读取此抽象路径名表示的文件。 
public boolean canWrite()
测试应用程序是否可以修改此抽象路径名表示的文件。 
public boolean isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。
public boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。

用于获取的成员方法

public File getAbsoluteFile()
返回此抽象路径名的绝对路径名形式。等同于 new File(this.getAbsolutePath())。 
public String getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。 
public File getCanonicalFile() throws IOException
返回此抽象路径名的规范形式。等同于 new File(this.getCanonicalPath())。 
public String getCanonicalPath() throws IOException
返回此抽象路径名的规范路径名字符串。 
public String getPath()
将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。
public String getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
public File getParentFile()
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
public long getTotalSpace()
返回此抽象路径名指定的分区大小。 
public long getFreeSpace()
返回此抽象路径名指定的分区中未分配的字节数。 
public String getName()
返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。 
public long length()
返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。 
public long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。 
public String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 
public File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 
public String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
public File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

了解File类的一些操作之后,我们就可以使用IO流来进行数据的传输了。

IO流概述

IO流是用来处理设备之间的数据传输。Java对数据的操作是以流的方式来进行操作的,Java用于操作流的对象都在IO包中(java.io)。

IO流的分类可按以下方式进行分类:

  • 按照数据的流向(即站在内存的角度):
    输入流 读入数据
    输出流 写入数据
  • 按照数据类型
    字节流:可以读写任意类型的文件,如音频、视频、文本文件等
    字符流:只能读写文本文件

字节流和字符流的选择场景:

  1. 如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
  2. 如果不太清楚的话,就用字节流。

IO流基类

  • 字节流的抽象基类:
    InputStream(字节输入流),OutStream(字节输出流)
  • 字符流的抽象基类:
    Reader,Writer

由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。

FileOutputStream类

public class FileOutputStream extends OutputStream

文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。

构造方法

public FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) 
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(FileDescriptor fdObj) 
创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
FileOutputStream(String name) 
创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) 
创建一个向具有指定 name 的文件中写入数据的输出文件流。

成员方法

最常使用的成员方法是write()和close()。
write()用于写入往指定的文件写入数据。
close()用于关闭打开的流。目的有两个:

  • 通知系统释放关于管理a.txt文件的资源
  • 让Io流对象变成垃圾,等待垃圾回收器对其回收
public void close()
关闭此文件输出流并释放与此流有关的所有系统资源。此文件输出流不能再用于写入字节。 
public void write(byte[] b)
将 b.length 个字节从指定 byte 数组写入此文件输出流中。 
public void write(byte[] b,int off,int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
public void write(int b)
将指定字节写入此文件输出流。实现 OutputStream 的 write 方法。

FileInputStream类

public class FileInputStream extends InputStream

FileInputStream 从文件系统中的某个文件中获得输入字节。

构造方法

FileInputStream(File file) 
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(FileDescriptor fdObj) 
通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
FileInputStream(String name) 
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

成员方法

最常用的成员方法有read()和close()。
read()用于读取数据。
close用于关闭打开的流。

public void close()
关闭此文件输入流并释放与此流有关的所有系统资源。
public int read()
从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。
public int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
public int read(byte[] b,int off,int len)
从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

BufferedOutputStream类

public class BufferedOutputStream extends FilterOutputStream

该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
与FileOutputStream相比,BufferedOutputStream是比较高效的输出流,因为其底层维护了一个byte数组,用作缓冲区。

构造方法

BufferedOutputStream(OutputStream out) 
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size) 
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。

成员方法

最常用的成员方法为write()、flush()和close()。

public void flush()
刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。 
public void write(int b)
将指定的字节写入此缓冲的输出流。 
public void write(byte[] b,int off,int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。 

BufferedInputStream类

public class BufferedInputStream extends FilterInputStream

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

与FileInputStream相比,BufferedInputStream是比较高效的输出流,因为其底层维护了一个byte数组,用作缓冲区。

构造方法

BufferedInputStream(InputStream in) 
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size) 
创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

成员方法

最常用的成员方法有read()和close()。

public int read()
返回下一个数据字节,如果到达流末尾,则返回 -1。 
public int read(byte[] b,int off,int len)
从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。 
返回读取的字节数;如果已到达流末尾,则返回 -1。 

OutputStreamWriter类

public class OutputStreamWriter extends Writer

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

构造方法

OutputStreamWriter(OutputStream out) 
创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) 
创建使用给定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
创建使用给定字符集编码器的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) 
创建使用指定字符集的 OutputStreamWriter。

成员方法

最常见的成员方法为write()、flush()和close()。

public void close() 
关闭此流,但要先刷新它。
public void flush() 
刷新该流的缓冲。
public void write(int c)
写入单个字符。
public void write(char[] cbuf,int off,int len)
写入字符数组的某一部分。 
public void write(String str,int off,int len)
写入字符串的某一部分。

由于转换流的名字比较长,而常见的操作都是按照本地默认编码实现的,所以,为了简化书写,转换流提供了对应的子类即FileWriter。

InputStreamReader类

public class InputStreamReader extends Reader

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

构造方法

InputStreamReader(InputStream in) 
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs) 
创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) 
创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 
创建使用指定字符集的 InputStreamReader。

成员方法

最常使用的成员方法是read()和close()。

public void close()
关闭该流并释放与之关联的所有资源。
public int read()
读取单个字符。 
public int read(char[] cbuf,int offset,int length)
将字符读入数组中的某一部分。

由于转换流的名字比较长,而常见的操作都是按照本地默认编码实现的,所以,为了简化书写,转换流提供了对应的子类即FileReader

BufferedWriter类

public class BufferedWriter extends Writer

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (’\n’) 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

构造方法

BufferedWriter(Writer out) 
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

成员方法

常见的成员方法:

public void close() 
关闭此流,但要先刷新它。
public void flush() 
刷新该流的缓冲。
public void newLine()
写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。
public void write(int c)
写入单个字符。
public void write(char[] cbuf,int off,int len)
写入字符数组的某一部分。
public void write(String s,int off,int len)
写入字符串的某一部分。 

BufferedReader类

public class BufferedReader extends Reader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

构造方法

BufferedReader(Reader in) 
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 
创建一个使用指定大小输入缓冲区的缓冲字符输入流。

成员方法

常见的方法:

public void close() 
关闭该流并释放与之关联的所有资源。
public int read()
读取单个字符。 
public int read(char[] cbuf, int off, int len) 
将字符读入数组的某一部分。
public String readLine()
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。

DataInputStream类

public class DataInputStream extends FilterInputStream implements DataInput

数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
DataInputStream 对于多线程访问不一定是安全的。

构造方法

DataInputStream(InputStream in) 
使用指定的底层 InputStream 创建一个 DataInputStream。

成员方法

该类可以读取基本类型的数据,此处列举几个成员方法为例。

public final int read(byte[] b)
从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。
public int read(byte[] b, int off, int len) 
从包含的输入流中将最多 len 个字节读入一个 byte 数组中。
public final boolean readBoolean()
返回读取的 boolean 值
public final int readInt()
返回此输入流的下四个字节,将它们解释为一个 int。
public final String readUTF()
返回一个 Unicode 字符串。 

DataOutputStream类

public class DataOutputStream extends FilterOutputStream implements DataOutput

数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

构造方法

DataOutputStream(OutputStream out) 
创建一个新的数据输出流,将数据写入指定基础输出流。

成员方法

该类可以写入基本类型的数据,此处列举几个成员方法为例。

public void flush() 
清空此数据输出流。
public void write(byte[] b, int off, int len) 
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入基础输出流。
public void write(int b)
将指定字节(参数 b 的八个低位)写入基础输出流。
public final void writeChar(int v)
将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
public final void writeInt(int v)
将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
public final void writeUTF(String str)
以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。

ByteArrayOutputStream类

public class ByteArrayOutputStream extends OutputStream

此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。

构造方法

ByteArrayOutputStream() 
创建一个新的 byte 数组输出流。
ByteArrayOutputStream(int size) 
创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。

成员方法

public void close()
关闭 ByteArrayOutputStream 无效。
public int size()
返回缓冲区的当前大小。
public byte[] toByteArray()
 创建一个新分配的 byte 数组。
public String toString()
使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。
public String toString(String charsetName)
使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串。
public void write(byte[] b,int off,int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte 数组输出流。
public void write(int b)
将指定的字节写入此 byte 数组输出流。

ByteArrayInputStream类

public class ByteArrayInputStream extends InputStream

ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。
关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。

构造方法

ByteArrayInputStream(byte[] buf) 
创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。
ByteArrayInputStream(byte[] buf, int offset, int length) 
创建 ByteArrayInputStream,使用 buf 作为其缓冲区数组。

成员方法

public void close()
关闭 ByteArrayInputStream 无效。
public int read()
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。
public int read(byte[] b,int off,int len)
将最多 len 个数据字节从此输入流读入 byte 数组。

PrintStream类

public class PrintStream extends FilterOutputStream implements Appendable, Closeable

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream;这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 (’\n’)。

构造方法

PrintStream(File file) 
创建具有指定文件且不带自动行刷新的新打印流。
PrintStream(File file, String csn) 
创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
PrintStream(OutputStream out) 
创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush) 
创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush, String encoding) 
创建新的打印流。
PrintStream(String fileName) 
创建具有指定文件名称且不带自动行刷新的新打印流。
PrintStream(String fileName, String csn) 
创建具有指定文件名称和字符集且不带自动行刷新的新打印流。

成员方法

public void close()
关闭流。
public void flush()
刷新该流的缓冲。
public void print(int i)
打印整数。
public void println(int x)
打印整数,然后终止该行。
public void write(byte[] buf,int off,int len)
将 len 字节从指定的初始偏移量为 off 的 byte 数组写入此流。
public void write(int b) 
将指定的字节写入此流。

PrintWriter类

public class PrintWriter extends Writer

向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。

构造方法

PrintWriter(File file) 
使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter(File file, String csn) 
创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
PrintWriter(OutputStream out) 
根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 
通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter(String fileName) 
创建具有指定文件名称且不带自动行刷新的新 PrintWriter。
PrintWriter(String fileName, String csn) 
创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。
PrintWriter(Writer out) 
创建不带自动行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) 
创建新 PrintWriter。

成员方法

常见的成员方法

public void close()
关闭该流并释放与之关联的所有系统资源。
public void flush()
刷新该流的缓冲。
public void print(int i)
打印整数。
public void println(int x) 
打印整数,然后终止该行。
public void write(char[] buf)
写入字符数组。
public void write(char[] buf,int off,int len)
写入字符数组的某一部分。 
public void write(int c)
写入单个字符。
public void write(String s)
写入字符串。
public void write(String s,int off,int len)
写入字符串的某一部分。 

打印流的特点:

  • 打印流只能操作目的地,不能操作数据源(不能进行读取数据)
  • 可以操作任意数据类型的数据,调用print() 方法可以写任意数据类型
  • 如果启用自动刷新,那么在调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
  • 这个流可以直接对文件进行操作(可以直接操作文件的流:即构造方法的参数可以传递文件或者文件路径)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章