`
Luob.
  • 浏览: 1590429 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之19天 IO 字符缓冲区(一)

    博客分类:
  • Java
阅读更多

BufferedWriter
BufferedReader


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

/**
 * IO中 字符流的缓冲技术
 * 1)缓冲区的出现提高了对数据的读写效率.
 * 2)对应类.
 *    BufferedWriter
 *    BufferedReader
 * 3)缓冲区要结合流才可以使用.
 * 4)在流的基础上对流的功能进行了增强.
 *
 *
 * 缓冲区的出现是为了提高流的操作效率而出现的.
 * 所以在创建缓存区之前,必须要先有流对象.
 * 
 * 该缓冲区中 提供了一个跨平台的换行符.newLine();
 */
public class BufferedWriterDemo {

	public static void main(String[] args) throws IOException {
	
		//创建一个字符写入流对象
		FileWriter fw=new FileWriter("buf.txt");
		
		//为了提高字符写入流的效率,加入缓存技术.
		//只要将需要提高效率的流对象作为参数传递给缓冲区的构造函数即可
		BufferedWriter bufw=new BufferedWriter(fw);
		bufw.write("ab\r\ncde");
	
		bufw.newLine();// 换行  window:\r\n  linux:\n

		for(int x=0;x<5;x++){
			bufw.write("abc"+x);
			bufw.newLine();  //自动换行方法
			bufw.flush();  //必须要刷新, 如果不小心停电了 ,这样不会丢失数据
		}
		
		
		//记住只要用到缓冲区 ,就要记得刷行.
		bufw.flush();
		
		//其实关闭缓冲区,就是关闭缓冲区中的流对象
		bufw.close();
		//这句不用写了
		//fw.close();
		
		
	}

}



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

/**
 * 读取缓冲区
 * 该缓冲区提供了一个一次读取一行的方法 readLine,(但不包含行终止符号.即不会换行,这是有效文本)方便对文本数据的获取.
 * readLine():只返回回车符好之前的数据内容,并不返回回车符号
 * 当返回null 表示读取到了文件的末尾
 */
public class BufferedReaderDemo {


	public static void main(String[] args) throws IOException {
		//创建一个读取流对象和文件相关联.
		
		FileReader fr=new FileReader("buf.txt");
		
		//为了提高效率,加入缓冲技术
		//将字符读取流对象作为参数传递给缓冲对象的构造函数
		BufferedReader  bufr=new BufferedReader(fr);
		
		/*String s1=bufr.readLine();  //提供的读取一行
		System.out.println("s1:"+s1);
		*/
		String line=null;
		while((line=bufr.readLine())!=null){
			System.out.println(line);
		}
		bufr.close();
		
	}

}


自定义BufferedReader模拟里面的功能

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


/**
 * 明白了BufferedReader类中的特有方法,readLine的原理后
 * 可以自定义一个类中包含一个功能和readLine一致的方法.
 */
public class MyBufferedReaderDemo {

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

		FileReader fr=new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\SystemDemo.java");
		
		MyBufferedReader mbufr=new MyBufferedReader(fr);
		
		String line=null;
		
		while((line=mbufr.myReaderLine())!=null){
			System.out.println(line);
		}
		mbufr.myClose();
	}

}

//装饰设计模式  模拟 BufferedReader 对 read() 
class MyBufferedReader{
	private FileReader fr;
	MyBufferedReader(FileReader fr){
		this.fr=fr;
	}
	//可以一次读一行的方法.
	public String myReaderLine() throws IOException{
		//定义一个临时的容器,原BufferedReader封装的是一个字符数组
		//为了演示方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串.
		StringBuilder sb=new StringBuilder();
		int ch=0;
		while((ch=fr.read())!=-1){
			if(ch=='\r')
				continue;
			
			if(ch=='\n')
				return sb.toString();
			else
				sb.append((char)ch);
		}
		if(sb.length()!=0) //如果最后一行没有 \n  会丢失最后一行
			return sb.toString();
		return null;
		
	}
	
	public void myClose() throws IOException{
		fr.close();
	}
}


MyBufferedReader1的升级完善

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


/**
 * 明白了BufferedReader类中的特有方法,readLine的原理后
 * 可以自定义一个类中包含一个功能和readLine一致的方法.
 */
public class MyBufferedReaderDemo1 {

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

		FileReader fr=new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\SystemDemo.java");
		
		MyBufferedReader1 mbufr=new MyBufferedReader1(fr);
		
		String line=null;
		
		while((line=mbufr.myReaderLine())!=null){
			System.out.println(line);
		}
		mbufr.close();
	}

}

//装饰设计模式  模拟 的完善
class MyBufferedReader1 extends Reader{
	//现在只能对FileReader进行装饰
	//private FileReader fr;
	
	//这样我们就可以对 Reader 这样 一组类进行 装饰了
	private Reader fr;
	//MyBufferedReader1(FileReader fr){
	MyBufferedReader1(Reader fr){
		this.fr=fr;
	}
	//可以一次读一行的方法.
	public String myReaderLine() throws IOException{
		//定义一个临时的容器,原BufferedReader封装的是一个字符数组
		//为了演示方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串.
		StringBuilder sb=new StringBuilder();
		int ch=0;
		while((ch=fr.read())!=-1){
			if(ch=='\r')
				continue;
			
			if(ch=='\n')
				return sb.toString();
			else
				sb.append((char)ch);
		}
		if(sb.length()!=0) //如果最后一行没有 \n  会丢失最后一行
			return sb.toString();
		return null;
		
	}
	
	
	
	//复写 Reader中的close
	public void close() throws IOException{
		fr.close();
	}
	
	//复写 Reader中的read
	public int read(char[] cbuf, int off, int len) throws IOException {
		// TODO Auto-generated method stub
		return fr.read(cbuf, off, len);
	}
}


装饰上设计模式

/**
 * 装饰设计模式:
 * 当想对已有的对象进行功能增强时候
 * 可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.
 * 那么自定义的该类称为"装饰类"
 * 
 * 装饰类通常会通过构造方法接受被装饰的对象.
 * 并基于被装饰的对象功能提供更强的功能.
 * 
 * 
 * 装饰类和 继承 的区别
 * MyReader //专门用户读取数据的类
 *   |--myTextReader
 *   |--myMediaReader
 * 
 * 一年后,发现 以上的读取速度有点慢,想到了缓冲技术
 *  MyReader //专门用户读取数据的类
 *   |--myTextReader
 *   	|--MyBufferTextReader
 *   |--myMediaReader
 *      |--MyMediaReader
 *      
 * 一年后 出现了新的数据类型
 *   MyReader //专门用户读取数据的类
 *   |--myTextReader
 *   	|--MyBufferTextReader
 *   |--myMediaReader
 *      |--MyBufferMediaReader
 *   |--MyDataReader
 *      |--myBufferDataReader
 *  
 *  既然上面使用的缓冲技术都是同一种技术,这样发现上面的结构 都比较 臃肿
 *  
 *  class MyBufferReader{
 *  	myBufferTextReader(myTextReader r){
 *  
 *  	}
 *  	myBufferMediaReader(myMediaReader r){
 *  
 *  	}
 *  	myBufferDataReader(myDataReader r){
 *  
 *  	}
 *  }
 *  
 *  又发现以上的类的扩展性极差
 *  找到其参数的共同类型,通过多态的形式,可以提高扩展性
 *  
 *  class MyBufferReader extends MyReader{
 *  
 *  	MyReader r;  //组合结构
 *  	MyBufferReader(MyReader r){
 *  		this.r=r;
 *  	}
 *  	
 *  	public void myBufferReader(){
 *  		//缓存操作
 *  	}
 *  }
 *  
 *  //最后的结构是 
 *  MyReader //专门用户读取数据的类
 *   |--myTextReader
 *   |--myMediaReader
 *   |--myDataReader
 *   |--myBufferReader
 *   
 *  总结:
 *    装饰类比继承跟灵活,避免了继承体系的臃肿
 *    而且降低了类和类之间的关系.
 *    装饰类因为增强已有兑对象,具备的功能和已有的是相同的,只不过是提供更强大的功能
 *    所以装饰类 和被装饰类通常都属于一个体系.
 *    由以前的继承结构 -->变成了 -->组合结构
 * 
 */
public class DecorationDemo {
	
	public static void main(String[] args) {
		Person p=new Person();
		p.chifan(); //以前吃饭是这样的
		System.out.println("========生活富裕了==========");
		SuperPerson sp=new SuperPerson(p);
		sp.superChifan();
		
	}
}

class Person{
	public void chifan(){
		System.out.println("吃饭");
	}
}

class SuperPerson{
	Person p;
	SuperPerson(Person p){
		this.p=p;
	}
	
	//后来人升级了, 吃饭的方法也不同了.
	public void superChifan(){
		System.out.println("喝汤");
		System.out.println("开胃酒");
		p.chifan();
		System.out.println("甜点");
		System.out.println("来一根");
	}
}


通过缓冲区复制一个.java文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 通过缓冲区复制一个.java文件
 */
public class CopyTextByBuf {

	public static void main(String[] args) {
		
		BufferedReader bufr=null;
		BufferedWriter bufw=null;
		try {
			bufr=new BufferedReader(new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\SystemDemo.java"));
			bufw=new BufferedWriter(new FileWriter("bufWriter_copy.txt"));
			
			String line=null;  //这就变成了中转站  替换了 char[]  
			while((line=bufr.readLine())!=null){
				bufw.write(line);
				bufw.newLine();
				bufw.flush();
			}
		} catch (Exception e) {
			e.printStackTrace(); //读写失败
		}finally{
			if(bufr!=null)
				try{
					bufr.close();
				}catch(IOException e){
					throw new RuntimeException("读取关闭失败");
				}
			if(bufw!=null)
				try{
					bufw.close();
				}catch (IOException e) {
					throw new RuntimeException("写入关闭失败");
				}
			
		}
		
		
		
	}

}

0
4
分享到:
评论

相关推荐

    利用缓冲区提高Java应用程序的IO性能

    ### 利用缓冲区提高Java应用程序的IO性能 #### 摘要与背景介绍 Java作为一门具有跨平台特性的编程语言,在多个领域都获得了广泛的应用。随着Java应用的不断扩展,其性能问题逐渐成为人们关注的重点,尤其是输入...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、...3、JAVA IO流经典代码示例,示例从易到难。代码功能涉及字节、字符、字符串、文本文件、图片、音频、视频。演示错误用法和经典用法。 4、代码的结构可查看README文件。

    Java IO字符流缓冲区实现原理解析

    Java IO字符流缓冲区实现原理解析是Java编程语言中的一种重要机制,该机制旨在提高IO操作的效率和性能。缓冲区是Java IO字符流中的一种机制,它可以将数据暂存起来,以便提高读写效率。在本文中,我们将深入探讨Java...

    java生成线缓冲区的代码

    线缓冲区的生成就是其中之一。 以下是一个简单的Java代码示例,展示了如何使用JTS库生成线缓冲区: ```java import org.locationtech.jts.geom.*; import org.locationtech.jts.io.ParseException; import org....

    java IO教程,java IO教程,java IO教程

    java IO教程,java IO教程,java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程,java IO教程,java IO教程,java IO...

    Java IO 字节流 字符流

    此外,Java还提供了一些缓冲流,如BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter,它们提高了读写性能,通过内部缓冲区批量处理数据。这些缓冲流可以在字节流和字符流上进行包装,...

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...

    Java-Io流,练习

    总结来说,Java的IO流是一个庞大且重要的主题,涵盖了数据的输入、输出、缓冲、转换等多个方面。对于初学者而言,理解和掌握IO流的基本概念、分类以及常用类的用法是至关重要的。通过实践练习,可以加深对IO流的理解...

    标准c库的io缓冲区操作图示说明

    fgetc函数可能通过系统调用进入内核读1K字节到IO缓冲区中,然后返回IO缓冲区中的第一个字节给用户,把读写位置指向IO缓冲区中的第二个字符,以后用户再调fgetc,就直接从IO缓冲区中读取,而不需要进内核了,当用户把...

    java字符流缓冲区详解

    Java 字符流缓冲区是 Java 中用于提高 IO 操作效率的一种机制,它通过在内存中缓存一部分数据,然后批量写入或读取,以提高流的读写效率。在 Java 中,BufferedReader 和 BufferedWriter 是两个常用的缓冲类,它们...

    Java IO_NIO

    Java IO(Input/Output)是Java编程语言中用于处理输入输出操作的基础框架,它提供了丰富的类库,使得程序能够与各种设备、文件、网络进行数据交互。然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,...

    IO流 javaio java 流

    - 缓冲字符流(BufferedReader/BufferedWriter):提高读写性能,通过内部缓冲区进行操作。 - 转换流(InputStreamReader/OutputStreamWriter):用于在字节流和字符流之间转换。 3. 处理流: - Filter流:这些...

    java IO流精讲 JAVA IO流实例开发

    Java IO流的精讲涵盖了许多概念和技术,包括流的分类、流的方向、缓冲区的使用、字符编码以及一些实用的IO类和方法。在实例开发中,我们将深入理解这些概念并应用到实际项目中。 首先,Java IO流按照数据传输的方向...

    java IO.chm

    这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...

    java基础之IO流

    ### Java IO流基础知识点 #### 一、IO流概述 - **定义**:在Java中,IO流(Input/Output Streams)是用来处理输入输出的基本工具。流是一种有序的数据集合,通常涉及从源到目的地的数据传输过程。源可以是文件、...

    Java IO流之字符缓冲流实例详解

    Java IO流中的字符缓冲流(Character Buffer Stream)是提高数据读写效率的重要工具,它针对字符流进行优化,尤其在处理大量文本数据时效果显著。本文将深入解析字符缓冲流的使用及其作用。 字符流主要分为两个核心...

    Java IO

    Java NIO提供了与传统I/O不同的I/O工作方式,它引入了缓冲区(Buffer)和通道(Channel)的概念,支持非阻塞式IO。相对于传统的IO,NIO支持面向缓冲区的、基于通道的I/O操作。NIO还引入了选择器(Selector)的概念,允许...

    Java IO应届生培训讲义

    Java IO应届生培训讲义是一份面向刚毕业的大学生进行Java IO相关知识的培训资料,它涵盖了Java IO的基础知识、不同的IO模型以及Java中的BIO、NIO和AIO高级IO类库。下面详细解释这些知识点: 1. 用户空间和内核空间 ...

    java-IO框架图

    Java IO系统的设计基于流(Stream)的概念,流可以视为数据传输的通道,允许我们对文件、网络连接、内存缓冲区等进行读写操作。 在Java IO框架中,主要分为字符流和字节流两大类。字节流处理单个字节的数据,包括...

    Java IO字符流和字节流

    ### Java IO字符流和字节流详解 #### 一、引言 在Java编程中,输入输出(简称IO)操作是十分重要的一个方面。通过IO操作,我们可以读取文件、网络数据、用户输入等,也可以将数据写入到文件、网络、控制台等。Java...

Global site tag (gtag.js) - Google Analytics