Java刷题知识点之字符流缓冲区、BufferedWriter、BufferedReader、BufferedReader-readLine方法原理、自定义MyBufferedReader-read方法、自定义MyBufferedReader-readLine方法

简介:

  不多说,直接上干货!

 

  把提高效率的动作,封装成一个对象。即把缓冲区封装成一个对象。

  就是在一个类里封装一个数组,能对流锁操作数据进行缓存。

 

 

什么是字符流缓冲区?

  善于使用字符流缓冲区,减轻负担,提高下效率。

   

其实啊,无非是将源中数据,存储到自定义数组里,进行缓存。并对数组操作,从而提高效率。

  即BufferedReader 比 FileReader要增强。

     BufferedWriter 比 FileWriter要增强。

 

 

 

 

 

 

什么情况下需要使用字符流缓冲区?

   先从一个例子,来由浅入深的

 

 

   为了提高写入的效率,需引入字符流的缓冲区。

 

 

 

 

BufferedWriterDemo.java

 

 

复制代码
package zhouls.bigdata.DataFeatureSelection.test;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo { 
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("buf.txt");
        //为了提高写入的效率。使用了字符流的缓冲区。
        //创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联
     BufferedWriter bufw = new BufferedWriter(fw);
        
        //使用缓冲区的写入方法将数据先写入到缓冲区中。
        bufw.write("abcdefq"+LINE_SEPARATOR+"hahahha");
        bufw.write("xixiixii");
        bufw.newLine();
        bufw.write("heheheheh");

        //使用缓冲区的刷新方法将数据刷目的地中。
        bufw.flush();
        
        //关闭缓冲区。其实关闭的就是被缓冲的流对象。
        bufw.close();
    }
}
复制代码

  由fw变成bufw

 

 

 

 

 

 

  同样,为了读取的效率,引入字符流缓冲区。

BufferedReaderDemo.java

 

 

复制代码
package zhouls.bigdata.DataFeatureSelection.test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("buf.txt");
        BufferedReader bufr = new BufferedReader(fr);
        String line = null;
        while((line=bufr.readLine())!=null){
            System.out.println(line);
        }

        bufr.close();

    }

    /**
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void demo() throws FileNotFoundException, IOException {
        FileReader fr = new FileReader("buf.txt");
        char[] buf = new char[1024];
        int len = 0;
        while((len=fr.read(buf))!=-1){
            System.out.println(new String(buf,0,len));
        }
        fr.close();
    }
}
复制代码

 

 

 

 

 

 

 BufferedReader-readLine方法原理

   

 

 

 

 

 

 

 

 

 

 

自定义MyBufferedReader-read方法和自定义MyBufferedReader-readLine方法

 

 

  

 

 

MyBufferedReader.java

   其实啊,无非是将源中数据,存储到自定义数组里,进行缓存。并对数组操作,从而提高效率。

  即BufferedReader 比 FileReader要增强。

     BufferedWriter 比 FileWriter要增强。

 

 

 

 

 

复制代码
package zhouls.bigdata.DataFeatureSelection.test;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
 * 自定义的读取缓冲区。其实就是模拟一个BufferedReader.
 * 
 * 分析:
 * 缓冲区中无非就是封装了一个数组,
 * 并对外提供了更多的方法对数组进行访问。
 * 其实这些方法最终操作的都是数组的角标。
 * 
 * 缓冲的原理:
 * 其实就是从源中获取一批数据装进缓冲区中。
 * 在从缓冲区中不断的取出一个一个数据。
 * 
 * 在此次取完后,在从源中继续取一批数据进缓冲区。
 * 当源中的数据取光时,用-1作为结束标记。 
 *  
 * @author Administrator
 */

public class MyBufferedReader extends Reader {
    private Reader r;

    //定义一个数组作为缓冲区。
    private char[] buf = new char[1024];
    
    //定义一个指针用于操作这个数组中的元素。当操作到最后一个元素后,指针应该归零。    
    private int pos = 0;    
    
    //定义一个计数器用于记录缓冲区中的数据个数。 当该数据减到0,就从源中继续获取数据到缓冲区中。
    private int count = 0;
    
    MyBufferedReader(Reader r){
        this.r = r;
    }
    
    /**
     * 该方法从缓冲区中一次取一个字符。 
     * @return
     * @throws IOException
     */
    public int myRead() throws IOException{
        if(count==0){
            count = r.read(buf);
            pos = 0;
        }
        if(count<0)
            return -1;
        char ch = buf[pos++];
        count--;
        return ch;
    
        /*
        //1,从源中获取一批数据到缓冲区中。需要先做判断,只有计数器为0时,才需要从源中获取数据。
        if(count==0){
            count = r.read(buf);
            
            if(count<0)
                return -1;
            
            //每次获取数据到缓冲区后,角标归零.
            pos = 0;
            char ch = buf[pos];
            
            pos++;
            count--;
            
            return ch;
            
        }else if(count>0){
            
            char ch = buf[pos];
            
            pos++;
            count--;
            
            return ch;
            
        }*/
    }
    
    public String myReadLine() throws IOException{
        StringBuilder sb = new StringBuilder();
        int ch = 0;
        while((ch = myRead())!=-1){
            if(ch=='\r')
                continue;
            if(ch=='\n')
                return sb.toString();
            //将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中。
            sb.append((char)ch);
        }        
        if(sb.length()!=0)
            return sb.toString();
        return null;
    }

    public void myClose() throws IOException {
        r.close();
    }

    public int read(char[] cbuf, int off, int len) throws IOException {
        
        return 0;
    }

    public void close() throws IOException {
    }
}
复制代码

 

 

 

 

 

 

 

 MyBufferedReaderDemo.java

复制代码
package zhouls.bigdata.DataFeatureSelection.test;

import java.io.FileReader;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;

public class MyBufferedReaderDemo {
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("buf.txt");
        MyBufferedReader bufr = new MyBufferedReader(fr);
        String line = null;
        while((line=bufr.myReadLine())!=null){
            System.out.println(line);
        }
        bufr.myClose();
        Collections.reverseOrder();
        HashMap map = null;
        map.values();    
    }
}


本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/7577871.html,如需转载请自行联系原作者
相关文章
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
253 18
|
2月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
212 4
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
313 5
|
3月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
154 11
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
4月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
416 0
|
4月前
|
存储 Java 数据处理
Java映射操作:深入Map.getOrDefault与MapUtils方法
结合 `getOrDefault`方法的简洁性及 `MapUtils`的丰富功能,Java的映射操作变得既灵活又高效。合理地使用这些工具能够显著提高数据处理的速度和质量。开发人员可以根据具体的应用场景选择适宜的方法,以求在性能和可读性之间找到最佳平衡。
197 0
|
Java Android开发
【Java 虚拟机原理】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 | 静态变量 )
【Java 虚拟机原理】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 | 静态变量 )
225 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
189 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
213 1