---------------------- 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培训、期待与您交流! ----------------------