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

来源:互联网 发布:java 卷二第十版pdf 编辑:程序博客网 时间:2024/05/16 09:46

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