`
_kudy
  • 浏览: 15088 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

javase_13(字符流)

阅读更多

 

IO(Input OutPut)流

IO流用来处理设备之间的数据传输

JAVA对数据的操作是通过流的方式

JAVA用于操作流的对象都在IO包中

流按操作对象分为两种: 字节流,字符流

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



 其它的内容还是比较简单的,注意的是以下这几个自定义包装类:

实现1.

MyBufferedReader.class

 

package com.javami.kudy.Code13;
 import java.io.IOException;
 import java.io.Reader;  //读取字符流的抽象类
 import java.io.IOException;
 /*
  * 自定义MyBufferedReader包装Reader,提供了一个缓冲区的功能.提供了ReadLine功能.
  * 1.用一个次组合,拿到被包装的Reader对象
  * 2.定义一个字符数组作为缓冲区
  * 3.实现一个read方法,填充缓冲区,从缓冲区那里返回一个字符
  * 4.定义一个readLine方法,内部调用read方法,循环读取一行,进行返回
  * 5.定义一个close方法,关闭地底层所包装的流
  */
 public class MyBufferedReader  extends Reader{
     private Reader r;
     char[] buf = new char[1024];
     int len =0;
     int pos = 0;
     public MyBufferedReader(Reader r)
     {
         this.r = r;
     }
     /*
      * 实现read()方法,实现缓存的功能
      * 分析:
      * 1.当别人第一次调用该方法的时,一次性的去填充缓冲区
      * 2.定义一个len变量记住缓冲区的可用字符的数量
      * 3.将数组的第一个元素返回
      * 4.当别人第二次调用的时,将数组的二个元素返回
      * 5.每次返回元素 len --
      * 6.当len为零时,说明数组没有可用字符啦,那么这时候返回一个-1
      * 
      * 思路:
      * 1.定义两个成员变量,len记住可用字符数量,pos记住当前字符的角标
      * 2.判断len是否为0,如果为零要填充缓冲区.并且pos为零
      * 3.判断len,如果为-1,则返回-1
      * 4.将pos位置的元素返回.pos++
      */
     public int read() throws IOException
     {
         if(len ==0)
         {
             len = r.read(buf);
             pos = 0;
         }
         if(len==-1)
             return -1;
         len--;
         return buf[pos++];
     }
     
     /*
      * 实现readLine方法,实现读一行的功能,
      * 1.循环调用自己的方法的read方法,读取字符
      * 2.知道回车的字符,方法就结束
      */ 
     public String readLine() throws IOException
     {
         StringBuilder sb = new StringBuilder();
         int ch;
         while((ch=read())!=-1)
         {
             if(ch=='\r')
                 continue;
             if(ch=='\n')
                 break;
             sb.append((char)ch);
             if(ch==-1&&sb.length()==0)
                 return null;
         }
         return sb.toString(); //转换成字符串
     }
     @Override
     public void close() throws IOException {
         r.close();
     }
 
     @Override
     public int read(char[] cbuf, int off, int len) throws IOException {
         int count=0;
         for(int i=0; i<off+len; i++)
         {
             int ch = read();
             if(ch==-1)
                 break;
             count++;
             buf[i] = (char)ch;
         }
         return count;
     }
 
     
     
 }

 MyBufferedWriter.class  这个主要是写入

 

package com.javami.kudy.Code13;
 import java.io.IOException;
 import java.io.Writer;
 
 public class MyBufferedWriter  extends Writer{
     
     private Writer w;
     private char[] buf = new char[1024];
     private int pos = 0;
     
     public MyBufferedWriter(Writer w)
     {
         this.w = w;
     }
     /*
      * 定义Writer方法,实现写一个字符,实现缓存的功能
      * 1.定义一个变量pos记住当前的写入位置
      * 2.每次调用都使用这个方法都会传入一个字符,将字符缓存到数组pos位置里面去
      * 3.pos++
      * 4.每次上来就判断,如果pos =1024,刷新缓冲区 ,pos = 0
      */
     public void Writer(int ch)throws IOException
     {
         if(pos == 1024)
         {
             flush(); //刷新一下缓冲区.并且初始化为零
             pos = 0;
         }
         buf[pos++] = (char)ch;
     }
     @Override
     public void close() throws IOException {
         flush();
         w.close();
     }
 
     @Override
     public void flush() throws IOException { 
         w.write(buf,0,pos); //把buf0-pos位置的内容写入进去
     }
     public void writer(String data)throws IOException
     {
         char[] chars = data.toCharArray(); //转换成字符
         for(char c : chars)
             write(c);
     }
     public void newline()throws IOException
     {
         write("\r\n"); //所谓的换行就是一个
     }
     @Override
     public void write(char[] cbuf, int off, int len) throws IOException {
         for(int i=0; i<off+len; i++)
         {
             w.write(buf[i]);
         }
         
     }
 
 }

 由于每次都要关闭流啊~~无奈.只好使用一个类来实现它们

CloseUtil.class

 

package com.javami.kudy.Code13;
 import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
 public class CloseUtil {
     private CloseUtil(){}
     public static void close(Reader r,Writer w)throws IOException
     {
         try
         {
             if(r!=null)
                 r.close();
         }
         finally
         {
             if(w!=null)
             w.close();
         }
     }
 }

 

 

一个简单的测试类:

 

package com.javami.kudy.Code13;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 
 public abstract class BufferedTest {
 
     /**
      * @param args
      */
     public static void main(String[] args)
     {
         MyBufferedReader mr = null;
         MyBufferedWriter mw = null;
         try
         {
             mr = new MyBufferedReader(new FileReader("src/a.txt"));
             mw = new MyBufferedWriter(new FileWriter("src/b.txt"));
             int len;
             while((len=mr.read())!=-1)
             {
                 mw.Writer(len);
             }
         }
         catch(IOException e)
         {
             e.printStackTrace();
         }
         finally
         {
             try
             {
                 CloseUtil.close(mr, mw);
             }
             catch(IOException e)
             {
         }
         }
     }
 }

 

 

BufferedReader 与 BufferedWriter 的存储图:



 以上这几个都是比较难理解的..~~

 

加油啦..

  • 大小: 25.5 KB
  • 大小: 4.9 KB
分享到:
评论

相关推荐

    JavaSE_4_JavaIO操作_1

    File类,输入和输出流,字节-字符转换流,打印流PrintStream,对象序列化

    JavaSE_4_JavaIO操作_2

    内存操作流,System对IO流的支持,缓冲区读取,Scanner类,字符编码问题,装饰着模式Decorator

    JAVASE,IO流部分模块导图

    里面包含了字节输入输出流、字符输入输出流的接口继承以及具体实现类的常用方法。使用了树形结构呈现出来,简单明了。 适用于:初学者:能更清晰地认清javaSE的IO流部分接口与实现类之间的关系。 其他人:要使用IO...

    javaSE代码实例

    第13章 字符串——优异的内存组织机制 243 13.1 String类的基础知识 243 13.1.1 对象的创建 243 13.1.2 巧用构造器 244 13.1.3 String类的重要方法 245 13.2 String对象的内存机制 248 13.2.1 一段令人...

    JavaSE笔记11111

    JavaSE笔记涵盖 面向对象的三大特征:继承,多态,封装 单列集合与双列集合:collection & map IO流:InputStream字节输入流,OutputStream字节输出流,Reader字符输入流,Writer字符输出流; 多线程&线程池; 反射&动态代理等

    见面试官前,掏出来看看系列(三)之——JavaSE思维导图(持续更新中……)

    文章目录输入输出流(Java IO)字节流字符流File 类Socket(套字节)NIO(非阻塞 IO)容器Map面向对象技术重载和覆盖的区别面向对象的特征字符串和数组字符串创建与存储的机制”==“、equals()和hashCode有什么区别...

    Java思维导图

    Java SE思维导图完整版,包括:概述、基本语法、数据类型、面向对象、字符串、方法、数组、流程控制、集合、IO/流、多线程

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    J2SE讲解文档

    Java 基础 JAVA SE会什么 面向对象部分: 类与对象的概念(如何抽象) 面向对象的三个特征 抽象类与接口(设计) 应用部分: ... IO操作:字节流、字符流、序列化 类集:Map、Collection、List、Set

    LearnHow2J:练习How2J的代码

    JavaSE2 ------ :进阶的Java语法,包括异常,流,集合,泛型,多线程,JDBC,网络编程等。 JavaSE3 ------ :后续理解框架的基础,包括反射机制,注解。 JavaUse ------ :开发中常用的工具包,包括Log4j,测试...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    11.4字符流的输入输出 11.4.1认识字符流 11.4.2如何读写文件 11.4.3如何进行键盘输入 11.5和IO操作相关的其他类 11.5.1用RandomAccessFile类进行文件读写 11.5.2使用Properties类 11.6小结 第12章多线程开发...

    java基础案例与开发详解案例源码全

    1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 JavaSE环境安装和配置12 1.4.1 什么是JDK12 1.4.2 JDK安装目录和实用命令工具介绍12 1.4.3 设置环境变量13 1.4.4 验证配置的正确性14 1.5 ...

    java 课程 实验

    3. 掌握JavaSE API文档的使用方法。 二、实验内容 1. 编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母数。(字符串可以在main方法中指定) 2. 调用java.lang.Math的成员函数“public...

    leetcode分类-backend-learning:Kerno后端方向学习仓库

    工具类(字符串与可变字符串,日期类型转换与格式化,自定义异常,输入流与输出流的实现,线程控制,并发与锁) 数据类型操作 字符串操作 数学运算 时间日期处理 异常处理 文件处理 流处理 多线程操作 集合框架...

    Java学习笔记-个人整理的

    {7.9}字符流}{112}{section.7.9} {7.10}缓冲字符输入输出流}{113}{section.7.10} {7.11}文件常用操作}{114}{section.7.11} {7.12}对象序列化}{117}{section.7.12} {8}多线程}{121}{chapter.8} {8.1}线程的常用...

    java知识点梳理

    文档梳理了Java基本语法知识——环境搭建、数据类型、运算符、控制流、数组、Arrays类、字符串、类和对象、对象的生成与销毁、Java包&方法调用&访问控制、封装和继承、多态、继承链、抽象类和接口等等。

Global site tag (gtag.js) - Google Analytics