Java读写IO流详解

一、IO流要明确的几点

(1)明确要操作的数据是数据源还是数据目的(是读还是写)

        源/读

        InputStream    Reader

        目的/写

        OutputStream        Writer

(2)明确操作设备上的数据是字节还是文本

        源/读

        字节:InputStream

        文本:Reader

        目的/写

        字节:OutputStream

        文本:Writer

(3)明确数据所在具体地点

        设备:

        硬盘:文件File开头

        内存:数组、字符串

        硬盘:System.in

        网络:Socket

        对应目的地的设备

        硬盘:文件File开头

        内存:数组、字符串

        硬盘:System.out

        网络:Socket

(4)明确是否需要额外功能

        需要转换——转换流 InputStreamReader、OutputStreamWtiter

        需要高效率——缓冲流 Bufferedxxx

       对象序列化——ObjectInputStream、ObjectOutputStream

IO流主要分类:

Java读写IO流详解_第1张图片

二、File概述

 至于IO流,也就是输入输出流,从文件出发到文件结束,至始至终都离不开文件,所以IO流先从文件File类讲起。

File跟流无关,File类不能对文件进行读和写也就是输入和输出!
File主要表示类似D:\\文件目录1D:\\文件目录1\\文件.txt,前者是文件夹(Directory)后者则是文件(file),而File类就是操作这两者的类。

2.1  常用方法(建议熟记)

Java读写IO流详解_第2张图片

绝对路径:一个完整的路径,以盘符开头,例如  F://Java//aaa//b.txt。也可以用单斜杠 /
相对路径:一个简化的路径,不以盘符开头,例如  //aaa//b.txt。也可以用单斜杠 /

以上方方法测试,代码如下【注意测试以自己的电脑文件夹为准】:

public class Test {
    public void creat(File file)throws Exception{
        if (!file.exists());//判断文件是否存在
        file.createNewFile();//创建新的文件
    }
    public void show(File file){
        if (file.exists()){//如果文件存在
            if (file.isFile()){//如果是文件 输出文件信息
                System.out.println("文件名称:"+file.getName());//文件名
                //文件绝对路径
             System.out.println("文件绝对路径:"+file.getAbsolutePath());
             System.out.println("文件相对路径:"+file.getPath());
                //相对路径
                System.out.println("文件大小:"+file.length());//文件字节大小
            }if (file.isDirectory()){//测试文件是否是目录
                System.out.println("此文件是目录");
            }
        }else{
            System.out.println("此文件不存在");
        }
    }
    public void delete(File file){
        if (file.exists()){//如果文件存在
            file.delete();//删除文件
            System.out.println("文件已删除");
        }
    }
    public static void main(String[] args)throws Exception {
        File file=new File("a.txt");//文件名
        Test te=new Test();//创建对象  调动方法
        te.creat(file);//创建文件方法
        te.show(file);// 展示文件信息方法
    }
}

2.2文件目录创建事项

1.如果目录可达,可以直接用 createNewFile() 创建文件,也可用 mkdir() 创建目录

2.如果父级目录不存在,需要先用getParentFile() 获取父级File对象,用父级对象 .mkdirs() 可以递归创建全部的父级目录

Java读写IO流详解_第3张图片

文件File的操作

:createNewFile()     mkdir()     mkdirs()

: delete()     deleteOnExit()

: renameTo()

: getName()    getPath()    getAbsolutePath()     getParentFile()     list()     liftFiles()

三、IO流的定义

        读文件是指把文件中的数据读取到内存中。反之,写文件就是把内存中的数据写到文件中,那通过什么读写文件呢?答案就是

        流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流流出内存的输出流

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据输出也叫做作写出数据

1.1 IO的分类
根据数据的流向分为:输入流 输出流。

划分流的方式:按流向区分、按处理数据单元划分

1.流向区分:输出流:OutputStream 和 Writer作为基类

输入流:InputStream 和 Reader作为基类

2.处理数据单元划分: 字节流:字节输入流InputStream基类

字节输出流OutputStream基类

字符流:字符输入流Reader基类

字符输出流Writer基类

字节流是8位通用字节流,字符流是16位 Unicode 字符流

四、字节流

        字节输入流的基本方法:

        InputStream常用方法:抽象类---基类 (读)

1、 public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

2、int available():可以从输入流中读取的字节数目

3、int read():从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果读到了输入流的末尾,返回-1
4、int read(byte[ ] b):从输入流读取若干字节,把这些字节保存到数组b中,返回的是读取的字节数,如果读到了输入流的末尾,返回-1
5、int read(byte[ ] b,int off,int len):从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标;len 指定读取的字节数目。如果读到了输入流的末尾,返回-1

使用步骤:

1.引入相关的类

2.构造文件输入流 FileInputStream 对象

3.读取文本文件的数据

4.关闭文件流对象

不抛出异常的方法:try catch

Java读写IO流详解_第4张图片

 Java读写IO流详解_第5张图片

抛出异常的方法:throws IOException

Java读写IO流详解_第6张图片

OutputStream字节输出流(抽象类---基类) (写)

常用方法:

1、void write(int c): 往输出流中写入一个一个的字节

2、void write(byte[ ] buf): 往输出流中写入一个字节数组

3、void write(byte[ ] b,int off,int len): 往输出流中写入一个字节数组,off代表开始从字节数组的off位置开始往外写,len代表往外写len长度的字节

4、void colse(): 关闭输出流

5、void flush(): 强制把缓冲区的数据写到输出流中

FileOutputStream创建构造方法:

FileOutputStream(File file)

FileOutputStream(Stream name)

FileOutputStream(Stream name,boolean append) 可以在末尾追加内容

前两种构造方法在向文件写数据时将覆盖文件原有内容

创建FileOutputStream实例时,如果相应的文件不存在,则会自动创建一个空的文件

使用步骤:

1.引入相关的类

2.构造文件输出流 FileOutputStream对象

3.把数据写入文本文件

4.关闭文件流对象

不抛出异常的方法:try catch

Java读写IO流详解_第7张图片

抛出异常的方法:throws IOException

Java读写IO流详解_第8张图片

Java读写IO流详解_第9张图片

五、字符流

字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码)

大纲:

字符输入流(Reader):1.FileReader 、 2. InputStreamReader(解决中文乱码) 、 3.BufferedReader(提高效率)、4.BufferedReader读取包含中文的文件文本时,需要使用InputStreamReader

字符输出流(Writer):1.FielWrtier 、 2. Writer 子类 OutputStreamWriter(解决中文乱码) 、 3.BufferedWriter(提高效率)

1.1

字符输入流(Reader)

以Reader为基类 FileReader,Reader的常用方法以及作用,字符流FileReader的创建方式

1、public void close() :关闭此流并释放与此流相关联的任何系统资源。
2、 public int read(): 从输入流读取一个字符。
3、 public int read(char[ ] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

FileReader类是Reader的孙子类,new FileReader类对象变成实际的字符输入流对象,从而对文件操作

1、FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
2、 FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的字符串名称。

FileReader读取文件流程

1.引入资源 IO流包

2.创建FileReader对象

3.调用相应read()读取文件

4.关闭字符流

Java读写IO流详解_第10张图片Java读写IO流详解_第11张图片

1.2

中文乱码原因:文件与环境编码不一致

获取本地平台的编码:

System.out.println(System.getProperty("file.encoding"));

        字符存入文件是按照字符编码格式编码后存储的

解决方案:(把一个字节流包成一个字符流,同时指定编码格式)

1.手动调整文件编码格式与程序环境编码一致,弊端:可能会导致代码乱码

2.使用Reader子类 InputStreamReader

① InputStreamReader(InputStream in)

②InputStreamReader(InputStream in,Stream charsetName)

Stream charsetName:字符编码格式

BufferedReader类:提高字符流读取文本文件的效率

常用构造方法:BufferedReader(Reader in)

子类BuferedReader特有方法: readLine()

Java读写IO流详解_第12张图片

BufferedReader读取包含中文的文件文本时,需要使用 InputStreamReader

Java读写IO流详解_第13张图片

示例代码:Java读写IO流详解_第14张图片Java读写IO流详解_第15张图片

1.3 字符输出流 Writer及其子类

Writer常用方法其作用 FileWrtier 构建及使用 OutputStreamWriter 解决中文乱码

Writer类常用方法:

1、void write(int c)         写入单个字符。
2、void write(char[ ] cbuf)        写入字符数组。
3、void write(char[ ] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
4、 void write(String str)写入字符串。
5、void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
6、void flush( ) 刷新该流的缓冲。
7、void close() 关闭此流,但要先刷新它。

FileWriter类是Writer的孙子类

覆盖原有内容:

FileWriter(File file)

FileWrtier(String name)

boolean类型的参数构造方法

Java读写IO流详解_第16张图片

FileWriter类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

解决办法: Writer 子类 OutputStreamWriter 的常用构造方法

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out,Stream charsetName)

Java读写IO流详解_第17张图片

BufferedWriter类 和 BufferedReader类一样

提高字符流写文本文件的效率

BufferedWriter类是Writer类的子类

BufferedWriter类带有缓冲区

常用构造方法: BufferedWrtier(Wtiter out)

Java读写IO流详解_第18张图片Java读写IO流详解_第19张图片

六、对象流 (序列化、反序列化)

        序列化:简单的说序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保存或可传输格式的过程。

        反序列化:顾名思义就是与序列化相反,序列化是将对象的状态信息保存到存储介质中,反序列化则是从特定存储介质中读取数据并重新构建成对象的过程

序列化过程:

        1.创建一个对象  输出流 ObjectOutputStream ,它可以包装一个其他类型的输出流,如文件输出流 FileOutputStream

        2.通过对象输出流的 writeObject()方法写对象,也就是输出可序列化对象。

反序列化过程:

        1.创建一个对象  输入流 ObjectInputStream ,它可以包装一个其他类型的输入流,如文件输入流 FileInputStream

        2.通过对象输入流的 readObject()方法读取对象,该方法返回一个 Object 类型的对象,如果程序知道该 Java 对象的类型,则可以将该对象强制转换成其真实的类型。

Java读写IO流详解_第20张图片

你可能感兴趣的:(Java基础专栏,java,JAVA基础,高级特性,io流)