黑马程序员-JAVA基础之IO流(2)

来源:互联网 发布:淘宝网费列罗巧克力 编辑:程序博客网 时间:2024/06/18 18:54

————– android培训、java培训、java学习型技术博客、期待与您交流! ———–
字符流的缓冲区
字符流和字节流都有缓冲区,缓冲区的出现提高了对数据的读写效率
字符流的缓冲区对应类:
BUfferWriter
BufferedReader
特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。

BUfferWriter步骤:
1.创建一个字符写入流对象
FileWriter fw=new FileWriter(“a.txt”);
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
bufferedWriter bufw=new BufferedWriter(fw);
buff.write(“asdasdas”);
bufw.newLine();//换行符,跨平台的
3.将缓冲区刷新
bufw.flush;
4.关闭缓冲区,就是在关闭缓冲区中的流对象
bufw.close();

BufferedReader步骤
1.创建一个字符写入流对象
FileReader fr=new FileReader (“a.txt”);
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
BufferedReader bufr=new BufferedReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=bufr.readLine())!=null)
{
String s=line;}
4.关闭
bufr.close();

readLine()方法的原理:
无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。

字节流的缓冲区跟字符流类似
下面通过一段程序来演示一下

/*演示mp3的复制。通过缓冲区。BufferedOutputStreamBufferedInputStream*/import java.io.*;class  CopyMp3{    public static void main(String[] args) throws IOException    {        long start = System.currentTimeMillis();        copy_1();        long end = System.currentTimeMillis();        System.out.println((end-start)+"毫秒");    }    //通过字节流的缓冲区完成复制。    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();    }}

转换流
读取键盘录入

读取键盘录入时,需要每次读取一行,readLine方法是字符流BufferedReader类中的方法方法,而键盘录入的read方法是字节流InputStream的方法,此时就需要转换流:

InputStreamReader
如果不定义结束标记,键盘录入就结束不了。
将键盘录入的数据打印在控制台并转换为大写,将over作为结束标记:

//获取键盘录入对象。       //InputStream in = System.in;     //将字节流对象转成字符流对象,使用转换流。InputStreamReader      //InputStreamReader isr = new InputStreamReader(in);      //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader       //BufferedReader bufr = new BufferedReader(isr);     //键盘的最常见写法。     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();

流对象操作规律

通过键盘录入的例子分析出流操作的大致规律:

1,需求:将键盘录入打印在控制台上
源:键盘录入。
目的:控制台。

2,需求:想把键盘录入的数据存储到一个文件中。
源:键盘。
目的:文件。

3,需求:想要将一个文件的数据打印在控制台上。
源:文件。
目的:控制台。

因为流对象很多,为了便于选取合适的流对象进行操作,分析出流操作的基本规律:

通过三个明确来完成。

1,明确源和目的。
源:输入流。InputStream? Reader
目的:输出流。OutputStream? Writer。
2,操作的数据是否是纯文本。
是:字符流。
不是:字节流。

3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。

改变标准输入输出设备

System.setIn(new FileInputStream(“D:\1.txt”));//改变标准输出设备,读取

System.setOut(new FileOutputStream(“D:\2.txt”));//改变标准输入设备,写入

如果把标准输入输出设备都改成文件,就相当于复制文件。
改变输出设备还有一个应用,就是记录系统信息,Properties与流相结合。

Properties p = System.getProperties();

打印系统信息可以通过遍历p.keySet()集合来获取,也可以通过p.list(PrintStream p)方法改变输入设备,将系统信息写入日志文件存入硬盘中。

Properties:

Properties是HashTable的子类,具有Map集合的特点,存储的是键值对。是集合中和IO相结合的容器。

Properties对象可以用作存储键值对形式的配置文件。

Properties prop = new Properties();

设置和获取元素:prop.setProperty(“abc”,”10”);prop.getProperty(“abc”);

打印流:

打印流能将各种类型的数据原样打印。
PrintWriter,将键盘录入数据转换为大写打印在控制台上

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));   PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);   String line = null;   while((line=bufr.readLine())!=null)   {     if("over".equals(line))         break;        out.println(line.toUpperCase());        //out.flush(); }   out.close(); bufr.close();

合并流

SequenceInputStream:可以将多个流对象合并成一个流对象。

将1.txt、2.txt、3.txt这三个文件中的内容复制到4.txt这一个文件中:

Vector<FileInputStream> v = new Vector<FileInputStream>();    v.add(new FileInputStream("c:\\1.txt"));     v.add(new FileInputStream("c:\\2.txt"));     v.add(new FileInputStream("c:\\3.txt"));   Enumeration<FileInputStream> en =   v.elements();//SequenceInputStream接受的枚举对象,集合中只有Vector有这个方法获取枚举对象     SequenceInputStream sis = new SequenceInputStream(en);//将枚举对象作为参数传递给SequenceInputStream    FileOutputStream fos = new FileOutputStream("c:\\4.txt");    byte[] buf = new byte[1024];    int len =0;   while((len=sis.read(buf))!=-1)   {     fos.write(buf,0,len);    }    fos.close();    sis.close();

————– android培训、java培训、java学习型技术博客、期待与您交流! ———–

0 0
原创粉丝点击