一、概述

流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象 ;其作用是为数据源和目的地建立一个输送通道。

IO流:是程序中一套用于数据传输的机制。IO流是Input流和Output流的简称。流的输入输出是以程序为参照物。

1、输入流

数据从外部流向程序。例如读取文件,就是从外部流入程序。

2、输出流

数据从程序流向外部。例如将程序中的数据写入到文件中。

二、输入输出流的分类

1、根据方向可分为:输入流和输出流

2、根据形式:分为字符流(字符类型文件:txt、java、html等)和字节流(图片、视频、音频等)。

3、四大基本流都是抽象类,都不能直接创建对象。

4、数据的来源/目的地:磁盘、网络、内存和外部设备。

三、文件字符流

1、从文件中读取数据:FileReader类

FileReader类时Reader的一个实现子类。FileReader对象中常用的是read方法,返回读取的字符串个数。

不传入数组,源码中会自动创建一个长度为1的数组,将读取值放入到数组中,返回读取到的字符值;传入数组,底层会将读取到的字符放入到对应数组中,并返回读取到的字符个数。

示例如下:

        //1.每次读取一个字符
//创建了一个输入流对象指向D盘下的a.txt
//文件字符输入流没有缓冲区
FileReader reader = new FileReader("D:\\a.txt"); //读取数据
//每次只读取一个字符,所以返回值也就是表示读取到的这个字符
// int i1 = reader.read();
// System.out.println(i1);
//定义一个变量记录每次读取的字符
int i;
//读取到末尾会返回 -1
//这种写法是错误的,表示读一个跳一个
// while((i = reader.read()) != -1) {
// System.out.println(reader.read());
// }
//
while((i = reader.read()) != -1) {
System.out.println(i);
}
//关流
reader.close(); //2.每次读取多个字符
FileReader reader = new FileReader("D:\\a.txt"); //定义一个字符数组作为缓冲区
char[] cs = new char[5]; //将数据读取到缓冲区
// reader.read(cs);
// System.out.println(new String(cs)); //返回值表示本次读取到的字符个数
//定义一个变量记录读取的个数;
//文件中一共有11个字符
//第一次读取的时候,读取到了5个字符,所以len的值为5
//第二次读取的时候,读取到了5个字符,所以len的值为5
//第三次读取的时候,读取到了1个字符,所以len的值为1
//第四次读取的时候,读取到了文件末尾,所以len的值为-1 int len;
//将读取到的数据放到数组中,而返回值表示王数组中放的字符个数
while((len = reader.read(cs)) != -1) {
//String(value, offset, len)
//从value数组的第offset为开始,将len个元素转为字符串
System.out.println(new String(cs, 0 , len));
}
reader.close();

2、向txt文件中写入字符串 --FileWriter

FileWriter类时Writer的一个实现子类。FileWriter对象中常用的是write方法,表示将数据写入到文件中。

示例如下:

//创建一个新文件
//如果原文件不存在,则操作创建的这个新文件
//如果源文件已存在,则利用新文件覆盖源文件
FileWriter writer = new FileWriter("D:\\a.txt"); //写出数据
//在写数据的时候,这个数据并不直接写到文件中而是先写到缓冲区中
//当缓冲区写满了之后,再将缓冲区中的数据写入到文件中
//在缓冲区没有写满的时候,程序就已经结束
//结果导致数据死在了缓存区
writer.write("detgagf"); //冲刷缓冲区
//将数据从缓冲区中冲到文件中
writer.flush(); //关闭流
//为了释放文件以允许别的流来操作这个文件
//流一旦关闭,就不能再次开启
//close之前,流自动进行一次flush操作,以避免有数据死在缓冲区
writer.close(); //清空引用将其标记为垃圾对象
writer = null;

四、文件字节流

1、文件字节输入流 FileInputStream

FileInputStream类时InputStream的一个实现子类。FileInputStream对象中常用的是write方法,表示将数据写入到文件中。 文件字节流没有缓冲区,可定义字节数组作为缓冲区。示例如下

FileInputStream in = new FileInputStream("D:\\b.txt");

        //读取到的是字节

        //定义一个字节数组作为缓冲区
byte[] bs = new byte[10];
int len;
while((len = in.read(bs)) != -1) {
System.out.println(new String(bs, 0 , len));
}
in.close();

2、文件字节输出流 FileOutputStream

FileOutputStream类时OutputStream的一个实现子类。FileOutputStream对象中常用的是write方法,表示将数据写入到文件中。可以定义一个字节数组作为缓冲区。

示例如下:

FileOutputStream fs = new FileOutputStream("D:\\b.txt");

        //写出数据
//字节输出流没有缓冲区
fs.write("abc".getBytes()); //关流
fs.close();

五、缓冲流

1、字符输入缓冲流  BufferedReader

在构建的时候需要传入一个Reader对象。真正读取数据依靠的是传入的这个Reader对象,BufferedReader从Reader对象中获取数据提取到缓冲区。其本质是FileReader的一个包装类。省去了程序员人为为FileReader提供数组缓冲区的步骤。

示例如下:

//真正读取文件的是FileReader
//FileReader本身没有缓冲区
FileReader reader = new FileReader("D:\\a.txt"); //BufferedReader将FileReader读取的数据进行缓冲
//BufferedReader提供缓冲区
BufferedReader br = new BufferedReader(reader); //读取一行
//String str = br.ReadLine();
// System.out.println(str); //定义一个变量用来记录读取的每一行数据
String str;
//如果读取到末尾,返回的是null
while((str = br.readLine()) != null) {
System.out.println(str);
}
//关流 只关闭外层流就行
br.close();

2、字符输出缓冲流 --BufferedWriter

提供了一个更大的缓冲区,其中提供了一个newLine()方法,用于进行换行操作,以屏蔽不同操作系统的差异性。

示例如下:

//真正向文件中写数据的流是FileWirter
//BufferedWriter提供了一个更大的缓冲区
BufferedWriter writer = new BufferedWriter(new FileWriter("D:c.txt"));
writer.write("sdsakj");
//在Windows中,换行一般用\r\n
//在linux中,换行只用\n //进行换行,屏蔽不同操作系统的差异性
writer.newLine();
writer.write("4564561"); writer.close();

六、流中的异常处理

1、无论流操作成功与否,关流操作都得发生,所以需要将关流操作放到finally代码块中。

2、为了让流对象在finally依然能够使用,所以需要将流对象放在try之外声明,并且要赋值为null,然后放在try之内进行实际的初始化过程。

3、在关流之前要判断对象是否初始化成功,实际上就是判断流对象是否为null;

4、因为关流有可能失败,此时流会依然占用文件,所以需要将流对象置为null,标记为垃圾对象进行强制回收以释放内存;

5、如果流有缓冲区,那么为了防止关流失败导致没有进行自动冲刷,所以需要手动冲刷一次,以防止有数据死在缓冲区而产生数据丢失。

流异常处理实例如下:

       //2.需要将流对象放在try之外声明并且赋值为null
FileWriter writer = null;
try {
// 2.将流对象放在try之内进行初始化
writer = new FileWriter("F:\\a.txt"); writer.write("积分圣诞节"); //5.为了防止关流失败没有自动flush而导致数据产生丢失
writer.flush(); } catch (IOException e) {
e.printStackTrace();
} finally {
//3.在关流之前要判断对象是否初始化成功,实际上就是判断流对象是否为null
if(writer != null) {
try {
//1.无论写流成功还是失败,都需要关流
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.如果关流失败,将该流标记为垃圾对象,强制回收
//如果关流成功,将该流标记为垃圾对象,释放内存
writer = null;
}
}
}

Java文件处理之IO流的更多相关文章

  1. Java文件操作(IO流)

     File 在java中用来表示文件和文件夹的具体类. File的构建 File的常见方法   字节流:       对象序列化:   字符流:     转接流: InputStreamReader. ...

  2. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...

  3. Java笔记(二十七)……IO流中 File文件对象与Properties类

    File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...

  4. Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  5. java操作文件常用的 IO流对象

    1.描述:流是字节数据或字符数据序列.Java采用输入流对象和输出流对象来支持程序对数据的输入和输出.输入流对象提供了数据从源点流向程序的管道,程序可以从输入流对象读取数据:输出流对象提供了数据从程序 ...

  6. java学习(九) —— java中的File文件操作及IO流概述

    前言 流是干什么的:为了永久性的保存数据. IO流用来处理设备之间的数据传输(上传和下载文件) java对数据的操作是通过流的方式. java用于操作流的对象都在IO包中. java IO系统的学习, ...

  7. Java——(九)IO流

    一.流的分类 1.输入流和输出流 按照流的流向来分,可以分为输入流和输出流 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 此处的输入.输出涉及一个方向 ...

  8. Java 持久化操作之 --io流与序列化

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  9. Java的递归、IO流

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.递归 [递归] 1. 在函数自身内部,调用函数本身的方式,称为递归. ...

随机推荐

  1. 子组件props接受父组件传递的值 能修改吗?

    vue2.0 子组件props接受父组件传递的值,能不能修改的问题整理 父组件代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  2. Wordpress综合检测和爆破工具

    WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站. 也可以把 WordPress当作一个内容管理系统(CMS)来使用.WordP ...

  3. RCTF crypto100(1)

    题面是一个文件,里面是用base64加密的字符串,如下所示: IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI ...

  4. go语言的变量和定量

    1.变量: 1.var go 的变量非常灵活引入了关键字var. 如 var v1 int var v2 string var v3 [10]int 在go语言中变量申明有更快捷的办法可以把若干个变量 ...

  5. Random Process Modeling_1

    1. Bertrand Triangle r=1; %circle radius x0=0; y0=0; %centre of circle %points for circle t=linspace ...

  6. Maven 使用Nexus搭建Maven私服

    Maven学习 (四) 使用Nexus搭建Maven私服 为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找 ...

  7. eclipse Spring环境搭建 spring tool suite

    1.期初用intellij社区版,发现收费版才能开发Java EE. 2.使用eclipse按照网上的教程,在help->eclipse marketplace中搜索sts安装spring工具套 ...

  8. 拖放获取文件信息的bat代码

    参考:岁月如歌-通过拖曳获取文件信息的bat代码 拖放获取文件信息的bat代码 使用命令行配合7z解压文件时由于每次解压的文件不同,因此搜索了一下拖放识别文件信息的方法,以此方式来减轻工作量 获取文件 ...

  9. 二 配置数据字典&异步查询客户

    数据字典: 字典表和客户表的关系 配置字典表 配置客户表 Spring管理映射文件 1 字典表和客户表的关系 2 配置字典表 3  配置客户表 4  Spring管理映射文件 异步查询客户: 页面加载 ...

  10. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:Object类

    class Demo{ // 定义Demo类,实际上就是继承了Object类 }; public class ObjectDemo01{ public static void main(String ...