IO流对象的继承关系

20131220172328931.jpg

File类

  • 两个常量(跨平台)

    • 路径分隔符(;):File.pathSeparator

    • 文件分隔符([win]或/[非win]):File.separator

  • java.io.File类:文件和目录路径名的抽象表示形式

  • 通过File对象可以访问文件的属性,创建空文件或目录

  • user.dir:系统依据用户的工作路径来解释相对路径

  • 常用方法之文件名

    • getName()文件名 路径名

    • getPath()路径名

    • getAbsoluteFile()绝对路径所对应的File对象

    • getAbsolutePath() 绝对路径名

    • getParent() 父目录 相对路径的父目录,可能为null,如删除本身后的结果

    • renameTo(File newName) 重命名

  • 常用方法之判断信息

    • exists()

    • canWrite() 不存在的文件默认为文件夹

    • canRead()

    • isFile()

    • isDirectory()

    • isAbsolute()消除平台差异,win以盘符开头,其他以/开头

  • 常用方法之长度

    • length() 字节数,文件夹为0
  • 常用方法之创建 删除

    • createNewFile() 不存在创建新文件,存在返回false

    • delete() 删除文件

    • static createTempFile(前缀3个字节长,后缀默认.temp)默认临时空间

    • static createTempFile(前缀3个字节长,后缀默认.temp,目录)

    • deleteOnExit() 退出虚拟机删除,常用于删除临时文件

  • 常用方法之操作目录

    • mkdir()

    • mkdirs()

    • list() 文件或目录 字符串形式

    • listFiles()

    • static listRoots() 根路径

IO流分类

按数据

  • 字节流:二进制 可以处理一切文件包括纯文本 doc 音频 视频等等

  • 字符流:只能处理纯文本

按功能

  • 节点流:离源头最近的

  • 处理流:增强功能,提高性能

字符流与字节流

字节流

  • 输入流:InputStream read(byte[] b),read(byte[] b,int off,int len),close()

    • FileInputStream
  • 输出流:OutputStream write(byte[] b),write(byte[] b,int off,int len),flush(),close()

    • FileOutputStream

字符流

  • 输入流:Reader read(char[] cbuf),read(char[] cbuf,int off,int len),close()

    • FileReader
  • 输出流:Writer write(char[] cbuf),write(char[] cbuf,int off,int len),flush(),close(),write(String str,int off,int len)

    • FileWriter

操作

  • 与文件建立联系

  • 选择对应流

  • 数组大小 读取(read或write)

  • 释放资源

字节流读取文件与写出文件

读取

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo01 {

    public static void main(String[] args) throws IOException {
        //建立联系 File对象
        File src = new File("F:/a.txt");
        //选择流
        InputStream is = new FileInputStream(src);
        //操作不断读取 缓冲数组
        byte[] car = new byte[1024];
        int len = 0;
        while(-1!=(len=is.read(car))){
            //输出 字节数组转换成字符串
            String string = new String(car);
            System.out.println(string);
        }
        is.close();
    }
}

输出

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Demo02 {

    public static void main(String[] args) throws IOException {
        //建立联系 
        File dest = new File("F:/a.txt");
        //选择流
        OutputStream os = new FileOutputStream(dest,true);//true为追加,false为覆盖,默认为false

        String str = "Matrix42 is very good";
        //字符串转为字节数组
        byte[]  data = str.getBytes();
        os.write(data,0,data.length);
        //强制刷新出去
        os.flush();
        os.close();
    }
}

字符流读取文件与写出文件

读取

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo03 {

    public static void main(String[] args) throws IOException {
        File src = new File("F:/a.txt");
        Reader reader = new FileReader(src);
        char[] data = new char[10];
        int len = 0;
        while(-1!=(len=reader.read(data))){
            String string = new String(data,0,len);
            System.out.print(string);
        }
        reader.close();
    }

}

输出

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Demo04 {

    public static void main(String[] args) throws IOException {
        File src = new File("F:/a.txt");
        Writer writer = new FileWriter(src,true); //true追加
        String string = "乱世用重典沉疴下猛药";
        writer.write(string);
        writer.flush();
        writer.close();
    }
}

处理流

  • 节点流和处理流的关系

    节点流处于io操作的第一线,所有操作必须通过他们进行;处理流可以对其他流进行处理(提高效率或操作灵活性)

缓冲流

  • 字节缓冲流

    • BufferedInputStream

    • BufferedOutputStream

没有新增方法使用时建议加上缓冲流

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo05 {

    public static void main(String[] args) throws IOException {
        //建立联系 File对象
        File src = new File("F:/a.txt");
        //选择流
        InputStream is = new BufferedInputStream(new FileInputStream(src));
        //操作不断读取 缓冲数组
        byte[] car = new byte[1024];
        int len = 0;
        while(-1!=(len=is.read(car))){
            //输出 字节数组转换成字符串
            String string = new String(car);
        }
    }
}
  • 字符缓冲流

    • BufferedReader readLine()

    • BufferedWriter newLine()

使用新增方法不能发生多态

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class Demo06 {

    public static void main(String[] args) throws IOException {
        File src = new File("F:/a.txt");
        BufferedReader reader = new BufferedReader(new FileReader(src));
        String line = null;
        while ((line=reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }

}

转换流

字节流转为字符流,处理编码集 解码集

编码与解码的概念
编码:字符---编码字符集--->二进制
解码:二进制---解码字符集--->字符

出现乱码的两种情况
编码与解码的字符集不统一
字节缺少,长度丢失

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 转换流:字节转为字符
 * 1.输入流:OutputStreamWriter
 * 2.输入流:InputStreamReader
 * @author Matrix42
 *
 */
public class Demo07 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(new File("F:/a.txt")),"UTF-8"));
        String info = null;
        while(null!=(info=br.readLine())){
            System.out.println(info);
        }
        br.close();
    }
}