13.IO流之字符流

 

一.读写中文

   1.使用FileInputStream和FileOutputStream读写中文

      计算机存储任何数据都是以二进制字节形式存储, 那么使用字节流是可以读写字符的. 但是比较麻烦.

      FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码

//使用FileInputStream读取中文,因为 read只能读取字节,如想读取字符,需要人工解代;

   publicstaticvoid read()throws FileNotFoundException, IOException {

      FileInputStream fis = new FileInputStream("file.txt");

      int len;

      while((len = fis.read())!=-1) {

         //将读取到的数据转成byte类型;

         byte b1 = (byte)len;

         //如果转换结果小于0;说明读到了中文;

         if(b1 < 0) {

            byte b2 = (byte)fis.read();   //再读取下一个字符,同转换成byte类型;

            System.out.print(new String(newbyte[]{b1,b2})); //将两个byte字节组成一个byte数组,再转成字符串打印出来;

         } else {

//如果读取的不是负数,直接转成字符;

            System.out.print((char)len);     

         }

      }

      fis.close();    //关流;

   }

   FileOutputStream只能写出字节, 如果希望写出字符, 需要人工编码

      publicstaticvoid write()throws IOException {

      FileOutputStream fos = new FileOutputStream("file.txt");

      fos.write("今天天气不错,".getBytes());//使用getBytes转换;

      fos.write("\r\n心情很好!".getBytes());

   fos.close();

InputStream.read()方法是读一个byte,而为什么返回一个int?而且int中全是正数.

   因为byte取值范围是-128127,这些数据在文件中都有可能存在,如果读到字节直接返回,那么无法用任何一个值表示文件末尾.

   read()方法内部,将读取到的所有数据高位补0转为了int,这样做所有负数都会变为正数,返回-1就能表示文件末尾了.

  write()方法写出数据时,会将int数据强转为byte,再写出. 这样就把read()方法中补的0都去掉了,得到了文件中原有数据.

一.字符流

   1.使用FileInputStream和FileOutputStream读写中文

      计算机存储任何数据都是以二进制字节形式存储, 那么使用字节流是可以读写字符的. 但是比较麻烦.

      FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码

   2.使用InputStreamReader和OutputStreamWriter读写中文

      InputStreamReader包装一个InputStream, 可以直接读取字符, 自动解码

      OutputStreamWriter包装一个OutputStream, 可以直接写出字符, 自动编码

  * 3.指定码表读写字符

      在使用InputStreamReader和OutputStreamWriter的时候, 如果希望读写非平台默认码表, 在构造函数中可以指定

      publicstaticvoid writerCode()throws UnsupportedEncodingException,

         FileNotFoundException, IOException {

      //使用非平台默认码表,写出文件,同样是在构造函数中指定码表即可;

      OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt",true),"UTF-8");//指定UTF-8码表

      osw.write("订餐");

      osw.close();

   }

   publicstaticvoid readerCode()throws IOException {

      InputStreamReader isr = new InputStreamReader(new FileInputStream("demo.txt"),"UTF-8");//指定UTF-8码表

      int len;

      while((len = isr.read())!=-1)

         System.out.print((char)len);

      isr.close();

   }

  *4.FileReader和FileWriter

      FileReader是InputStreamReader的子类, 在读取平台默认码表的文件时, 可以使用FileReader替代InputStreamReader,因为FileReader底层自动调用父类InputStreamReader,在InputStreamReader构造函数上自动创建新的FileInputStream;

      FileWriter是OutputStreamWriter的子类, 在写出平台默认码表的文件时, 可以使用FileWriter替代OutputStreamWriter

  *5.BufferedReader和BufferedWriter

      BufferedReader可以包装一个Reader, 提供缓冲功能, 而且提供了readLine()方法可以读取一行字符

readLine方法原理:

   无论是读一行,还是读取多个字符,其实最终都是在硬盘上一个一个读取,所以最终还是read方法一个一个读取的方法.

      BufferedWriter可以包装一个Writer, 提供缓冲功能, 而且提供了newLine()方法写出系统对应的换行符号

   import java.io.*;

 

publicclass BufferedReaderDemo {

   publicstaticvoid main(String[] args)throws IOException {

      //使用bufferedReader读取文件;

      reader();

   //writer();

   }

 

   publicstaticvoid writer()throws IOException {

      BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"));

      bw.write("天气不错,努力学习");

      bw.newLine();      //换行;平台通用

      bw.write("争气,出气");

      bw.close();

   }

 

   publicstaticvoid reader()throws IOException {

      BufferedReader br = new BufferedReader(new FileReader("file.txt"));

      String line;

      while((line= br.readLine())!=null)

         System.out.println(line);

      br.close();

   }

 

}

   6.LineNumberReader

      是BufferedReader的子类, 带有缓冲功能, 可以读取一行, 并且还能统计行号

   7.包装设计模式:

装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。

所以装饰类和被装饰类通常是都属于一个体系中的。

//被包装的对象;读取文件的功能就在这个类中;

      FileInputStream fis = new FileInputStream("file.txt");

 

      //包装类,使用fis读取文件的功能,添加的缓冲的功能;

      BufferedInputStream bis =new BufferedInputStream(fis);

 

      //包装类,使用了fis读取文件的功能,添加了转为字符的功能;

      InputStreamReader isr = new InputStreamReader(fis);

 

      //包装类,使用了isr读取字符的功能,添加了缓冲的功能;

      BufferedReader br  =new BufferedReader(isr);

:

interface Coder{ // 程序员,必须会编程

   void code();

}

 

class Studentimplements Coder {    // 普通的计算机系学生

   publicvoid code() {

      System.out.println("JavaSE");

      System.out.println("JavaWeb");

   }

}

 

class ItcastStudentimplements Coder {        //4.和被包装类实现相同的接口,或者继承相同的父类. 包装类就可以和被包装类一样使用了

   private Studentstudent;

 

   public ItcastStudent(Student student) {    // 1.通过构造函数接收一个被包装的对象,用成员变量引用被包装的对象

      this.student = student;             

  

  

   publicvoid code() { // 2.声明和被包装类相同的方法

      student.code();   // 3.在方法中调用被包装对象的方法,对其增强

      System.out.println("JBPM");

      System.out.println("Hibernate");

      System.out.println("Sprint");

      System.out.println("Struts");

      System.out.println("Hadoop");

      System.out.println("JNI");

      System.out.println("OpenGL");

      System.out.println("Android");

   }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值