`
_kudy
  • 浏览: 16571 次
  • 性别: 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_JavaSE学习资料_

    IO流(Input/Output Stream)是Java处理输入输出的关键机制,分为字符流和字节流,覆盖了读写文件、网络通信等多种场景。BufferedReader、FileWriter、InputStreamReader、OutputStream等类是常用的IO类。深入理解流...

    MLDN_JAVASE_文档

    - **I/O流**:输入/输出流的概念,字符流(Reader和Writer)的使用。 7. **集合框架**: - **List、Set和Queue接口**:ArrayList、LinkedList、HashSet、TreeSet等实现类的特性与使用。 - **Map接口**:HashMap...

    VIP09_JavaSE_JavaIO_File_day0307-1.rar

    1. **Java IO体系结构**:Java IO框架主要包括字节流和字符流,分为输入流和输出流。字节流处理单个字节的数据,如InputStream和OutputStream家族;字符流处理Unicode字符,如Reader和Writer家族。此外,还有缓冲流...

    02-Java语言进阶_javase_

    - **转换流**:InputStreamReader和OutputStreamWriter将字节流转换为字符流,支持不同字符编码。 - **序列化流**:ObjectInputStream和ObjectOutputStream允许我们将对象的状态保存到文件或网络,实现对象的持久...

    JavaSE总结文档.rar

    - **字符串处理**:String类的常用方法,如concat、substring、indexOf等,以及StringBuilder和StringBuffer的使用。 2. **JavaSE基础知识总结之二**: - **集合框架**:ArrayList、LinkedList、HashSet、HashMap...

    JavaSE_java基础_

    7. **IO流**:Java的IO流处理包括输入流和输出流,支持处理文件、网络数据和系统资源。NIO(New IO)在Java 1.4中引入,提供了更高效的数据传输和非阻塞I/O操作。 8. **多线程**:Java内置对多线程的支持,通过实现...

    JavaSE_4_JavaIO操作_3

    Java IO体系主要包括两个方面:字节流和字符流。字节流主要由`InputStream`和`OutputStream`构成;而字符流则由`Reader`和`Writer`构成。这些基础类构成了整个IO系统的核心,其他流类均继承自这些基本类。 #### ...

    JavaSE_Demo

    包括字节流、字符流、对象流以及缓冲流等。 6. **多线程**:Java提供Thread类和Runnable接口来支持并发编程。通过线程池、同步机制(synchronized关键字、Lock接口)以及并发工具类(如ExecutorService、...

    javaSE_java_core.pdf

    `\d`代表数字,`\D`代表非数字,`\s`代表空白字符,`\S`代表非空白字符,`\w`代表单词字符,`\W`代表非单词字符。正则表达式还可以使用`|`表示选择其中之一,`()`用于分组。 在Java中,`String`类提供了对正则...

    JavaSE 7 API DOC

    8. **集合框架增强**:对`Collections`和`Arrays`类进行了优化,添加了新的方法,如`copyOf()`、`stream()`等,以支持流(Stream)操作。 9. **异常链**:当一个异常在处理另一个异常时被抛出,可以形成异常链,...

    JavaSE6_API

    3. **I/O流**:JavaSE6_API的`java.io`包包含了输入输出流的处理,包括字符流和字节流,如`FileInputStream`、`FileOutputStream`、`BufferedReader`、`PrintWriter`等。此外,NIO(New IO)在Java 6中引入,提供了...

    JavaSE笔记_工具.zip

    - **IO流**:用于读写文件、网络通信等,包括字节流和字符流。 - **线程**:Java支持多线程编程,可以同时执行多个任务,通过Thread类和Runnable接口实现。 - **反射**:运行时动态获取类的信息并创建对象的能力,...

    JAVASE_Notes:来自itheima黑马的JavaSE基础笔记

    分为字节流和字符流,以及输入流和输出流。还有缓冲流、对象流、文件流等,用于不同类型的I/O操作。 10. **多线程**:Java提供了内置的多线程支持,通过Thread类和Runnable接口可以创建并运行线程。线程同步和互斥...

    JAVASE6.0_Api_en\docs\api

    Java 6加强了对国际字符集的支持,提供了java.text和java.util.Locale等类来处理不同语言和地区的文本及格式。 四、XML处理 Java SE 6.0改进了XML处理能力,包括DOM、SAX和StAX解析器,以及JAXB(Java Architecture...

    JavaSE专题-IO流重点总结(必读).doc

    字节流和字符流的主要区别在于处理数据的单位,字节流每次处理一个字节,而字符流处理一个字符(两个字节)。Java中,所有的流都继承自`java.io`包下的抽象类,而不是接口。字节流的主要类有`InputStream`(字节输入...

    JavaSE基础入门视频教程33天之(24)

    `day24_04`和`day24_02`分别介绍了转换流`CharacterOutputStream`和`InputStream`,这两个流是字节流和字符流之间的桥梁,允许在字节流和字符流之间进行转换,适应不同的数据格式。 最后,`day24_15`视频展示了如何...

    javaSEjavaSE

    I/O流允许程序进行输入输出操作,支持字符流和字节流,以及缓冲区、转换流等高级功能。网络编程方面,Java提供了Socket和ServerSocket类,用于实现客户端和服务器之间的通信。 多线程是Java的一大亮点,Thread类和...

Global site tag (gtag.js) - Google Analytics