黑马程序员-探究字符流一

来源:互联网 发布:微店和淘宝店发展趋势 编辑:程序博客网 时间:2024/06/06 20:23

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! -------

package it.heima.mylog;


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

public class FileReaderAndFileWriter {

 /**

* 第一训练:
* 1,读取一个已有的文本文件,使用字符读取流和文件相关联。 
* FileReader fr = new FileReader("IO.txt");
* 2,创建一个目的,用于存储读到的数据。
* FileWriter fw = new FileWriter("IO2.txt"); 
* 3,频繁的读写操作 
* int ch = 0; while((ch = fr.read()) != -1){ fw.write(ch); }
* 4,关闭流
* fr.close(); 
* fw.close();
**********************************************************
* 第二训练:
* FileReader fr = null; 
* FileWriter fw = null; try{ fr = new FileReader("IO3.txt"); fw = new FileWriter("IO4.txt");
* 创建一个临时容器,用于缓存读到的字符。 
* char[] buf = new char[1024];
* 定义一个变量记录读到的字符串,其实就是往数组里装的字符个数。 
* int len = 0; while((len = fr.read(buf)) != -1){ fw.write(buf,0,len); } }
* catch(Exception e){ System.out.println("读写失败"); throw new RuntimeException("读写失败");}
* finally{ if(fw != null) try{ fw.close(); }catch(IOException e){
* e.printStackTrace(); } if(fr != null) try{ fr.close();
* }catch(IOException e){ e.printStackTrace(); } }
**********************************************************
* 第三训练 
* FileReader fr = new FileReader("IO3.txt"); 
* BufferedReader buff = new BufferedReader(fr); String line = null; 
* while((line = buff.readLine()) != null){ System.out.println(line); }
**********************************************************
* 第四训练 
* FileWriter fw = new FileWriter("IO6.txt");
* 为了提高写入的效率,使用了字符流的缓冲区。
* 创建一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联
* BufferedWriter bufw = new BufferedWriter(fw);
* 使用缓冲区的写入方法现将数据写入到缓冲区中。
* bufw.write("dvghdghka"+"hjkvhdskjvnsdljvnlsd");
* bufw.write("scjnlcnzljckadf"); bufw.newLine();
* bufw.write("heheheehehe"); for(int x = 1; x <= 4; x++){
* bufw.write("jdksfjksdl"+x); bufw.newLine(); bufw.flush();//自动刷 }
* 使用缓冲区的刷新方法将数据刷到目的地中 bufw.flush(); //关闭缓冲区。就是关闭被缓冲的流对象 bufw.close();
**********************************************************
* 第五训练 
* FileReader fr = new FileReader("IO5.txt"); 
* BufferedReader bufr = new BufferedReader(fr); 
* FileWriter fw = new FileWriter("IO9.txt");
* BufferedWriter bufw = new BufferedWriter(fw); 
* String line = null;
* while((line = bufr.readLine()) != null){ bufw.write(line);bufw.newLine(); bufw.flush(); }
* int ch = 0; while((ch = bufr.read()) != -1){ bufw.write(ch); }
* bufr.close(); bufw.close();
* **********************************************************
* 第六训练
* 自定义的读取缓冲区,就是模拟一个Bufferedreader.

* 分析:
*  1,缓冲区其实就是一个封装了的数组。 
*  2,并对外提供了更多的方法对数组进行访问。 
*  3,这些方法最终操作的都是数组角标。

* 缓冲的原理: 
* 1,缓冲区的原理是从源中获取一批一批数据装进缓冲区中。
* 2,在从缓冲区中不断的取一个一个数据。
* 3,在此次取完后,在从缓冲区继续取一批数据进缓冲区。 
* 4,当源中的数据取光时,用-1作为结束标记。

* MyBufferedReader
*/
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("IO9.txt");
MyBufferedReader bufr = new MyBufferedReader(fr);
String line = null;
while ((line = bufr.myReadLine()) != null) {
System.out.println(line);
}
bufr.close();
}
}

class MyBufferedReader extends Reader {
// 注意:继承Reader类必须实现或重写read(char[],int,int),close()方法。
private Reader r;
// 定义一个字符数组char[],作为缓冲区。
private char[] buf = new char[1024];
// 定义一个指针pos,用于操作这个数组中的元素。当操作到最后一个元素时,指针应归零。
private int pos = 0;
// 定义一个计数器count,用于记录缓冲区中数据的个数。当该数据见到0时,就从源中继续获取数据到缓冲区中。
private int count = 0;

MyBufferedReader(Reader r) {
this.r = r;
}

public int myRead() throws IOException {
// 从源中获取一批数据到缓冲区中,需要先做判断,只有计数器为零时才需要从源中获取数据。
// 每次从源中获取数据后,指针pos要归零。
if (count == 0) {
count = r.read(buf);
pos = 0;
}
if (count < 0) {
return -1;
}
char ch = buf[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 int read(char[] cbuf, int off, int len) throws IOException {
return 0;
}
@Override
public void close() throws IOException {
r.close();
}
}

/*
 * 每日单词: IDE Integrated Development Environment 集成开发环境 API Application
 * Programming Interface 应用程序编程接口 GUI Graphics User Interface 图形用户界面 DBMS Data
 * Base XXXX System 数据库管理系统 IDL Interface Definition Language 接口定义语言 AWT
 * Abstrack Windows TooleKit 抽象窗口工具箱 abstrack windows toolekit abstrack windows
 * toolekit abstrack windows toolekit
 * 错误 数据库管理系统 management 管理 management management man age ment 男人 年龄 ment
 * management管理

 */

//------------------------------------------------------------------------------------------------------------------------------------2014年3月14日 星期五 整理

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! -------
0 0
原创粉丝点击