java SE 17 火推 IO流

来源:互联网 发布:藏宝库 源码代下载 编辑:程序博客网 时间:2024/06/05 21:04

SE 17


1.  接收输入2.  进行处理3.  输出给用户

输入流I与输出流O

这是一种相对的概念 :例如:    程序读取一段文件,   相对于程序而言, 在进行输入操作      但是相对于文件来说, 文件在向外写文字 , 在进行输出操作 !    程序向本地文件 , 写出一段文字:         相对于程序而言, 在进行输出操作         相对于本地文件来说, 在进行输入操作站在程序员的  角度:      我们关注的是 当前程序的输入(读) /  输出(写)操作

流的分类

1.  读流Input / 写流Output  *** 2.  字节(byte)流:  ***    主要是对字节的输入输出操作,           输入:  顶级父: InputStream        输出:  顶级父: OutputStream3.  字符(char)流  ***    主要是对于字符的输入输出操作        输入:  顶级父: Reader        输出:  顶级父: Writer

OutputStream

void close() : 关闭流, 并释放占用的硬件资源 !  *****void flush() : 刷新管道, 并强制将缓冲管道中的数据 写出到一个接收器中 ! *****void write(int b): 每次写一个字节void write(byte[] bytes): 每次写一个字节数组void write(byte[] bytes,int startIndex,int endIndex): ***** 每次写一个字节数组中的一部分 .  (指定开始下标和结束下标)
FileOutputStream
构造方法FileOutputStream(File file) *****    创建一个指向指定文件的文件输出流! 默认不是追加模式!    参数1. 写流指向的文件 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !FileOutputStream(File file,boolean append)  *****    创建一个指向指定文件的文件输出流! 可以指定是否追加    参数1. 写流指向的文件 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !    参数2.    是否采用追加模式, true表示采用FileOutputStream(String pathName) *****    创建一个指向指定文件的文件输出流! 默认不是追加模式!    参数1. 写流指向的文件地址 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !FileOutputStream(String pathName,boolean append) *****    创建一个指向指定文件的文件输出流! 可以指定是否追加    参数1. 写流指向的文件地址 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !    参数2.    是否采用追加模式, true表示采用

写数据的三种方式

    // 准备要写出的数据    byte[] bytes = "董飞对高帆说: 说好一起到白头, 你却偷偷染了头!!!".getBytes();    // 准备一个文件, 用来向其写数据    File file = new File("C:\\code\\code15\\code15_1\\day17_IODemo\\data\\demo1.txt");    //创建流    FileOutputStream fos =  new FileOutputStream(file);

    一次写一个字节    // 遍历数组一次写出一个字节        for (byte b : bytes) {            fos.write(b);        }    fos.close();

一次写出一个字节数组     * 三种方式      * 写数据2. 一次写出一个字节数组    fos.write(bytes);    fos.close();

一次写一个字节数组的一部分 *****     FileOutputStream fos = new FileOutputStream(file,true);     * 三种方式      * 写数据3. 一次写出一个字节数组的一部分    fos.write(bytes,0,bytes.length/2);    fos.close();

InputStream

输入流注意:     关于流的读取 , 因为我们不知道文件 或者 被读取的其他资源 具体的大小 , 那么就需要通过循环读取,  直到读取不到数据     一般在读取时,  表示读取到尾部的返回值为 :  -1;void close() : 关闭输入流, 并释放资源! *****int read(): 一次读取一个字节, 并返回 , 读取到文件尾部返回-1int read(byte[] b) 一次读取一个字节数组的数据, 并存储到数组b中 , 返回读取的字节个数,读取到文件尾部返回-1  *****int read(byte[] b,int offIndex,int length)        参数1. 读取时数据存储的缓冲区        参数2. 读取时数据的偏移量        参数3. 读取的数据存储的最大下标 (个数)

读取的三种方式

1.  准备一个文件对象, 读取它    File file = new File("C:\\code\\code15\\code15_1\\day17_IODemo\\data\\demo1.txt");2.  准备一个字节数组, 用来存放读取的数据    byte[] bytes = new byte[(int) file.length()];    FileInputStream fis = new FileInputStream(file);

1. 一次读取一个字节数组    byte b = 0;    int index = 0;    //将所有的数据, 读取到内存中的byte数组中    while((b = (byte) fis.read())!=-1) {        bytes[index] = b;        index++;    }

2. 一次读取一个字节数组 *****    int length = fis.read(bytes);

3. 一次读取一个字节数组,并指定长度    int length = fis.read(bytes,0,(int)file.length());

练习 ***

使用读流, 读取一个文件,  再通过写流, 将读取的数据 写入到另外一个文件夹, 文件名称保持一致!

Data流 熟练

具备读取和写入Java中基本数据类型的装饰流 ! 装饰流:   本身不具备读和写的能力, 只是用于基本流的装饰而已 !

把变量或对象存储到本地硬盘的操作 , 我们称其为数据的序列化操作 !DataOutputStream : 可以用来完成基本数据类型数据的序列化操作!DataInputStream : 可以用来完成基本数据类型数据的反序列化操作!

字符流

字符输出流 ***

Writer只要是字符流 , 都存在缓冲的概念,每次写数据 都需要flush 刷新缓冲区 !注意一点:  关闭流时,  会自动执行刷新操作 , 然后关闭 !

FileWriter *

构造方法
构造方法FileWriter(File file)    创建一个指向指定文件的文件字符输出流! 默认不是追加模式!    参数1. 写流指向的文件 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !FileWriter(File file,boolean append)    创建一个指向指定文件的文件字符输出流! 可以指定是否追加    参数1. 写流指向的文件 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !    参数2.    是否采用追加模式, true表示采用FileWriter(String pathName)    创建一个指向指定文件的文件字符输出流! 默认不是追加模式!    参数1. 写流指向的文件地址 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !FileWriter(String pathName,boolean append)    创建一个指向指定文件的文件字符输出流! 可以指定是否追加    参数1. 写流指向的文件地址 , 这个文件可以不存在, 会默认创建 ,但是文件夹必须存在 !    参数2.    是否采用追加模式, true表示采用
常用方法
void write(String text); *****    写一个字符串到文件中  void write(char[] cbuf)       写入字符数组。 void write(char[] cbuf, int off, int len)       写入字符数组的某一部分。 void write(int c)       写入单个字符。 

字符输入流 Reader

FileReader 文件字符输入流

构造方法
FileReader(String fileName)    创建一个从指定文件路径中读取数据的  字符文件输入流FileReader(File file)    创建一个从指定文件中读取数据的 字符文件输入流
常用方法
close() 关闭并释放资源int read();  读取一个字符int read(char[] chars) ; 一次读取一个char数组, 并返回读取的字符数量  *****int read(char[] chars, int startIndex,int endIndex): 一次读取一个char数组 , 并指定读取的范围 !

转换流***

用来将字节流转换为字符流的 操作 !在使用上, 除了构造方法中 需要传入基本流 和 字符集以外 , 其它地方与FileWriter 和 FileReader 完全一致 !下述的笔记, 就不再记录常用方法,  与FileWriter 和 FileReader 完全一致 !
转换输出流
OutputStreamWriter构造方法:     OutputStreamWriter(OutputStream os);        根据传入的字节流, 按照系统默认的编码 转换为字符输出流!    OutputStreamWriter(OutputStream os,String charset);        根据传入的字节流, 按照指定的编码 转换为字符输出流!        参数2. 指定的编码名称, 例如:  UTF-8,GBK,ISO-8859-1
转换输入流
InputStreamReader构造方法:    InputStreamReader(InputStream is);        根据传入的字节流, 按照系统默认的编码 转换为字符输入流!    InputStreamReader(InputStream is,String charset);        根据传入的字节流, 按照指定的编码 转换为字符输入流!        参数2. 指定的编码名称, 例如:  UTF-8,GBK,ISO-8859-1

特殊的字符流, 逐行读取 和 逐行打印 流 ! ***

BufferedReader (也称为: 缓冲读取流)

构造方法BufferedReader(Reader in)       创建一个使用默认大小输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int sz)       创建一个使用指定大小输入缓冲区的缓冲字符输入流。 

常用方法String readLine() :  读取一行数据 , 如果读取到文件尾部返回null

经典  字节转换后 逐行读取代码:     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("c:\\d.txt")));    /**     * 上述三句代码的简写格式:      */    String text = null;    while((text = br.readLine())!=null) {        System.out.println(text);        System.out.println("------------------------");    }

PrintStream 和 PrintWriter (也称为 打印流)

构造方法:     PrintStream/PrintWriter(File file)      创建具有指定文件且不带自动行刷新的新打印流。     PrintStream/PrintWriter(File file, String csn)      创建具有指定文件名称和字符集且不带自动行刷新的新打印流 

作业

1.  实现文件的分割 ,  将一个完整的大文件, 分割为n小份 , n的数量自己定!     要求: 文件分割后 , 再编写一个读取的文件, 将所有文件再还原为一个 !  并且大小不能变化  , 还可以打开 !    文件无要求, 可以是视频,图片,音乐,压缩包 ,安装包等2.  扩展: 实现学生管理系统, 并通过字符流, 将学生信息存储到本地硬盘中, 在程序每次启动时, 可以载入程序 !3.  闲着无聊的, 以上*n