标签:
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
字符流的缓冲区
l 缓冲区的出现提高了对数据的读写效率。
l 对应类
• BufferedWriter
• BufferedReader
l 缓冲区要结合流才可以使用。
l 在流的基础上对流的功能进行了增强。
1, BufferedWriter
每次可以写入一行,缓冲区的出现是为了提高流的操作效率而出现的。所以在创建缓冲区之前,必须要先有流对象。该缓冲区中提供了一个跨平台的换行符,newLine();
- public class BufferedWriterDemo {
- public static void main(String[] args) {
- FileWriter fw = null;
- BufferedWriter bw = null;
- try {
-
- fw = new FileWriter("target.txt");
-
-
- bw = new BufferedWriter(fw);
- for(int x=1; x<5; x++)
- {
- bw.write("abcd"+x);
- bw.newLine();
- bw.flush();
- }
-
-
- } catch (IOException e) {
-
- e.printStackTrace();
- }finally{
- if(bw!=null){
- try {
-
- bw.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
2,BufferedReader
- 该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
- 当返回null时,表示读到文件末尾。
- readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
- */
-
- public class BufferedReaderDemo {
-
- public static void main(String[] args) {
-
- FileReader fr = null;
- BufferedReader br = null;
- try {
-
- fr = new FileReader("target.txt");
-
- br = new BufferedReader(fr);
- String readLine = null;
- while((readLine=br.readLine())!=null){
- System.out.print(readLine);
- }
- } catch (Exception e) {
-
- e.printStackTrace();
- }finally{
- if(br!=null){
- try {
- br.close();
- } catch (IOException e) {
-
- e.printStackTrace();
- }
- }
- }
- }
- }
3,通过缓冲区复制文件
readLine方法的原理,无论是读一行,获取读取多个字符。其实最终都是在硬盘上一个一个读取,所以最终使用的还是read方法一次读一个的方法。
- public class CopyFileByBuff {
- public static void main(String[] args) {
-
- BufferedReader br = null;
- BufferedWriter bw = null;
- try {
- br = new BufferedReader(new FileReader("CopyText.java"));
- bw = new BufferedWriter(new FileWriter("targetFile.txt"));
- String line = null;
- while((line = br.readLine())!=null){
- bw.write(line);
- bw.newLine();
- bw.flush();
- }
- } catch (Exception e) {
-
- throw new RuntimeException("读写失败");
- }finally{
- if(br !=null){
- try {
- br.close();
- } catch (IOException e) {
-
- throw new RuntimeException("读取关闭失败");
- }
- }
- if(bw !=null){
- try {
- bw.close();
- } catch (IOException e) {
-
- throw new RuntimeException("写入关闭失败");
- }
- }
- }
- }
- }
4,自定义字符缓冲区
- import java.io.*;
- class MyBufferedReader extends Reader
- {
- private Reader r;
- MyBufferedReader(Reader r)
- {
- this.r = r;
- }
-
- public String myReadLine()throws IOException
- {
-
-
- StringBuilder sb = new StringBuilder();
- int ch = 0;
- while((ch=r.read())!=-1)
- {
- if(ch==‘\r‘)
- continue;
- if(ch==‘\n‘)
- return sb.toString();
- else
- 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 r.read(cbuf,off,len) ;
- }
- public void close()throws IOException
- {
- r.close();
- }
- public void myClose()throws IOException
- {
- r.close();
- }
- }
- class MyBufferedReaderDemo
- {
- public static void main(String[] args) throws IOException
- {
- FileReader fr = new FileReader("buf.txt");
- MyBufferedReader myBuf = new MyBufferedReader(fr);
- String line = null;
- while((line=myBuf.myReadLine())!=null)
- {
- System.out.println(line);
- }
- myBuf.myClose();
- }
- }
5,
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类将已有对象传入,基于已有的功能并提供
加强功能,那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能提供更强的功能。
- public class PersonDemo {
- public static void main(String[] args) {
-
- Person p = new Person();
-
- SuperPerson sp = new SuperPerson(p);
- sp.superChifan();
- }
- }
- class Person {
- public void chifan() {
- System.out.println("吃饭");
- }
- }
- class SuperPerson {
- private Person p;
- SuperPerson(Person p) {
- this.p = p;
- }
- public void superChifan() {
- System.out.println("开胃酒");
- p.chifan();
- System.out.println("甜点");
- System.out.println("来一根");
- }
- }
6,装饰和继承的区别
优化前的体系:
MyReader :专门用于读取数据的类。
|--MyTextReader :读取文本
|--MyBufferTextReader :读取文本缓冲区
|--MyMediaReader :读取媒体
|--MyBufferMediaReader :读取媒体缓冲区
|--MyDataReader :读取数据
|--MyBufferDataReader :读取数据缓冲区
优化后的体系:
MyReader :专门用于读取数据的类。
|--MyTextReader :读取文本
|--MyMediaReader :读取媒体
|--MyDataReader :读取数据
|--MyBufferReader :缓冲区
装饰模式要比继承要灵活,避免了继承体系额臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过是提供了更强的功能。
所以装饰类和被装饰类通常都属于一个体系中。
7,自定义装饰类
- import java.io.*;
- class MyBufferedReader extends Reader
- {
- private Reader r;
- MyBufferedReader(Reader r)
- {
- this.r = r;
- }
-
- public String myReadLine()throws IOException
- {
-
-
- StringBuilder sb = new StringBuilder();
- int ch = 0;
- while((ch=r.read())!=-1)
- {
- if(ch==‘\r‘)
- continue;
- if(ch==‘\n‘)
- return sb.toString();
- else
- 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 r.read(cbuf,off,len) ;
- }
- public void close()throws IOException
- {
- r.close();
- }
- public void myClose()throws IOException
- {
- r.close();
- }
- }
- class MyBufferedReaderDemo
- {
- public static void main(String[] args) throws IOException
- {
- FileReader fr = new FileReader("buf.txt");
- MyBufferedReader myBuf = new MyBufferedReader(fr);
- String line = null;
- while((line=myBuf.myReadLine())!=null)
- {
- System.out.println(line);
- }
- myBuf.myClose();
- }
- }
8,字节流File读写操作
- import java.io.*;
- class FileStream
- {
- public static void main(String[] args) throws IOException
- {
- readFile_3();
- }
- public static void readFile_3()throws IOException
- {
- FileInputStream fis = new FileInputStream("fos.txt");
- byte[] buf = new byte[fis.available()];
- fis.read(buf);
- System.out.println(new String(buf));
- fis.close();
- }
- public static void readFile_2()throws IOException
- {
- FileInputStream fis = new FileInputStream("fos.txt");
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=fis.read(buf))!=-1)
- {
- System.out.println(new String(buf,0,len));
- }
- fis.close();
- }
- public static void readFile_1()throws IOException
- {
- FileInputStream fis = new FileInputStream("fos.txt");
- int ch = 0;
- while((ch=fis.read())!=-1)
- {
- System.out.println((char)ch);
- }
- fis.close();
- }
- public static void writeFile()throws IOException
- {
- FileOutputStream fos = new FileOutputStream("fos.txt");
- fos.write("abcde".getBytes());
- fos.close();
- }
- }
9,拷贝图片
- public class CopyPic {
- public static void main(String[] args){
- FileInputStream fis = null;
- FileOutputStream fos = null;
- try {
- fis = new FileInputStream("a.png");
- fos = new FileOutputStream("b.png");
- int len = 0;
- byte[] buff = new byte[1024];
- while(((len = fis.read(buff))!=-1)){
- fos.write(buff, 0, len);
- fos.flush();
- }
- } catch (Exception e) {
-
- throw new RuntimeException("复制图片失败");
- }finally{
- if(fis!=null){
- try {
- fis.close();
- } catch (IOException e) {
-
- e.printStackTrace();
- throw new RuntimeException("读取关闭失败");
- }
- }
- if(fos!=null){
- try {
- fos.close();
- } catch (IOException e) {
-
- e.printStackTrace();
- throw new RuntimeException("写入关闭失败");
- }
- }
- }
- }
- }
10,字节流的缓冲区
- import java.io.*;
- class CopyMp3
- {
- public static void main(String[] args) throws IOException
- {
- long start = System.currentTimeMillis();
- copy_2();
- long end = System.currentTimeMillis();
-
- System.out.println((end-start)+"毫秒");
- }
- public static void copy_2()throws IOException
- {
- MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("c:\\9.mp3"));
- BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\3.mp3"));
- int by = 0;
-
- while((by=bufis.myRead())!=-1)
- {
- bufos.write(by);
- }
- bufos.close();
- bufis.myClose();
- }
-
- public static void copy_1()throws IOException
- {
- BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));
- BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
-
- int by = 0;
-
- while((by=bufis.read())!=-1)
- {
- bufos.write(by);
- }
- bufos.close();
- bufis.close();
- }
- }
11,读取键盘录入
- import java.io.*;
- class ReadIn
- {
- public static void main(String[] args) throws IOException
- {
- InputStream in = System.in;
- 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.toUpperCase());
- sb.delete(0,sb.length());
- }
- else
- sb.append((char)ch);
- }
- }
- }
12,读取写入转换流
- 通过刚才的键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理。
- 也就是readLine方法。
- 能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
- readLine方法是字符流BufferedReader类中的方法。
- 而键盘录入的read方法是字节流InputStream的方法。
- 那么能不能将字节流转成字符流在使用字符流缓冲去的readLine方法呢?
- */
- import java.io.*;
- class TransStreamDemo
- {
- public static void main(String[] args) throws IOException
- {
-
-
-
-
-
-
-
- BufferedReader bufr =
- new BufferedReader(new InputStreamReader(System.in));
- BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
- String line = null;
- while((line=bufr.readLine())!=null)
- {
- if("over".equals(line))
- break;
- bufw.write(line.toUpperCase());
- bufw.newLine();
- bufw.flush();
- }
- bufr.close();
- }
- }
13,流操作规律
1,
源:键盘录入。
目的:控制台。
2,需求:想把键盘录入的数据存储到一个文件中。
源:键盘。
目的:文件。
3,需求:想要将一个文件的数据打印在控制台上。
源:文件。
目的:控制台。
流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
1,明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer。
2,操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。
1,将一个文本文件中数据存储到另一个文件中。复制文件。
源:因为是源,所以使用读取流。InputStream Reader
是不是操作文本文件。
是!这时就可以选择Reader
这样体系就明确了。
接下来明确要使用该体系中的哪个对象。
明确设备:硬盘。上一个文件。
Reader体系中可以操作文件的对象是 FileReader
是否需要提高效率:是!。加入Reader体系中缓冲区 BufferedReader.
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);
目的:OutputStream Writer
是否是纯文本。
是!Writer。
设备:硬盘,一个文件。
Writer体系中可以操作文件的对象FileWriter。
是否需要提高效率:是!。加入Writer体系中缓冲区 BufferedWriter
FileWriter fw = new FileWriter("b.txt");
BufferedWriter bufw = new BufferedWriter(fw);
练习:将一个图片文件中数据存储到另一个文件中。复制文件。要按照以上格式自己完成三个明确。
---------------------------------------
2,需求:将键盘录入的数据保存到一个文件中。
这个需求中有源和目的都存在。
那么分别分析
源:InputStream Reader
是不是纯文本?是!Reader
设备:键盘。对应的对象是System.in.
不是选择Reader吗?System.in对应的不是字节流吗?
为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。
所以既然明确了Reader,那么就将System.in转换成Reader。
用了Reader体系中转换流,InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率吗?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream Writer
是否是存文本?是!Writer。
设备:硬盘。一个文件。使用 FileWriter。
FileWriter fw = new FileWriter("c.txt");
需要提高效率吗?需要。
BufferedWriter bufw = new BufferedWriter(fw);
**************
扩展一下,想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中。
目的:OutputStream Writer
是否是存文本?是!Writer。
设备:硬盘。一个文件。使用 FileWriter。
但是FileWriter是使用的默认编码表。GBK.
但是存储时,需要加入指定编码表utf-8。而指定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter。
而该转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流。FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要高效吗?需要。
BufferedWriter bufw = new BufferedWriter(osw);
所以,记住。转换流什么使用。字符和字节之间的桥梁,通常,涉及到字符编码转换时,
需要用到转换流。
-
- class TransStreamDemo2
- {
- public static void main(String[] args) throws IOException
- {
- System.setIn(new FileInputStream("PersonDemo.java"));
-
- System.setOut(new PrintStream("zzz.txt"));
-
-
- BufferedReader bufr =
- new BufferedReader(new InputStreamReader(System.in));
- BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
- String line = null;
- while((line=bufr.readLine())!=null)
- {
- if("over".equals(line))
- break;
- bufw.write(line.toUpperCase());
- bufw.newLine();
- bufw.flush();
- }
- bufr.close();
- }
- }
14,改变标准输入输出设备
- class TransStreamDemo2
- {
- public static void main(String[] args) throws IOException
- {
- System.setIn(new FileInputStream("PersonDemo.java"));
-
- System.setOut(new PrintStream("zzz.txt"));
-
-
- BufferedReader bufr =
- new BufferedReader(new InputStreamReader(System.in));
-
- BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
- String line = null;
- while((line=bufr.readLine())!=null)
- {
- if("over".equals(line))
- break;
- bufw.write(line.toUpperCase());
- bufw.newLine();
- bufw.flush();
- }
- bufr.close();
-
- }
- }
15,异常的日志信息
- import java.io.*;
- import java.util.*;
- import java.text.*;
- class ExceptionInfo
- {
- public static void main(String[] args)throws IOException
- {
- try
- {
- int[] arr = new int[2];
- System.out.println(arr[3]);
- }
- catch (Exception e)
- {
- try
- {
- Date d = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String s = sdf.format(d);
- PrintStream ps = new PrintStream("exeception.log");
- ps.println(s);
- System.setOut(ps);
- }
- catch (IOException ex)
- {
- throw new RuntimeException("日志文件创建失败");
- }
- e.printStackTrace(System.out);
- }
- }
- }
16,获取系统信息
- import java.util.*;
- import java.io.*;
- class SystemInfo
- {
- public static void main(String[] args) throws IOException
- {
- Properties prop = System.getProperties();
-
-
- prop.list(new PrintStream("sysinfo.txt"));
- }
- }
黑马程序员——IO流
标签:
原文地址:http://www.cnblogs.com/lmjava/p/4742960.html