您的位置:首页 > 职场人生

黑马程序员——IO流

2014-12-31 16:04 302 查看
   
  -----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 

一,概述

IO流:即InputOutput的缩写

特点:

        1)IO流用来处理设备间的数据传输。

        2)Java对数据的操作是通过流的方式。

        3)Java用于操作流的对象都在IO包中。

        4)流按操作数据分为两种:字节流和字符流。

        5)流按流向分为:输入流和输出流。

注意:流只能操作数据,而不能操作文件。

常用基类:

        1)字节流的抽象基流:InputStream和OutputStream

        2)字符流的抽象基流:Reader和Writer


二,字符流

1,字符流只用于处理文字数据,而字节流可以处理媒体数据

专门用于操作文件的Writer子类对象:FileWriter。后缀是父类名。前缀名是流对象的功能。该流对象一被初始化,就必须有被操作的文件存在。

2,字符流的读写

写入流步骤

        a、创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件。且该目录下如果已有同名文件,则同名文件将被覆盖。其实该步就是在明确数据要存放的目的地。

        b、调用write(String s)方法,将字符串写入到流中。

        c、调用flush()方法,刷新该流的缓冲,将数据刷新到目的地中。

        d、调用close()方法,关闭流资源。但是关闭前会刷新一次内部的缓冲数据,并将数据刷新到目的地中。

close()和flush()区别:

        flush()刷新后,流可以继续使用;

       而close()刷新后,将会关闭流,不可再写入字符流。

读取流步骤

        1)创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件已经存在,若不存在,将会发生异常FileNotFoundException。

        2)调用读取流对象的read()方法。read():一次读一个字符,且会继续往下读。

              第一种方式:读取单个字符。第二种方式:通过字符数组进行读取。

        3)读取后要调用close方法将流资源关闭。


三,字符缓冲区

字符流的缓冲区——BufferedReader和BufferedWriter

1,缓冲区的出现:提高了流的读写效率,所以在缓冲区创建前,要先创建流对象。即先将流对象初始化到构造函数中。 

2,缓冲技术原理:此对象中封装了数组,将数据存入,再一次性取出。

3,写入流缓冲区BufferedWriter的步骤:

        1)创建一个字符写入流对象。

         2)为了提高字符写入流效率。加入缓冲技术。只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。

         3)调用write方法写入数据到指定文件

      只要用到缓冲区,就要记得刷新。(关闭流同样会刷新,但为了排除意外事故,保证数据存在,建议写入一次就刷新一次)

         4)其实关闭缓冲区,就是在关闭缓冲区中的流对象。

小知识:BufferedWriter缓冲区中提供了一个跨平台的换行符:newLine();可以在不同操作系统上调用,用作数据换行。

4,读取流缓冲区BufferedReader

        该缓冲区提供了一个一次读一行的方法readLine,方便于堆文本数据的获取,当返回null时表示读到文件末尾。readLine方法返回的时候,只返回回车符之前的数据内容。并不返回回车符。

readLine方法原理:

        无论是读一行。或者读取多个字符。其实最终都是在在硬盘上一个一个读取。所以最终使用的还是read方法一次读一个的方法。

步骤:

        1)创建一个读取流对象和文件相关联

        2)为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲区对象的构造函数。

        3)调用该缓冲区提供的readLine方法一行一行读取,如果到达文件末尾,则返回null

        4)关闭流资源

示例:

public static void demo()throws IOException
{
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:\\javatext\\javademo.txt")));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

String str=null;
while(true){
str=br.readLine();//写入一行
if(str.equals("over"))
{
break;
}

System.out.println(str);
bw.write(str);//写入
bw.newLine();//换行
bw.flush();//刷新

}

br.close();//关闭流资源
bw.close();

}


5,LineNumberReader

        在BufferedReader中有个直接的子类LineNumberReader,其中有特有的方法获取和设置行号:

         setLineNumber();//设置初始行号

         getLineNumber();//获取行号

四,装饰设计模式

简述

        当想对已有对象进行功能增强时,可定义类:将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的该类称之为装饰类。

特点

        装饰类通常都会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

装饰和继承的区别:

        1)装饰模式比继承要灵活。避免了继承体系的臃肿,且降低了类与类之间的关系。

        2)装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以装饰类和被装饰的类通常都是属于一个体系。

        3)从继承结构转为组合结构。

注:在定义类的时候,不要以继承为主;可通过装饰设计模式进行增强类功能。灵活性较强,当装饰类中的功能不适合,可再使用被装饰类的功能。

五,字节流

概述

1,字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。

2,由于媒体文件数据中都是以字节存储的,所以,字节流对象可直接对媒体文件的数据写入到文件中,而可以不用再进行刷流动作。

3,读写字节流:InputStream   输入流(读)

                          OutputStream  输出流(写)

4,InputStream特有方法:

        int available();//返回文件中的字节个数

示例:复制mp3文件

import java.io.*;
public class copymp3 {

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
FileInputStream fin=null;
FileOutputStream fos=null;
try{
fin=new FileInputStream("E:\\KuGou\\木村弓 - いつも何度でも.mp3");
fos=new FileOutputStream("E:\\javatext\\何度复件.mp3");
byte[] by=new byte[1024];
int len=0;
while((len=fin.read(by))!=-1)
{
fos.write(by,0,len);
}

}
catch(Exception e){
throw new Exception("文件复制失败");
}
finally{

}
}

}

六,字节流缓冲区

读写特点:

        read():会将字节byte型值提升为int型值

        write():会将int型强转为byte型,即保留二进制数的最后八位。

原理:将数据拷贝一部分,读取一部分,循环,直到数据全部读取完毕。

        1)先从数据中抓取固定数组长度的字节,存入定义的数组中,再通过然后再通过read()方法读取数组中的元素,存入缓冲区。

        2)循环这个动作,直到最后取出一组数据存入数组,可能数组并未填满,同样也取出包含的元素。

        3)每次取出的时候,都有一个指针在移动,取到数组结尾就自动回到数组头部,这样指针在自增。

        4)取出的时候,数组中的元素在减少,取出一个,就减少一个,直到减到0即元素取完。

        5)当文件中的全部数据都被读取出时,read()方法就返回-1。

七,流操作规律

标准输入输出流

        System.in:对应的标准输入设备,键盘。

        Ssytem.out:对应的是标准的输出设备,控制台。

        System.in的类型是InputStream.

        System.out的类型是PrintStream是OutputStream的子类FilterOutputStream的子类。

转换流

转换流的由来:

       a、字符流与字节流之间的桥梁

       b、方便了字符流与字节流之间的操作

转换流的应用:

      字节流中的数据都是字符时,转成字符流操作更高效。

InputStreamReader将字节流通向字符流

       a、获取键盘录入对象。

              InputStream in=System.in;

       b、将字节流对象转成字符流对象,使用转换流。

              InputStreamReaderisr=new InputStreamReader(in);

       c、为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

              BufferedReaderbr=new BufferedReader(isr);

       

        BufferedReaderin=new BufferedReader(new InputStreamReader(System.in));
//键盘录入最常见写法

OutputStreamWriter字符流通向字节流

       字符通向字节:录入的是字符,存到硬盘上的是字节。步骤和InputStreamReader转换流一样。

import java.io.*;
class StreamDemo
{
public static void main(String[] args)throws IOException
{

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));//将字节流对象转成字符流对象,使用转换流。

//字符流通向字节流
BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(System.out));

String s=null;
while((s=in.readLine())!=null)
{
if("over".equals(s))
break;
bw.write(s.toUpperCase());//写入数据
bw.newLine();//换行
bw.flush();//刷新

}
bw.close();//关闭流资源
in.close();
}
}

流操作规律

1, 明确源和目的。

        源:输入流。InputStream  Reader

        目的:输出流。OutputStream  Writer

2,操作的数据是否是纯文本。

        是:字符流

        否:字节流

3,当体系明确后,再明确要使用哪个具体的对象。通过设备来进行区分:

        源设备:内存,硬盘,键盘

        目的设备:内存,硬盘,控制台

  转换流什么使用?

       字符和字节之间的桥梁。通常,涉及到字符编码转换时,需要用到转换流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: