I O各类文件流的特性详解 & 关联关系解析

I/O流之 各类流的特性及使用解析
一、I/O的文件和文件流体系总览
(一)File类

1、对文件的解析描述

【引入】

<1>程序中的数据都是 存储在内存中, 集合、数组、变量 ,缺点:程序一关,数据丢失

永久性存储数据:

1、数据存到文件(磁盘)

2、数据存储在数据库
……

2、File类的常见方法

<1>、特点:

程序中一个File实例对应 磁盘中的一个文件或目录

<2>、创建对象三种方式如下:

File file =new File(文件或目录的路径名);

File file =new File(父级目录,子级名);

1> File file = new File("src/stu.txt");
2> File file = new File(File parent,String  child);
3> Filefile=new File(String parent,String child);

<3>、常用方法:

    获取文件本身信息
        getName
        getParent
        getPath
        getAbsolutePath
        length

    判断文件信息
        isFile
        isDirectory
        exists
        isHidden

    创建、删除、重命名
        创建一级目录mkdir
        创建多级目录mkdirs
        立即删除 delete
        程序退出删除 deleteOnExit
        重命名 rename
        list 列出当前目录下 的子级目录或文件,返回类型String[]
        listFiles列出当前目录下的字节目录或文件,返回类型File[]

    重写Object类的方法
        equals
        toString

3、使用举例(见I/O流使用代码实践示例)

    1.先判断有没有此目录,如有删除,没有创建,并在里面创建文件,然后获取文件信息
    2.列出 指定目录下 的所有的子级目录或文件名

(三)、I/O文件流

<1>相关概念:

IO:
    Input/Output 输入输出

流:
    数据 在程序 和 节点之间的传输

节点:

    源节点
        文件、网络、键盘
    目标节点
        文件、网络、控制台

输入:
    数据 从源节点到 程序

输出:
    数据从程序到目标节点

<2>分类

按传输方向不同:
  <1>输入流
  <2>输出流

按传输单位不同

    字节流
    字符流
按流的功能不同
    基础流
    包装流(增强流/过滤流)

按传输单位不同
   字节流
   字符流

按流的功能不同
   基础流
   包装流(增强流/过滤流)

《二》框架体系:

(一)各种常见流的框架示例

<1>InputStream字节输入流

     FileInputStream文件字节输入流
        创建对象:
            通过构造,指向一个文件或路径

        方法:
            read
            close

     BufferedInputStream字节缓冲流
        创建对象:
            通过构造,指向一个InputStream对象

        方法:
            read
            close

     ObjectInputStream反序列化流
        创建对象:
            通过构造,指向一个InputStream对象

        方法:
            readXX()
                读取基本类型
            readObject()
                读取对象
            close()

  <2>OutputStream字节输出流

    FileOutputStream文件字节输出流
        创建对象:
            通过构造,指向一个文件或路径,还可以设置一个boolean值,代表是否追加内容

        方法:
            write(char)
            write(byte[])
            write(byte[],int offset,int len)
            close()

    BufferedOutputStream 字节缓冲流
        创建对象:
            通过构造,指向一个OutputStream对象

        方法:
            write(char)
            write(byte[])
            write(byte[],int offset,int len)
            close()

    ObjectOutputStream序列化流
        创建对象:
            通过构造,指向一个OutputStream对象

        方法:
            writerXX
                写入基本类型
            writeObject
                写对象
            close()

<3>Reader字符读取流

    FileReader文件字符读取流
        同 FileInputStream的使用,只是 byte换成了 char

    BufferedReader字符缓冲流
        同BufferedInputStream的使用
        多出来的方法
            readLine

<4>Writer字符写入流

    FileWriter文件字符写入流
        同 FileOutputStream的使用,只是 byte换成了char
        多出来的方法
            write(string)
            write(string,int offset,int len)

    BufferedWriter字符缓冲流
        同BufferedOutputStream的使用
        多出来的方法
            newLine()

<5>其他小流

    ①标准输入、输出
        System.in标准输入,类型: InputStream
        System.out标准输出,类型 :PrintStream
        System.err 标准错误,类型:PrintStream

        重定向
            System.setIn();
            System.setOut();
            System.setErr();

    ②打印流
        1.打印流 只有 PrintStream和PrintWriter
        2.只有输出,没有输入
        3.里面提供了一系列 打印方法print、println、printf方法,而且可以直接打印基本数据类型
        4.永远不会抛出异常,除了 构造方法
        5.有自动刷新功能,但是必须 在换行结束后 才有

    ③转换流
        1.转换流只有 InputStreamReader和OutputStreamWriter
        2.将字节流转换成字符流,如果读写的文件中只有字符,用转换流转换后效率会高一些

    ④数据流
        1、数据流 只有 DataOutputStream和DataInputStream
        2、数据流和对象流  都实现了  同样的接口,DataInput和DataOutput,都 具备读写基本类型的方法
        3、读写顺序要一致

    ⑤随机访问流
        1、只有一个 RandomAccessFile
        2、既可以读,又可以写
        3、自带指针,每次读写,指针自动后移指定读写数据的字节数
        4、可以通过 seek方法,自由移动指针,也可以通过getFilePointer获取指针位置

    ⑥字节数组流
        ByteArrayOutputStream和ByteArrayInputStream
        特点:可以直接使用 toByteArray() 和 toString() 获取数据。 

(二)使用步骤

1、创建流对象(选择哪个流)
2、调用读取或写入
3、关闭流
四、IO流的几种不同流类如下:
字节输入流
InputStream
    FileInputStream 文件字节输入流
    BufferedInputStream 字节缓冲输入流(增强流)
    ObjectInputStream 对象输入流
    DataInputStream   数据输入流


字节输出流
OutputStream
    FileOutputStream 文件字节输出流
    BufferedOutputStream 字节缓冲输出流(增强流)
    ObjectOutputStream 对象输出流
    DataOutputStream   数据输出流


字符读取流(输入流)
Reader
    FileReader
    BufferedReader
    InputStreamReader


字符写入流(输出流)
Writer
    FileWriter
    BufferedWriter
    OutputStreamWriter

了解:

PrintStream,PrintWriter

RandomAccessFile 随机访问流

FileInputStream和FileOutputStream

文件字节流

(1)、FileInputStream 文件字节输入流

创建对象:

FileInputStream fis = new FileInputStream(string path);

FileInputStream fis = new FileInputStream(new File(path));

方法:

read() 读取单个字节,返回该字节的 整数形式,,如果到文件末尾返回-1

read(byte[] ) 读取 多个字节到数组中,返回读取的长度,如果到文件末尾返回-1

read(byte[] ,int offset,int len) 读取 多个字节到 指定范围的数组中,返回读取的长度,如果到文件末尾返回-1

close 关闭流

(2)、FileOutputStream 文件字节输出流

创建对象:

FileOutputStream fos = new FileOutputStream(string path);

FileOutputStream fos = new FileOutputStream(string path,boolean f);


FileOutputStream fos = new FileOutputStream(File path);

FileOutputStream fos = new FileOutputStream(File path,boolean f);

方法:

write(char) 写入单个字节

write(byte[]) 写入整个字节数组

write(byte[],int offset,int len) 写入 字节数组的一部分


close 关闭流

其它相关的API:

String str = new String(byte[]); 将字节数组转换成字符串
String str = new String(byte[],int offset,int len); 将字节数组的一部分转换成字符串

String str = new String(char[]); 将字符数组转换成字符串
String str = new String(char[],int offset,int len); 将字符数组的一部分转换成字符串



字符串.getBytes()              将字符串转换成byte[]

字符串.toCharArray()               将字符串转换成char[]

(3)、缓冲流

功能:提高 被包装流类的 效率

1.BufferedInputStream
用于增强 InputStream派系的类

构造: 参数为InputStream
方法: 同FileInputStream

2.BufferedOutputStream
用于增强 OutputStream派系的类

构造: 参数为OutputputStream
方法: 同FileOutputStream

3.BufferedReader

用于增强 Reader派系的类

构造: 参数为Reader
方法: 多了  readLine

4.BufferedWriter

用于增强 Writer派系的类


构造: 参数为Writer
方法: 多了  newLine

(4)对象流

属于包装流,包装 字节输入流和字节输出流

功能:读写基本数据类型 和对象类型

特点:

ObjectOutputStream : 对象写入流(序列化流)

writeObject:序列化对象的方法


ObjectInputStream:对象读取流(反序列化流)

readObject:反序列化对象的方法

序列化:

对象 持久化到 磁盘文件或网络,保证  存储和读取 的对象是同一个

反序列化:

将磁盘文件或网络中的对象 读取到内存,保证  存储和读取 的对象是同一个

1、ObjectOutputStream

构造:

参数:  OutputStream

方法:

writeInt
writeChar
writeDouble

writeUTF


writeObject

2、ObjectInputStream

构造:

参数:  InputStream

方法:

readInt
readChar
readDouble

readUTF
readObject

注意:

1、 读写 顺序要一致!!!

2、  读写的对象要实现序列化接口

    Serializable

(5)、标准输入输出流

System.in 类型 为 InputStream
System.out 类型 为 PrintStream
System.err类型为PrintStream


重定向输入输出:

System.setIn();
System.setOut();
System.setErr();

(6)、打印流

 * 1、  提供了非常便利的  print、println、printf方法,可以直接打印 各种类型 的字符串形式
 * 
 * 2、 调用打印或写入方法时,不会抛出IOException,  (构造方法除外)
 * 
 * 3、 打印流有自动刷新功能,但是必须 在 换行标记之后
 * 
 * 4、直接可以应用在标准输出流中
 * 
 * System.out 的类型 就是 PrintStream
 * 
 * System.out得到一个PrintStream对象,可以直接调用 里面的一系列方法
 * 
 * 5、没有输入,只有输出
 * 
 * 打印流:PrintStream和PrintWriter
 * 
 * 
 * 6、可以在构造方法 中指定编码格式

7、转换流

1、功能:转换流提供了在字节流和字符流之间的转换

2、InputStreamReader和OutputStreamWriter

3、好处:字节流中的数据都是字符时,转成字符流操作更高效。
   还可以使用字符流的一些特有的方法

8、随机访问流

1、既可以读,又可以写

2、自带指针,可以自由移动指针 ,通过 seek方法,设置读写 指定位置的 数据,正向反向皆可
 * 
3、默认 的,最开始 指针是在文件头,每调用一次read/write,按读取/写入的字节 ,指针往前移动

9、数据流
数据流:DataInputStream和DataOutputStream

 * 可以 读写 基本数据类型和 String
 * 
 * 注意读写顺序一致
 * 和对象流 一样都实现了DataInput和Output
五、字符编码
1、常见的编码表
ASCII:美国标准信息交换码。0-255
用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表  。比较适合处理英文
用一个字节的8位表示。
GB2312:中国的中文编码表。 Gbk>gb2312
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。 固定长度的编码
所有文字都用两个字节来表示,Java语言使用的就是unicode
UTF-8:最多用三个字节来表示一个字符。
2、关于乱码
解码和编码时 使用的编码表不一致造成的!!
或

读写数据时 使用的编码表不一致造成的!!
解决:

读和写的时候 ,要统一编码
★★★★★

1、按 指定的字符集格式,将字符串(编码)转换成字节数组
    //str.getBytes(“字符集”);

2、按指定的字符集格式,将 字节数组(解码)转换成 字符串
    //String str = new String(byte[],"字符集");
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值