黑马程序员--IO流的学习笔记(一)

---------------------- android培训java培训、期待与您交流! ----------------------

流的使用思路

1.创建缓冲区前必须先有流,

创建一个字符写入流

FileWriter fw = new File ("buf.txt");

2.提高流的效率

为了提高字符写入流的效率,加入了缓冲技术。
只需要将需要提高的流对象作为参数传递给缓冲区的构造函数即可;
BufferedWriter bufw = new BufferedWriter (fw);

bufw.writer("abcsdsdg");

3.关闭流

bufw.close();

bufw.close();

注意:在关闭流的时候,其实关闭缓冲区就是关闭缓冲区的流对象,所以fw.close()不用写

记住:只要用到缓冲区,记住就要刷新,


装饰模式与继承相比的优势

装饰模式比继承要灵活,避免了继承体系臃肿.而且降低了类于类之间的关系
装饰类应为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强大的功能。
所以装饰类和被装饰类通长是属于同一个体系的。
package com.ccit;


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


public class MyLineNumberReader {


	/**
	 * @param args
	 */
	private Reader r ;
	private int lineNumber;
	MyLineNumberReader(Reader r)
	{
		this.r = r;
	}
	public String myReadLine() throws IOException
	{
		StringBuilder sd = new StringBuilder();
		int ch = 0;
		while ((ch = r.read())!= -1)
		{
			if(ch=='\r')
				continue;
			if(ch == '\n')
			{
				lineNumber++;
				return lineNumber+":"+sd.toString();
			}
			else
			   sd.append((char)ch);
		}
		if(sd.length()!=0)
			return sd.toString();
		return null;
	}
	public void setLineNumber(int lineNumber)
	{
		this.lineNumber = lineNumber;
	}
	public int getLineNumber(int lineNumber)
	{
		return lineNumber;
	}
	public void myClose() throws IOException
	{
		r.close();
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
       FileReader fr = new FileReader("abc.txt");
       MyLineNumberReader mr =   new MyLineNumberReader(fr);
       String line = null;
       while ((line = mr.myReadLine())!=null)
       {
    	   System.out.println(line);
       }
       mr.myClose();
	}


}



/**字符流
 * Filereder FileWriter
 * BufferedReader BufferedWriter
 * 字节流
 * InputStream Outputstream
 * FileInputStream FileOutputStream
 * BufferedInputSteam BufferedOutputStream


import java.io.InputStream;


public class ReadIn {


/**获取键盘的输入。
* System.out 对应的标准的输出设备,控制台
* 而System.in 对应的是标准的输入设备,默认是键盘
* 
* System.in 返回一个InputStream的对象
* 
* 需求
* 通过键盘录入数据。
* 当录入一行数据后,就将该数据进行打印。
* 输入的是over,那么停止录入。
* @param args
* @throws IOException 
*/
public static void main(String[] args) throws IOException {
InputStream in = System.in;
/*int by1 = in.read();

System.out.println((char)by1);
*/
StringBuilder sb = new StringBuilder ();
while(true)
{
int ch = in.read();
if(ch=='\r')
continue;
if(ch=='\n')
{
String s = sb.toString();
if("over".equals(s))
break;
System.out.println(s);
//每次回车后记得清空缓冲区
sb.delete(0,sb.length());
}
else sb.append((char)ch);
}
}


}


------------------------------

/*

思考问题

通过刚才的键盘录入一行数据的方法并打印,发现其实就是对一行数据的原理。也就是ReadLine方法
能不能使用readLine方法来完成键盘的录入的一行数据的读取呢?
readLine方法是BufferedRead类中的方法,而键盘录入的read方法是键盘录入的read方法是InptStream的方法
那么能不能将字节流转换为字符流,然后再使用字符流中的readLine方法呢?
InputStreamReader类是字节流转换为字符流的桥梁
还有字符通向字节的桥梁
OutputStreamWriter
*/


//创建键盘录入的对象inputStream
InputStream in = System.in;
//将字节流对象转为字符流对象,使用InputStreamReader对象
InputStreamReader isr = new InputStreamReader(in);

//为了提高效率,将字符流流进行缓冲技术的高效操作。使用BufferedReader对象的readLine方法。
BufferedReader  bufr = new BufferedReader(isr);

----------------------------------------
InputStream in= System.in;
InputStreamReader isr = new InputStreamReader(in);
BufferedReader bufr = new BufferedReader(isr);

OutputStream out = System.out;
OutputStreamWriter osw= new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);

String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
//System.out.println(line);
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
}


我的疑惑

既然OutputStreamWriter是字符流通向字节流的对象,那么上边的几个实例又是如何调用的呢,难道是BufferedWriter中相应的方法转化为OutputStream来向外输出吗?

InputStream in= System.in;
InputStreamReader isr = new InputStreamReader(in);
BufferedReader bufr = new BufferedReader(isr);
键盘录入的简写,键盘录入的最常见的写法

BufferedReader bufr = new Bufferedareader(new InputStreamReader(System.in));

----------------------android培训java培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值