天天看点

Java IO流基础一、File对象二、字节流三、字符流

目录

一、File对象

1、创建File对象

2、常用方法

3、练习:递归求目录的文件个数

二、字节流

1、字节输入流 InputStream

(1)FileInputStream

(2)字节缓冲输入流 BufferedInputStream

 2、字节输出流OutputStream

(1)FileOutputStream

(2)字节缓冲输出流 BufferedOutputStream

三、字符流

 1、字符输入流Reader

(1)FileReader

(2)字符缓冲输入流  BufferedReader

2、字符输出流 Writer

(1) FileWriter

(2)字符缓冲输出流  BufferedWriter

一、File对象

1、创建File对象

       File(String pathname):根据文件的路径来创建一个File文件对象

2、常用方法

  • length():文件的字节量
  • exists():是否存在,存在返回true
  • isFile():是否为文件,是文件返回true
  • isDirectory():是否为文件夹,是文件夹返回true
  • getName():获取文件/文件夹名
  • getParent():获取父文件夹的路径
  • getAbsolutePath():获取文件的完整路径
  • createNewFile():新建文件,文件夹不存在会异常,文件已经存在返回false
  • mkdirs():新建多层不存在的文件夹\a\b\c
  • mkdir():新建单层不存在的文件夹\a
  • delete():删除文件,删除空文件夹
  • list():返回String[],包含文件名
  • listFiles():返回File[],包含文件对象

3、练习:递归求目录的文件个数

public class Test3 {
        public static void main(String[] args) {
//		1、把指定目录封装成File对象
            File file = new File("D:\\CentOS");
            int size =count(file);
            System.out.println(size);
        }
        private static int count(File file) {
//		2、把文件夹列表列出来
            File[] files = file.listFiles();
            //记录文件个数
            int sum = 0;
            for (int i = 0; i < files.length; i++) {
//		3、判断,如果是文件,sum++
                if(files[i].isFile()) {
                    System.out.println(files[i].getName());
                    sum++;
                }else if(files[i].isDirectory()){
//		4、判断,如果是文件夹,递归
                    //把当前遍历到的文件夹继续循环判断求和
                    sum = sum + count(files[i]);
                }
            }
            return sum ;
        }
           

二、字节流

1、字节输入流 InputStream

InputStream类是字节输入流的抽象类,是所有字节输入流的父类。

输入流是从文件向程序输入的流,需要向文件中读取数据(read)。

InputStream的常用方法:

  • int available​() 从下一次调用此输入流的方法返回可从该输入流读取(或跳过)的字节数,而不会阻塞。
  • void close​() 关闭此输入流并释放与流相关联的任何系统资源。
  • void mark​(int readlimit) 标记此输入流中的当前位置。
  • boolean markSupported​() 测试此输入流是否支持 mark和 reset方法。
  • abstract int read​() 从输入流读取数据的下一个字节。
  • int read​(byte[] b) 从输入流中读取一些字节数,并将它们存储到缓冲器阵列 b 。
  • int read​(byte[] b, int off, int len) 从输入流读取最多 len个字节的数据到字节数组。
  • void reset​() 将此流重新定位到最后在此输入流上调用 mark方法时的位置。
  • long skip​(long n) 跳过并丢弃来自此输入流的 n字节的数据。

(1)FileInputStream

继承了InputStream类, 构造方法如下:

  • FileInputStream(File file)   通过File对象创建一个 FileInputStream
  • FileInputStream(FileDescriptor fdObj)   通过文件描述符 fdObj 创建一个 FileInputStream,其表示在文件系统中的现有连接到一个实际的文件
  • FileInputStream(String name)   通过文件系统中的路径名 name创建FileInputStream。

常用方法如下:

  • int read()   从输入流中读取数据的下一个字节。
  • int read(byte[] b)    从输入流中将n字节 读到byte 数组中,n最大为b.length,返回n。若输入流中的字节数大于n,返回值为n,否则返回实际读取的字节数。
  • int read(byte[] b, int off, int len)    从输入流中读最多 len 个字节到 byte 数组中,返回len。
  • void close()    关闭此输入流并释放与该流关联的所有系统资源。

说明:

  • read():返回读入的一个当前字符,如果达到文件末尾,返回-1.
  • 异常处理:为了保证流资源一定可以执行关闭操作,需要捕获异常。

(2)字节缓冲输入流 BufferedInputStream

        BufferedInputStream 为一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组(默认大小8M),实现批量读取数据。

构造函数如下:

  • BufferedInputStream(InputStream in)   通过InputStream创建BufferedInputStream 。
  • BufferedInputStream(InputStream in, int size) 通过InputStream创建BufferedInputStream ,缓冲区大小为size

常用方法:

  • int read()  从输入流中读取数据的下一个字节
  • int read(byte[] b, int off, int len) 
  • void close​() 关闭流,先刷新。
  • void flush​() 刷新流。

 2、字节输出流OutputStream

字节输出流是从程序中输出的流,要往文件中写数据(write)。

(1)FileOutputStream

构造方法如下:

  • FileOutputStream(File file)   向指定 File 对象表示的文件中写入数据。
  • FileOutputStream(File file, boolean append)   向指定 File 对象表示的文件中添加数据,后面的布尔类型决定向文件中添加内容时是否覆盖原有内容。
  • FileOutputStream(FileDescriptor fdObj)   向指定文件描述符处写入数据,该文件描述符表示一个到文件系统中的某实际文件的现有连接。
  • FileOutputStream(String name)    向具有指定名称的文件中写入数据。
  • FileOutputStream(String name, boolean append)    向具有指定 name 的文件中添加数据,后面的布尔类型决定添加到文件中的内容是否覆盖原有内容。

常用方法如下:

  • void write(byte[] b)    将 b.length 个字节从指定 byte 数组写入此文件输出流中。
  • void write(byte[] b, int off, int len)    将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
  • void write(int b)   将指定字节写入此文件输出流。
  • void close()  关闭此输出流并释放与该流关联的所有系统资源。

(2)字节缓冲输出流 BufferedOutputStream

构造方法如下:

  • BufferedOutputStream(OutputStream out)  通过OutputStream创建BufferedOutputStream。
  • BufferedOutputStream(OutputStream out, int size)                                                                   通过OutputStream创建BufferedOutputStream,缓冲区大小为size。

常用方法如下:

  • void write(byte[] b, int off, int len)   将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
  • void write(int b)  将指定的字节写入缓冲输出流的缓冲数组。
  • void close​() 关闭流,先刷新。
  • void flush​() 刷新流。

三、字符流

 1、字符输入流Reader

Reader是字符输入流的基类,Reader的方法列表如下:

  • void close​() 关闭流并释放与之相关联的任何系统资源。
  • void mark​(int readAheadLimit) 标记流中的当前位置。
  • boolean markSupported​() 告诉这个流是否支持mark()操作。
  • int read​() 读一个字符
  • int read​(char[] cbuf) 将字符读入数组。
  • int read​(char[] cbuf, int off, int len) 将字符读入数组的一部分。
  • int read​(CharBuffer target) 尝试将字符读入指定的字符缓冲区。
  • boolean ready​() 告诉这个流是否准备好被读取。
  • void reset​() 重置流。
  • long skip​(long n) 跳过字符

(1)FileReader

FileReader用来读取字符文件。

构造方法如下:

  • FileReader(File file)      通过File对象创建 FileReader。
  • FileReader(FileDescriptor fd)   通过FileDescriptor创建FileReader。
  • FileReader(String fileName)    通过文件名创建FileReader,

方法如下:

  • int  read()  读取单个字符,返回字符的ASCII码。
  • int  read(char[] cbuf)  将字符读入数组,返回读入数据的个数。
  • int  read(char[] cbuf, int off, int len)  将字符读入数组的某一部分。
  • int  read(CharBuffer target)  试图将字符读入指定的字符缓冲区。
  • void close​() 关闭流,先刷新
  • void flush​() 刷新流

(2)字符缓冲输入流  BufferedReader

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

构造函数如下:

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

常用方法如下:

  • int  read()  读取单个字符。
  • int  read(char[] cbuf, int off, int len)  将字符读入数组的某一部分。

2、字符输出流 Writer

Writer是字符输出流的基类,Writer的主要方法如下:

  • void close​() 关闭流,先刷新
  • void flush​() 刷新流
  • void write​(char[] cbuf) 写入一个字符数组。
  • void write​(char[] cbuf, int off, int len) 写入字符数组的一部分
  • void write​(int c) 写入一个字符
  • void write​(String str) 写入一个字符串
  • void write​(String str, int off, int len) 写入一个字符串的一部分

(1) FileWriter

继承了Writer类,构造函数如下:

  • FileWriter(File file)    通过File 对象创建一个 FileWriter 对象。
  • FileWriter(File file, boolean append)    通过File 对象创建一个 FileWriter 对象,后面的布尔类型决定向文件中添加内容时是否覆盖原有内容。
  • FileWriter(FileDescriptor fd)    通过文件描述符创建FileWriter 对象。
  • FileWriter(String fileName)    通过文件名创建一个 FileWriter 对象。
  • FileWriter(String fileName, boolean append)    通过文件名创建一个 FileWriter 对象,后面的布尔类型决定添加到文件中的内容是否覆盖原有内容。

常用方法如下:

  • void  write(char[] cbuf)  写入字符数组。
  • void  write(int c)   写入单个字符。
  • void  write(String str)  写入字符串。
  • void  write(char[] cbuf, int off, int len)  写入字符数组的某一部分。
  • void  write(String str, int off, int len)  写入字符串的某一部分。

(2)字符缓冲输出流  BufferedWriter

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

构造方法如下:

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

writer方法如下:

  • void  write(char[] cbuf, int off, int len)  写入字符数组的某一部分。
  • void  write(int c)  写入单个字符。
  • void  write(String s, int off, int len)  写入字符串的某一部分。