IO流概述和方法应用

16 篇文章 0 订阅
2 篇文章 0 订阅

       IO即InputOutput是两个英语字母的首字母缩写,长被称为IO流,Java对数据的操作是通过流的方式来实现的,IO流是中用来处理设备间的数据传输:设备上的数据有内存,硬盘等数据的存储。用于处理数据的流对象都存储在java.io包中。流按操作数据分为两种:字节流与字符流。早期IO包中都是字节流,因为数据无论是内存还是硬盘上的体现形式都是字节, 最终都是二进制数据。文本数据是字符的数据,为了处理方便就将其单独列为字符流字符流的产生。

        计算机通过二进制的变换形式来表示生活中的一些数据(文字),将二进制的1001数字进行排列组合,来表示对应的字母,产生了映射表,也叫编码表ASCII表。全称为:美国信息标准交换码 ,中国也就有了自己的汉字和1010相对应的映射表,此表叫做GB2312,记录了汉字,标点符号,后来扩容以后,叫做GBK,不同的语言和文字都有不同的编码表 ,国际标准化组织对各国的文字,又进行了重新的编排,形成了国际标准码表,后来又修改叫做UTF-8 就把它单独划分出来,即就产生了字符流。

         假设有两台机器,它们的默认编码表是不同的,比如一个识别GBK,一个识别UTF-8,若使用前者是别的一个文本文件,让后者识别,就会产生乱码 为了解决这个问题Java就在流技术上基于字节流产生了字符流,它可以在内部融合编码表,      可以有程序员来制定读哪个码表,这样处理文字时就会很方便,这就是字符流的由来。 简而言之,就是字符流中融合了很多编码表,而图片就会用到字节流,通用字节流,字符流是基于字节流的。

        流按方向分为:输入流,输出流

        IO流的常用基类,都是抽象的,都要被子类分别实现。 对于数据的操作就只有两种:读和写。

       字节流的抽象基类:
            InputStream(读),OutputStream(写)
       字符流的抽象基类:
          Reader ,Writer  

  注: 由这四个类派生的出来的子类名称都是以其父类作为子类的名的后缀
  如: InputStream的子类FileInputStream
           Reader的子类FileReader    

字符流的特点:

      Write是IO包中的抽象类,所以它有很多的子类,来实现它的不同方法。  既然IO流是用于操作数据的,那么数据最常见的体现形式就是:文件   

      Writer中的主要方法有:
       <1>. void write(String str) 写入字符串。
       <2>. void write(int c) 写入单个字符。
       <3>. void write(char[] cbuf) 写入字符数组。
       <4>. Writer append(char c) 将指定字符添加到此 writer。
       <5>. abstract  void flush()  刷新该流的缓冲
       <6>. abstract  void close() 关闭此流,但要先刷新它。
       <7>. abstract  void write(char[] cbuf, int off, int len)  写入字符数组的某一部分。 
 

需求:

        在硬盘上,创建一个文件并写入一些文字数据

解决方案:
        查找操作文件的子类和方法
            在API文档中Writer的子类中,其子类的文件名后缀为其父类名,即Writer
        该子类的作用:
                Writer有一个子类是OutputStreamWriter,它还有一个子类FileWriter,FileWriter用来写入字符文件的便捷类
        找到一个专门用于操作文件的Write子类 对象,FileWriter,后缀名为父类名,前缀名是该子类对象的功能,它有很多的构造方法 。

        FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。其中fileName为文件名,该方法没有空参数构造函数,若要操作文件,必须先有文件 ,所以可以理解为该流对象一被初始化,就必须有要操作的文件存在,即这就是初始化动作  

步骤:
          <1>. 导入IO包或者子类对应的包
          <2>. 创建一个FileWriter对象(该对象一被初始化就必须要明确被操作文件
          <3>. 使用父类writer的write(String str)方法
 
代码示例:

package com.itheima.day18;

import   java.io.*;

public class FileWriteDemo {

    public static void main(String[] args)throws Exception {              

              FileWriter fw1 = new FileWriter("demo.txt");  //没有指定目录,要声明异常
              FileWriter fw = new FileWriter("E:\\MyEclipse 2014GA\\MyEclipse-Workspace\\VideoStudy\\src\\com\\itheima\\day18\\IOTestDemo.txt");

              //调用write方法,将字符串写入到流中
              fw.write("Hello World!--IO流的写入实验");

              fw.flush();

              fw.close();

    }

}

fw.flush();fw.close();的区别:

      fw.flush()  刷新流对象中的缓冲中的数据,将数据刷到目的地中(即指定的目录下)

      fw.close() 关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中

  区别:

           flsush刷新后,流可以继续使用,close()刷新后,会将流关闭

事实 :

           我们在日常工作生活中,使用电脑添加数据,不用java,Windows本身是可以创建文件夹,并进行数据录入的
 说明Windows本身是具备写入数据的功能的 ,Java能给Windows写入数据,说明Java在调用Windows中写入数据
 功能。这就是所说的流资源。使用完之后一定要将空间内存释放出来,因此close()的操作是一定要做的
 
Reader

      java.io包中有一个Reader类。该类中有子类对象FileReader,用来读取字符文件的便捷类,此类中有默认的字符编码(即系统中的编码)

构造方法:
         FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
通用方法:
          <1>. int read() 读取单个字符。
               作为整数读取的字符,范围在 0 到 65535 之间 ,如果已到达流的末尾,则返回 -1
                                    有此条件就可以进行循环

Reader读取文本文档方式1:


代码示例:

package com.itheima.day18;

import   java.io.*;

public class FileReaderDemo01 {

       public static void main(String[] args) throws IOException {

            //创建一个文件读取流文件,和指定名称的文件相关联。要保证该文件已经是存在的
           //若不存在会发生异常,异常是FileNotFoundException(文件未找到异常),它是IOException异常的子类

              FileReader fr = new FileReader("E:\\MyEclipse 2014GA\\MyEclipse-Workspace\\VideoStudy\\src\\com\\itheima\\day18\\IOTestDemo.txt");   

                 int ch = 0;
                 while((ch = fr.read()) != -1){
            
                 System.out.println((char)ch);
            
            }

             fr.close();
        
     }

}


        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值