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

黑马程序员—IO流

2013-01-30 14:38 281 查看
                                                     
-------android培训java培训、期待与您交流! ----------

一、字符流
1.Writer
(1).输出流对象
(2).示例:
[align=left]//创建一个FileWriter对象。该对象一被初始化就要明确被操作的文件,该文件会被创建到指定目录下,如果该目录已有同名文件,原文件将会被覆盖。[/align]
FileWriter fw = new FileWriter( "d:\\demo.txt"); 
       
[align=left]fw.write( "sfsweww");   //调用该方法将字符串写入到流中[/align]
[align=left]fw.flush();   //刷新流对象中缓冲区的数据,将数据刷到目的地中         [/align]
[align=left]fw.close();    //关闭之前会执行一次刷新[/align]
[align=left]
[/align]
[align=left]注:每一条语句都会抛出IOException异常,所以必须处理异常。[/align]
[align=left]
[/align]
[align=left]2.Reader[/align]
[align=left](1).输入流对象[/align]
[align=left](2).打印方式:[/align]
[align=left]第一种:[/align]

[align=left]//创建一个文件读取流对象,和指定的名称的文件相关联。要保证该文件是已经存在的。[/align]
FileReader fr = new FileReader( "d:\\demo.txt"); 
        
[align=left]//调用读取流对象read()方法,一次读取一个字符,而且会自动往下读。[/align]
[align=left]int c = 0;[/align]
[align=left]while((c=fr.read()) != -1){[/align]
[align=left]   System. out.print(( char)c);[/align]
[align=left]} [/align]
[align=left]fr.close();[/align]
[align=left]
[/align]
[align=left]第二种:通过字符数组进行读取(此方法较好)[/align]

char[] chs = new char[1024];    //用于存储读取到的字符 
     
[align=left]int num = 0;[/align]
[align=left]while((num=fr.read(chs)) != -1){  //read(char[])返回的是读到字符个数[/align]
[align=left]    System. out.println( new String(chs,0,num));[/align]
[align=left]}[/align]

[align=left]
[/align]
[align=left]二、字符流的缓冲区[/align]
[align=left](1).缓冲区的出现是为了提高流的工作效率而出现的。[/align]
[align=left](2).缓冲区中提供了newLine()这个跨平台的换行方法。[/align]
[align=left]
[/align]
[align=left]输出数据:[/align]

FileWriter fw = new FileWriter( "d:\\demo.txt"); 
     
BufferedWriter bw = new BufferedWriter(fw); 
    
forint i=0;
i<5; i++)
[align=left]{[/align]
[align=left]    bw.write( "adcd");[/align]
[align=left]    bw.newLine();    //表示分隔符,是跨平台的[/align]
[align=left]    bw.flush();      //只要用到缓冲区就要刷新[/align]
[align=left]}         [/align]
[align=left]bw.close();   //其实关闭缓冲区,就是在关闭缓冲区中的流对象[/align]

[align=left]
[/align]
[align=left]输入数据:[/align]

[align=left]FileReader fr = new FileReader("d:\\demo.txt");[/align]
BufferedReader br = new BufferedReader(fr); 
      
[align=left]String buff = null;[/align]
[align=left]while((buff = br.readLine()) != null)[/align]
[align=left]{[/align]
[align=left]     System. out.println(buff);[/align]
[align=left]}           [/align]
[align=left]br.close();[/align]

[align=left]
[/align]
[align=left](3).readLine()方法原理:无论是读一行或者是读多个字符,其实最终都是在硬盘上一个一个读取。所以最终还是调用read方法,只不过它把read方法读出来的单个字符先存入一个数组中,遇到换行符的时候,再变成字符串输出。[/align]
[align=left]
[/align]
[align=left]三、字节流[/align]
[align=left]OutputStream、InputStream[/align]
[align=left](1).用FileOutputStream输出数据时,不需要刷新操作,但要关闭。[/align]
[align=left](2).输入和输出方法的用法和Reader的相同。[/align]
[align=left]
[/align]
[align=left]四、键盘录入[/align]
[align=left]读取转换流(InputStreamReader)[/align]
[align=left](1).没有用到包装流对象[/align]

[align=left]                 InputStream in = System. in;[/align]
[align=left]           StringBuilder sb = new StringBuilder();[/align]
[align=left]            whiletrue)[/align]
[align=left]           {[/align]
[align=left]                 int c = in.read();[/align]
                 if(( char)c
== '\r')
[align=left]                      continue;[/align]
                 if(( char)c
== '\n')
[align=left]                {[/align]
[align=left]                      if(sb.toString().equals( "over"))[/align]
[align=left]                            break;[/align]
[align=left]                     System. out.println(sb.toString().toUpperCase());[/align]
[align=left]                     sb.delete(0, sb.length());[/align]
[align=left]                }[/align]
[align=left]                 else[/align]
[align=left]                     sb.append(( char)c);[/align]
[align=left]           }[/align]

[align=left]
[/align]
[align=left](2).用到包装流对象的处理方法(一般用这个)[/align]

                 InputStream in = System. in;

[align=left]                 InputStreamReader isr = new InputStreamReader(in);[/align]
[align=left]           BufferedReader br = new BufferedReader(isr);[/align]
[align=left]           String str = null;[/align]
[align=left]            while((str=br.readLine()) != null)[/align]
[align=left]           {[/align]
[align=left]                 if(str.equals( "over"))[/align]
[align=left]                      break;[/align]
[align=left]                System. out. println(str.toUpperCase());[/align]
[align=left]           }[/align]
[align=left]           br.close();[/align]

[align=left]
[/align]
[align=left]写入转换流(OutputStreamWriter)[/align]

[align=left]           BufferedReader br = new BufferedReader( new InputStreamReader(System.in));[/align]
[align=left]           OutputStream os = System. out;[/align]
[align=left]           OutputStreamWriter osw = new OutputStreamWriter(os);[/align]
[align=left]           BufferedWriter bw = new BufferedWriter(osw);[/align]
[align=left]           String str = null;[/align]
[align=left]            while((str=br.readLine()) != null)[/align]
[align=left]           {[/align]
[align=left]                bw.write(str);[/align]
[align=left]                bw.newLine();[/align]
[align=left]                bw.flush();[/align]
[align=left]           }[/align]
[align=left]           bw.close();[/align]

[align=left]
[/align]
[align=left]什么时候使用转换流?[/align]
[align=left]它是字符和字节之间的桥梁。通常,涉及到字符编码转换时,需要用到转换流。FileReader是InputStreamReader的直接子类,它限定了字符编码为GBK。所以如果要改变字符编码的话,要用其父类 —— InputStreamReader。同理可得FileWriter和OutputStreamWriter的关系。[/align]
[align=left]
[/align]
[align=left]总结:[/align]
[align=left]流操作的基本规律?[/align]
[align=left](1).明确源和目的[/align]
[align=left]源:输入流。InputStream、Reader[/align]
[align=left]目的:输出流。OutputStream、Writer[/align]
[align=left]
[/align]
[align=left](2).操作的数据是否是纯文本[/align]
[align=left]     是:字符流[/align]
[align=left]     不是:字节流[/align]
[align=left]
[/align]
[align=left](3).当体系明确后,再明确要使用哪个具体的对象。[/align]
[align=left]通过设备来具体区分。[/align]
[align=left]     源设备:内存(ByteArrayInput...)、硬盘(FileInput...)、键盘(System.in)[/align]
[align=left]     目的设备:内存(ByteArrayOutput...)、硬盘(FileOutput...)、控制台(System.out)[/align]
[align=left]
[/align]

五、打印流
1.该流提供了打印方法,可以将各种数据类型的数据都原样打印。

2.字节打印流(PrintStream)
构造函数可以接收的类型:
a.file对象
b.字符串路径
c.字节输出流

3.字符打印流(PrintWriter)
构造函数可以接收的类型:
a.file对象
b.字符串路径
c.字节输出流
d.字符输出流

六、管道流(Piped+字符\节流)
1.用于多线程之间的流的操作。
2.管道输入流应该连接到管道输出流。

七、SequenceInputStream
1.没有对应的SequenceOutputStream字节流。
2.此流的作用是用来连接多个流对象,使其组合成一个流对象。
3.构造函数中,可以传Enumeration对象;也可以传InputStream对象,或其子对象;但是第二种方法只能连接两个文件,第一种可以连接多个。(创建Enumeration对象,可以通过Vector来创建,也可以通过匿名内部类来实现Enumeration的接口来实现。)
[align=left]
[/align]
[align=left]八、RandomAccessFile(随机读写)[/align]
[align=left]1.概念[/align]
[align=left](1).该类不是IO体系中的子类,而是直接继承自Object。[/align]
[align=left](2).它是IO包中的子类,因为它具备读和写的功能。内部封装了一个数组,而且可以通过指针对数组元素进行操作。[/align]
[align=left](3).可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。[/align]
[align=left](4).完成读写的原理是内部封装了字节输入流和字节输出流。[/align]
[align=left](5).通过构造方法可知,该类只能操作字节流。而且操作文件还有模式:r、rw[/align]
[align=left](6).如果模式为只读 r ,不会创建文件。会去读取一个已存在的文件,如果该文件不存在,则会出现异常。[/align]
[align=left]如果模式为 rw ,操作的文件不存在,会自动创建;如果存在,则不会覆盖。[/align]
[align=left][/align]
[align=left]九、DataInputStream、DataOutputStream[/align]
[align=left]1.可以用于操作基本数据类型的数据的流对象。[/align]
[align=left]2.如果使用方法writeUTF(String str)写入的数据,那么如果要读出来时,必须要用对应的读的方法才可以,也就是用readUTF()方法。用其他方法读取失败。[/align]
[align=left]
[/align]
[align=left]十、操作字节数组的流(ByteArray+InputStream\OutputStream)[/align]
[align=left]1.ByteArrayInputStream:在构造的时候需要接收数据源,而且数据源是一个字节数组。[/align]
[align=left]2.ByteArrayOutputStream:在构造的时候不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组,这就是数据目的。[/align]
[align=left]3.因为这两个流对象都操作的是数组,并没有使用系统资源。所以不用进行close关闭操作。[/align]
[align=left]4.用流的思想来操作数组。[/align]
[align=left]5.它们的源是内存。[/align]
[align=left]
[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: