热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

流数据流和IO流的使用及应用

本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。

数据流---用于传输数据。IO流---Input/Output流。数据从外部流向程序---输入流;数据从程序流向外部的时候--输出流。读取一个文件---数据从文件流向程序---输入流;向一个文件中写入数据---数据从程序流向文件---输出流

根据数据流动的方向:输入流/输出流

根据数据传输的形式:字节流/字符流



















 

输入流

输出流

字节流

InputStream

OutputSteam

字符流

Reader

Writer

技术分享技术分享

 

这四个类是Java中四个流的基本类,但是这四个类都是抽象类,都不能用于直接创建对象

数据的来源:硬盘、网络、内存、输入设备

向一个文件中去写入数据---txt文件---字符流、输出流、文件流---

最简单的一个输入流,写入缓冲区中,再从缓冲区中读取出来

1 public static void main(String[] args) throws IOException {
2 // TODO Auto-generated method stub
3 String c; //设置一个字符串去接收缓冲区
4 InputStreamReader IsReader=new InputStreamReader(System.in);//输入流:键盘输入
5 BufferedReader bReader=new BufferedReader(IsReader);//将输入的存入缓冲区中
6 System.out.println("输入字符按q退出");
7 do {
8 c= bReader.readLine();//从缓冲区中读取
9 System.out.println(c);
10 } while (!c.equals("q"));
11 }


 字符流


FileWriter


构造函数

FileWriter(String name)--传入文件路径,操作对应的文件---当文件不存在的时候,会创建这个文件;如果文件存在,则创建一个新文件覆盖源文件。

重要方法

write(String s)---写出字符串。数据不是直接写到目的地而是写到缓冲区中,等到缓冲区满了之后才会写到目的地中

flush()---冲刷缓冲区

close()---关闭流。流在关闭之前会自动的冲刷缓冲区。

代码实现:


1 public static void main(String[] args) throws IOException {
2 //创建一个FileWriter对象,并指定文件路径,该文件会被创建到指定目录下。如果该目录有同名文件,那么该文件将被覆盖。
3 FileWriter fw = new FileWriter("1.txt");
4 //调用write的方法将字符串写到流中
5 fw.write("hello world!");
6 //刷新流对象缓冲中的数据,将数据刷到目的地中
7 fw.flush();
8 //关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据。当我们结束输入时候,必须close();
9 fw.write("刷新");
10 fw.close();
11 //flush和close的区别:flush刷新后可以继续输入,close刷新后不能继续输入。
12 }

 

流的异常处理

1. 流对象要外置定义内置初始化

2. 判断流对象是否初始化成功---判断流对象是否为空

3. 关流操作无论成功与否,都需要将流对象值为null

FileReader

 












1public int read() throws IOException
读取单个字符,返回一个int型变量代表读取到的字符
2public int read(char [] c, int offset, int len)
读取字符到c数组,返回读取到字符的个数

 

代码实现:


1 public static void main(String[] args) throws IOException {
2 //创建FileReader对象,并读取1.txt文件
3 FileReader fr = new FileReader("1.txt");
4 //单字符读取 。。。。。。多字符的读取,创建数组将1.txt文件存入数组中,在读取出来char [] buf = new char[6];
5 int ch = 0;
6 //一直读取文件中的内容直到文件的尾部
7 while((ch = fr.read())!=-1) {
8 /* 输出字符串
9 *
10 * String(char[] value , int offest,int count) 分配一个新的String,包含从offest开始的count个字符 new String(buf,0,ch}
11 * */
12 System.out.print((char)ch);
13 }
14 fr.close(); //关闭流
15 }

 两个结合可以实现一个文件的拷贝

将1.txt文件内容拷贝到2.txt中

代码实现:


1 public static void main(String[] args) throws IOException {
2 FileReader fr=new FileReader("1.txt");//先读取需要拷贝的文件
3 FileWriter fw=new FileWriter("2.txt");//拷贝文件内容复制到的另个文件路径
4 int ch=0;
5 while ((ch=fr.read())!=-1) { //读个读取内容
6 fw.write((char)ch); //将读取的内容写入文件中
7 }
8 fr.close(); //关闭读取流
9 fw.close();//关闭写入流
10 }


 


字节流

其实字节流和字符流是差不多的形式,看懂了上面,下面就不用多说了

文件输入流: FileInputStream类

 简要的说是打开文件,将文件数据读取到内存中

代码实现:

1 public static void main(String[] args) throws IOException {
2 FileInputStream fStream=new FileInputStream("1.txt");//创建文件输入流对象
3 int ch=0;
4 while ((ch=fStream.read())!=-1) { //依次读取文件内容赋值给ch
5 System.out.print((char)ch); //输出内容-----(char)ch转换成字符输出
6 }
7 }


文件输出流: FileOutputStream类

目的是将内存中的数据读取到文件中

代码实现:

1 public static void main(String[] args) throws IOException {
2 int count, n = 20;
3 //创建字节数组
4 byte buffer[] = new byte[n];
5 //将输入的字节存入字节数组中
6 count = System.in.read(buffer);//System.in.read()返回的是输入数值的 ASKII 码(一个 int 整数)
7 FileOutputStream fO=new FileOutputStream("1.txt"); //创建文件输出流对象,指定文件路径
8 fO.write(buffer, 0, count); //将字节写入文件,显示字符
9 fO.close();//关闭流
10 }


 FileInputStream流和FileOutputStream的应用

将1.txt文件拷贝到2.txt 文件中

代码实现:

1 public static void main(String[] args) throws IOException {
2 FileInputStream fIn=new FileInputStream("1.txt");//创建文件输入流对象 拷贝对象文件,指定文件路径
3 FileOutputStream fOut=new FileOutputStream("2.txt");//创建文件输出流对象,,指定写入内容的文件路径
4 int ch=0;
5 while ((ch=fIn.read())!=-1) {//循环读取
6 fOut.write(ch);//将内容写入
7 }
8 fIn.close();//关闭流
9 fOut.close();//关闭流
10 }

 

OutputStreamWriter---将一个字节输出流转化为字符输出流

InputStreamReader---将一个字节输入流转化为字符输入流

 

缓冲区

        计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。为此,除了程序和流节点间交换数据必需的读写机制外,还应该增加缓冲机制。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。  

1. 字符流的缓冲区:BufferedReader和BufferedWreiter


* 缓冲区的出现时为了提高流的操作效率而出现的.

* 需要被提高效率的流作为参数传递给缓冲区的构造函数

* 在缓冲区中封装了一个数组,存入数据后一次取出


BufferedReader

自带了缓冲区,需要一个Reader对象来构建这个BufferedReader对象---BufferedReader最主要的作用提供缓冲区,从字符输入流中来获取数据;Reader对象来指名数据的具体来源

简单代码实现:

1 public static void main(String[] args) throws IOException {
2 FileReader fReader=new FileReader("1.txt");//创建一个文件读取对象,并读取文件
3 BufferedReader bReader=new BufferedReader(fReader);//将文件内容放入缓冲区中------ 需要被提高效率的流作为参数传递给缓冲区的构造函数
4 StringBuffer sBuffer=new StringBuffer(); //创建一个StringBuffer类的字符串后面接收读出的数据
5 while (bReader.ready()) { //循环读取知道文件尾部
6 sBuffer.append((char)bReader.read());//将文件内容逐一添加到sBuffer中
7 }
8 System.out.println(sBuffer.toString());//输出
9 fReader.close();//关闭读取流
10 bReader.close();//关闭缓冲区读取流
11 }

 

BufferedWriter


代码实现:

1 public static void main(String[] args) throws IOException {
2 FileWriter fWriter=new FileWriter("1.txt");//创建写入流对象,并指定创建的文件路径;
3 BufferedWriter bWriter=new BufferedWriter(fWriter);//创建写入流的缓冲区
4 bWriter.write("abcdf");//向缓冲区写入字符
5 bWriter.flush(); //刷新缓冲区
6 bWriter.newLine();//newLine()在不同的操作系统下自动转义为当前系统认识对的回车换行
7 bWriter.write("qwer");
8 bWriter.flush(); //刷新缓冲区
9 bWriter.close();//关闭缓冲区
10 fWriter.close();//关闭写入流
11 }

 未写完待续

系统流/标准流---字节流

底层使用字节流来实现的

System.out   标准输出流

System.in    标准输入流

System.err   标准错误流




推荐阅读
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
author-avatar
mobiledu2502902523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有