最完整的Java IO流学习总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SilenceOO/article/details/50995062

一、 File类

1、 java.io.File 类是专门对文件进行操作的类。(只能对文件本身进行操作,不能对文件内容操作)
2、 File类是“文件和目录路径名的抽象表示”。 而不是指文件的内容(IO)。
3、 File类定义了一些与平台无关的方法操作,如:创建、删除文件和重命名等。
4、 Java中目录被看成是一个特殊的文件。List()方法可以返回目录中所有的子目录和文件。
5、 在unix下路径分隔符为(/),而在windos中则是为(),在java中可以正确的处理不同系统中的分隔符。

1.1 File类常用构造方法和属性

常用构造方法:
1、public File(String pathname)以pathname为路径创建File对象;如果pathname是相对路径,则是相对于Java的系统属性user.dir中的路径。(对eclipse创建的java工程来说,就是该工程的根目录。)
属性:
2、public static final String separator 存储了当前系统的名称分隔符。在 UNIX 和Mac系统上,此字段的值为 ‘/’;在 Windows 系统上,它为 ‘\’。为了程序的跨平台特性,文件的路径应该用这个属性值来代表。
3、public static final char pathSeparator 存储了当前系统默认路径分割符号。Windows系统是 “ ;” 即path环境变量中,不同的路径的分割符号。

1.2 File类的常用方法

访问File对象所表示的文件或路径的属性:
public boolean canRead() //是否可读
public boolean canWrite() //是否可写
public boolean exists() //文件是否存在
public boolean isDirectory() //是不是目录/路径
public boolean isFile() //是否是文件
public boolean isHidden() //是否是隐藏的
public long lastModified() //最后修改时间
public long length() //以字节为单位(文件长度)
public String getName() //获取文件名称
public String getPath() //创建File对象时,使用什么路径就返回什么路径:是相对就返回相对,是绝对就返回绝对
public String getAbsolutePath() //返回此File对象的绝对路径名
public File getAbsoluteFile()
public String getParent()获取父目录

例如:

import java.io.File;
public  class FileTest{
    public static void main(String[] args){
        File file = new File(args[0]);
        System.out.println("文件或目录是否存在:" +  file.exists());
        System.out.println("是文件吗:" +  file.isFile());
        System.out.println("是目录吗:" +  file.isDirectory());
        System.out.println("名称:" +  file .getName());
        System.out.println("路径: " + file.getPath());
        System.out.println("绝对路径: " + file.getAbsolutePath());
        System.out.println("最后修改时间:" + file.lastModified());    
        System.out.println(“文件大小:” + file.length()+ “ 字节”);         
        ……
    }
}

对文件的操作:
public boolean createNewFile() //不存在时创建此文件对象所代表的空文件
public boolean delete()  //删除文件。如果是目录必须是空才能删除
public boolean mkdir()   //创建此抽象路径名指定的目录
public boolean mkdirs()  //创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
public boolean renameTo(File dest) //重新命名此抽象路径名表示的文件浏览目录中的文件和子目录
public String[] list() //返回此目录中的文件名和目录名的数组
public File[] listFiles() //返回此目录中的文件和目录的File实例数组
public File[] listFiles(FilenameFilter filter) //返回此目录中满足指定过滤器的文件和目录
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤文件名

// level用来记录当前递归的层次
public static void listChilds(File f, int level) {
    // 生成有层次感的空格
    StringBuffer sb = new StringBuffer("|--");
    for (int i = 0; i < level; i++) {
        sb.insert(0, "|  ");
    }
    File[] childs = f.listFiles();
    // 递归出口
    int length = childs == null ? 0 : childs.length;
    for (int i = 0; i < length; i++) {
        System.out.println(sb.toString() + childs[i].getName());
        if(childs[i].isDirectory()){
            listChilds(childs[i], level + 1);
        }
    }
}

二、 流的分类

1、按流向分:
从文件/网络/内存等(数据源)到程序是”读read”的过程,是”输入input”的过程,处理这样的事务的类统称为”输入流”类。
从程序到文件/网络/内存等(数据源)是”写write”的过程,是”输出output”的过程,处理这样的事务的类统称为”输出流”类。
2、按数据处理单位分:
字节流:以字节为单位传输数据的流 8bit = 1byte 处理二进制文件,包括mp3,jpg,exe,doc,ppt,pdf…以Stream结尾的都是字节流.
字符流:以字符为单位传输数据的流 16bit = 2byte=1char 处理文本文件.txt,.java。以Reader结尾的都是输入字符流,以Writer结尾的都是输出字符流。
3、按功能(层次)分:
节点流:用于直接操作目标设备的流(直接跟数据对话的流,基层干部)。
处理流(也叫过滤流):是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更为强大、灵活的读写功能。(跟其他流对话的流,高级干部)。

三、 常用IO流类

3、1四大抽象类

1、InputStream抽象类:继承自InputStream的流都是用于向程序中输入数据的,且数据的单位为字节(8位)。

 InputStream的基本方法:
 public abstract int read() throws IOException {}//从输入流中读取数据的下一个字节, 返回读到的字节值.若遇到流的末尾,返回-1
 public int read(byte[] b) throws IOException {}//从输入流中读取 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 long skip(long n) throws IOException {}//跳过和丢弃此输入流中数据的 n 个字节,返回实现路过的字节数。

2、OutputStream抽象类:继承自OutputStream的流是程序用于向外输出数据的,且数据的单位为字节(8位)。

 OutputStream的基本方法:
 public abstract void write(int b) throws IOException {}//将指定的字节写入此输出流。
 public void write(byte[] b) throws IOException {}// 将 b.length 个字节从指定的 byte 数组写入此输出流。
 public void write(byte[] b, int off, int len) throws IOException {}//将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
 public void flush() throws IOException {}//刷新此输出流并强制写出所有缓冲的输出字节。
 pulbic void close() throws IOException {}//关闭此输出流并释放与此流有关的所有系统资源。

3、Reader抽象类:继承自Reader的流都是用于向程序中输入数据的,且数据的单位为字符(16位)。

 Reader的基本方法:
 public int read() throws IOException {}//读取单个字符,返回作为整数读取的字符,如果已到达流的末尾返回-1
 public int read(char[] cbuf) throws IOException {}//将字符读入数组,返回读取的字符数
 public abstract int read(char[] cbuf, int off, int len) throws IOException {}//读取 len 个字符的数据,并从数组cbuf的off位置开始写入到这个数组中
 public abstract void close() throws IOException {}//关闭该流并释放与之关联的所有资源
 public long skip(long n) throws IOException {}//跳过n个字符。
 public int available()  //还可以有多少能读到的字节数

4、Writer抽象类:继承自Writer的流是程序用于向外输出数据的,且数据的单位为字符(16位)。

 Writer的基本方法:
 public void write(int c) throws IOException {} //写入单个字符
 public void write(char[] cbuf) throws IOException {} //写入字符数组
 public abstract void write(char[] cbuf, int off, int len) throws IOException {} //写入字符数组的某一部分
 public void write(String str) throws IOException {} //写入字符串
 public void write(String str, int off, int len) throws IOException {}//写字符串的某一部分
 public abstract void close() throws IOException {}  //关闭此流,但要先刷新它
 public abstract void flush() throws IOException {}  //刷新该流的缓冲,将缓冲的数据全写到目的地

3、2节点流

1、文件流:主要用来操作文件
JDK提供了4种文件流:
FileInputStream继承自InputStream,
FileOutputStream继承自OutputStream,FileOutputStream(String name, boolean append) ,
FileReader继承自Reader,
FileWriter继承自Writer,还提供了一个FileWriter(String fileName, boolean append) 构造方法来指定是否使用追加模式

FileReader的方法:
    1、构造方法: FileReader(File file) //在给定从中读取数据的 File 的情况下创建一个新 FileReader。
                FileReader(String fileName)// 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
    2、方法:int read() //读取单个字符
            int read(char[] cbuf) //将字符读入数组
            int read(char[] cbuf,int off, int len)//将字符读入数组的某一部分
            void close()//关闭该流并释放与之关联的所有资源。
FileWriter的方法:
    1、构造方法: FileWriter(File file)//根据给定的 File 对象构造一个 FileWriter 对象。
                FileWriter(File file,boolean append)//根据给定的 File 对象构造一个 FileWriter 对象,写入的内容追加在上次写入内容后面。
                FileWriter(String fileName)//根据给定的文件名构造一个 FileWriter 对象。
                FileWriter(String fileName,boolean append)//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。(追加)
    2、方法:void write(int c)//写入单个字符
            void write(char[] cbuf,int off,int len)//写入字符数组的一部分
            void writer(String str,int off,int len)//写入字符串的某一部分
            void flush()//刷新该流的缓冲
            void close()//关闭此流,但要先刷新它

2、内存流:内存流主要用来操作内存
主要有ByteArrayInputStream和ByteArrayOutputStream(byte[] toByteArray()),输入和输出可以从文件中来,也可以将设置在内存之上。
ByteArrayInputStream主要完成将内容从内存读入程序之中,而ByteArrayOutputStream的功能主要是将数据写入到内存中。
内存流程操作步骤:
向内存写出:数据———>>>ByteArrayOutputStream———>>>内存

3、3处理流(过滤流)

1、缓冲流:缓冲流是处理流的一种,建立在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,还增加了一些新的方法。
JDK提供四种缓冲流:
BufferedInputStream 可以对任何的InputStream流进行包装。
BufferedOutputStream 可以对任何的OutputStream流进行包装。
BufferedReader 可以对任何的Reader流进行包装,新增了readLine()方法用于一次读取一行字符串(以‘\r’或‘\n’认为一行结束)返回一行 如果没有返回null。
BufferedWriter 可以对任何的Writer流进行包装,新增了newLine()方法用于写入一个行分隔符。
注意:对于缓冲输出流,写出的数据会先缓存在内存缓冲区中,关闭此流前要用flush()方法将缓存区的数据立刻写出。关闭过滤流时,会自动关闭过滤流所包装的所有底层流。

2、转换流:在IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换流。转换流用于在字节流和字符流之间转换。
JDK提供了两种转换流:
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。InputStreamReader需要和InputStream“套接”,它可以将字节流中读入的字节解码成字符。
OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。OutputStreamWriter需要和OutputStream“套接”,它可以将要写入字节流的字符编码成字节。
转换步骤:
写出数据:程序—>>字符数据—>>字符流—>>OutputStreamWriter(OutputStream)—>>字节流—>>文件
读入数据:程序<<—字符数据<<—字符流<<—-InputStreamReader(InputStream)<<—字节流<<—文件

3、打印流: PrintStream和PrintWriter都属于输出流,分别针对字节和字符。PrintStream和PrintWriter类都提供了一系列重载的print和println方法来输出各种类型的数据。PrintStream和PrintWriter的输出操作不会抛出异常。System.out就是PrintStream的一个实例。

构造方法: PrintStream(OutputStream out)//创建新的打印流。
         PrintStream(OutputStream out, boolean autoFlush)////创建新的打印流,自动刷新缓冲
         PrintWriter(Writer out)//创建不带自动行刷新的新 PrintWriter。
         PrintWriter(Writer out, boolean autoFlush)// 创建带自动刷新的新 PrintWriter。
         PrintWriter(OutputStream out)//根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
         PrintWriter(OutputStream out, boolean autoFlush)//通过现有的 OutputStream 创建新的 PrintWriter,带自动刷新。

4、Object流(对象流):
JDK提供的ObjectOutputStream和ObjectInputStream类是用于存储和读取基本数据类型或对象的过滤流。
用ObjectOutputStream类保存基本数据类型或对象的机制叫序列化.用ObjectInputStream类读取基本数据类型或对象的机制叫反序列化.能被序列化的对象所对应的类必须实现java.io.Serializable这个标识性接口.

    构造方法:public ObjectOutputStream(OutputStream out) throws IOException{}//创建写入指定 OutputStream 的 ObjectOutputStream。
            public ObjectInputStream(InputStream in) throws IOException{}//创建从指定 InputStream 读取的 ObjectInputStream。
    transient关键字: transient关键字修饰成员变量时,表示这个成员变量是不需要序列化。static修饰的成员变量也不会被序列化。实现了Serializable接口的类都应该生成一个private static final long serialVersionUID 序列化版本ID作为标识。

3、4随机访问流(RandomAccessFile)

1、主要功能:主要功能是完成随机读取功能,可以读取指定位置的内容。
2、构造方法:
public RandomAccessFile(File file, String mode)throws FileNotFoundException{}//创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。

3、文件的打开模式:“r” 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
4、常用方法:
length() //返回此文件的长度。
getFilePointer() //返回此文件中的当前偏移量。
skipBytes(int) //尝试跳过输入的 n 个字节以丢弃跳过的字节。
seek(long) //设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
read(byte[] b, int off, int len) //将最多 len 个数据字节从此文件读入 byte 数组。
write(byte[] b, int off, int len) //将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。
writeUTF(String) //使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。
writeBytes(String s) //按字节序列将该字符串写入该文件。
writeChars(String s) //按字符序列将一个字符串写入该文件。
writeBoolean(boolean v) //按单字节值将 boolean 写入该文件。
writeByte(int v) // 按单字节值将 byte 写入该文件。
writeChar(int v) //按双字节值将 char 写入该文件,先写高字节。
writeInt(int v) // 按四个字节将 int 写入该文件,先写高字节。

猜你喜欢

转载自blog.csdn.net/SilenceOO/article/details/50995062