黑马程序员—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);
for( int 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] while( true)[/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]
相关文章推荐
- 黑马程序员:Java编程_IO流
- 黑马程序员——IO流(3)
- 黑马程序员 IO流
- 黑马程序员--IO流笔记(二)
- 黑马程序员之——Java基础 IO流——第二部分
- 黑马程序员:IO流之转换流
- 黑马程序员_IO流(上)
- 黑马程序员_IO流4_(对象的序列化,管道流,RandomAccessFile,DataStream,ByteArrayStream)
- 黑马程序员——第十三篇:字符缓冲流、IO流练习、其他流对象
- 黑马程序员-----IO流
- 黑马程序员--IO流(19天)
- 黑马程序员——IO流
- 黑马程序员--IO流File类总结--java
- 黑马程序员————Java基础之IO流
- 黑马程序员----IO流
- 黑马程序员——JAVA基础之IO流FileReader,FileWriter
- 黑马程序员--IO流
- 黑马程序员——java复习总结——其他类和IO流
- 黑马程序员:IO流
- 黑马程序员——Java基础---IO流