java-I/O流

File类比较重要,在使用流的过程中经常使用File对象。很多人可能会将File对象理解为代表文件,实际上它代表一个特定文件的名称或者一个目录下的一组文件的名称。

1、关于File常见使用如下,其它详见jdk参考考手册

package com.liu;

import java.io.*;

public class Main {

    public static void main(String[] args) throws Exception {

       File file=new File("D:/test/one/me");
       if (file.exists()){
           if (file.isDirectory()) {
               System.out.println(file.getName()+" 目录存在...");
           }else if (file.isFile()){
               System.out.println(file.getName()+" 文件存在...");
           }
       }else {
       // file.createNewFile();//创建文件
       // file.mkdir(); //创建目录
            file.mkdirs(); //创建目录,包括中间目录
       }
        System.out.println(file.getAbsolutePath());//返回此抽象路径名的绝对路径名字符串。
        System.out.println(file.getPath());//将此抽象路径名转换为一个路径名字符串
        System.out.println(file.getParent());//返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
        System.out.println(file.list());//返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
        System.out.println(file.list(new MyFilenameFilter("n"))); //返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
        System.out.println(file.listFiles());// 返回的是对象File[]
        System.out.println(file.listFiles(new MyFilenameFilter("n")));// 返回的是对象File[]
        System.out.println(file.length());//以字节为单位;如果文件不存在,则返回 0L
    }
}
class MyFilenameFilter implements FilenameFilter{
    private String pattern;
    public MyFilenameFilter(String pattern){
        this.pattern=pattern;
    }
    /**
     * 对文件名称进行过滤
     * @param dir
     * @param name
     * @return
     */
    public boolean accept(File dir, String name) {
       if (name.matches(pattern)){
           return true;
       }
       return false;
    }
}

2、文本文件与二进制文件:

什么是文本文件:可以用文本编辑进行增删改查的文件为文本文件;文本文件有对应的文本I/O

什么是二进制文件:除了文本文件外的所有其它文件为二进制文件;二进制文件有对应的二进制I/O

3、文本I/O和二进制I/O

文本I/O是在二进制I/O上提供一了层抽象,用于字符层次的编码和解码功能的,该编码和解码是自动进行的

文本I/O读写过程:向文件写入一个字符时,jvm会将该字符的统一码转化为文件指定的ASCII码(假设文件指定的编码为ASCII码);从文件读取一个字符时候,会将字符对应的ASCII码转化为统一码。

二进制IO读写过程:不需要编码转化

综上可知,二进制IO的效率比文本IO的效率高

4、文本I/O

Reader  InputStreamReader  FileReader  BufferedReader

输入流常用API:

public int read()
         throws IOException
读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

用于支持高效的单字符输入的子类应重写此方法。

返回:
作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误

public int read(char[] cbuf)
         throws IOException
将字符读入数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
参数:
cbuf - 目标缓冲区
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误

public abstract int read(char[] cbuf,
                         int off,
                         int len)
                  throws IOException
将字符读入数组的某一部分。在某个输入可用、发生 I/O 错误或者到达流的末尾前,此方法一直阻塞。
参数:
cbuf - 目标缓冲区
off - 开始存储字符处的偏移量
len - 要读取的最多字符数
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误

BufferedReader有一个特殊的方法:

public String readLine()
                throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
返回:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
抛出:
IOException - 如果发生 I/O 错误

Writer    OutputStreamWriter    FileWriter   BufferedWriter

输出流常用API:

public void write(int c)
           throws IOException
写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。

用于支持高效单字符输出的子类应重写此方法。

参数:
c - 指定要写入字符的 int。
抛出:
IOException - 如果发生 I/O 错误

public void write(char[] cbuf)
           throws IOException
写入字符数组。
参数:
cbuf - 要写入的字符数组
抛出:
IOException - 如果发生 I/O 错误

public abstract void write(char[] cbuf,
                           int off,
                           int len)
                    throws IOException
写入字符数组的某一部分。
参数:
cbuf - 字符数组
off - 开始写入字符处的偏移量
len - 要写入的字符数
抛出:
IOException - 如果发生 I/O 错误
public void write(String str) throws IOException
写入字符串。
参数:
str - 要写入的字符串
抛出:
IOException - 如果发生 I/O 错误

BufferedWriter有一特殊方法

public void newLine()
             throws IOException
写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。
抛出:
IOException - 如果发生 I/O 错误

5、二进制I/O

输入流常用API:

public abstract int read()
                  throws IOException
从输入流中读取数据的下一个字节。返回 0255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

子类必须提供此方法的一个实现。

返回:
下一个数据字节;如果到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误。

public int read(byte[] b)
         throws IOException
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。

如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。

将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0]b[k-1] 的元素中,不影响 b[k]b[b.length-1] 的元素。

InputStreamread(b) 方法的效果等同于:

 read(b, 0, b.length) 
参数:
b - 存储读入数据的缓冲区。
返回:
读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回 -1
抛出:
IOException - 如果不是因为流位于文件末尾而无法读取第一个字节;如果输入流已关闭;如果发生其他 I/O 错误。
NullPointerException - 如果 bnull
public int read(byte[] b,
                int off,
                int len)
         throws IOException

输出流常用API:

public abstract void write(int b)
                    throws IOException
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。

OutputStream 的子类必须提供此方法的实现。

参数:
b - 字节
抛出:
IOException - 如果发生 I/O 错误。尤其是,如果已关闭输出流,则可能抛出 IOException
public void write(byte[] b) throws IOException
b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。
参数:
b - 数据。
抛出:
IOException - 如果发生 I/O 错误。
另请参见:
write(byte[], int, int)

public void write(byte[] b,
                  int off,
                  int len)
           throws IOException

 

posted @ 2018-08-01 15:16  嗜血蚂蚁  阅读(162)  评论(0编辑  收藏  举报