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

黑马程序员 IO流(一)

2015-08-28 16:20 661 查看
------- android培训java培训、期待与您交流! ----------

IO流

IO流是JAVA中用于进行读写操作的基础,其读写的对象可以是内存,可以是硬盘,可以是外围输出对象。IO流是程序与文件交互的桥梁。

1.流的分类

按照流的流向分类,可以将流分为输入流和输出流。

输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能从中读取数据。

输入输出的方向,以运行的程序为主体。流向程序的流是输入流,从程序流出的流是输出流。

按照流的操作单位数为字符流和字节流。

字节流:操作的基本单位是字节,一般用于操作文件,不需要了解内容时使用。
字符流:操作的基本单位是字符,一般用于操作本文,或者需要了解流中的内容时使用。

流的分类可以得到四个流的基类

字节流
字符流
输入流 InputStream
Reader
输出流 OutputStream
Writer

除了这些基本的数据操作的输入输出流之外,IO包内还包含了很多用于简便操作或是提高效率的流。比如BufferedInputStream和BufferedOutputStream等,这些装饰类都是在原有的流对象上提供了更强大的方法或提高了运行效率。

流转换与流合并

IO包中还提供了流转换和流合并的功能,InputStreamReader可以将读取字节流转换成字符流,能。OutputStreamWriter可以将写入字节流转换成字符流。在流转换的过程中可以指定指定的编码表以实现编码转换的功能。流合并SequenceInputStream在构造函数中传入一个含有输入流的枚举对象,在使用该流的读取功能时会自动从第一个输入流读取完毕后切换到另一个读取流。注意:没有输出合并流,因为不需要。

2.输入流:

我们知道输入流体系中的基类是InputStream和Reader。在学习一个流的使用方法时先学习其基类的方法。

InputStream中有三个常用方法:

int read() :从输入流中读取单个字节,返回读取的字节数据(字节数据直接转换成int)。
int read(byte[] b) :从输入流中读取b.length个字节的数据,并将其储存在字节数组b中,返回实际读取的字节数。
int read(byte[] b,int off, int len) :从输入流中最多读取len个字节的数据,并将其储存到数组b中。放入数组b中时,不是从数组起点开始,而是从off位置开始,返回读取的字节数。

Reader中常用的三个方法:

int read() :从输入流中读取单个字符,返回读取的字符数据(字符数据直接转换为int)
int read(char[] cbuf) :从输入流中读取cbuf.length个字符数据,并将其储存到字符数组cbuf中,返回实际读取的字符数。
int read(char[] b,int off, int len) :从输入流中最多读取len个字符的数据,并将其储存到数组b中。放入数组b中时,不是从数组起点开始,而是从off位置开始,返回读取字符数。

InputStream和Reader下有一个常用的可以实例化的子类FileInputStream,FileReader:它们通常用来操作硬盘文件上的数据。

下面是一个FileInputStream,FileReader操作的实例

<pre name="code" class="java">public abstract class Reader_InputStream {

public static void main(String args [])throws IOException{
FileReader fr = new FileReader("F:\\test.txt");
char[] buf = new char[1024];
int len = 0 ;
while((len=fr.read(buf))!=-1)//当文件读到末尾时停止读取和打印
{
System.out.println(new String(buf,0,len));
}
fr.close();//使用流一定要记得关闭流
}
}




当输入的对象不是来自于文件而是来自于键盘呢,这个时候就需要用到System下的System.in方法,这个方法返回的是一个InputStream对象,也就是字节输入流,通常这个流默认指向的是键盘输入。

3.输出流

输出流的基类是OutputStream和Writer,他们有几个常用的方法:

write() :从输出流中写入单个字节,返回写入的字节数据(字节数据直接转换成int);
write(byte[] b) :从输出流中写入b.length个字节的数据。
write(byte[] b,int off, int len) :从输出流中最多写入len个字节的数据,这些数据从b的off开始,写入长度为len。
flush():刷新流,输出流被写入数据后只有被刷新才会存到指定文件中。在关闭流的动作前一般都有一个刷新动作。

输出流下面有两个可实例化的子类:FileOutputStream和FileWriter:该输出流一般的流向也是硬盘文件。

下面是一个FileOutputStream和FileWriter的操作实例:

public abstract class Writer_OutputStream {

public static void main(String args [])throws IOException{
FileWriter fw = new FileWriter("F:\\test.txt");
char[] buf = "this a file".getBytes();
fw.write(buf);
fw.close();//使用流一定要记得关闭流
}
}


当输出对象不是到硬盘文件而是到控制台呢?可以使用System.out方法,这个方法返回的是一个PrintStream对象,PrintStream可以用于字节输出也能用于字符输出。在System.out中,默认指向控制台。

4.包装流

在IO系统中给各类输入输出流提供了流的包装,在不损失原来的功能基础上增强了原有功能,或

者实现了效率的提高。常用包装流有:

BufferedInputStream,BufferedOutputStream 字节流

BufferedReader,BufferedWriter 字符流

其中BufferedReader,BufferedWriter提供了很多比较方便的方法;

String readLine();读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。
public void newLine()写入一个行分隔符。行分隔符字符串由系统属性定义,在不同的操作系统中不一样。

下面是一个包装类的使用实例:

import java.io.*;

/**
* 需求:从键盘字符,并将其保存在F盘下,命名为ioprt01.txt
* 		输入多行字符,以OVER结束
*
*/
public class IOprt01 {

public static void main(String[] args) throws IOException
{
BufferedInputStream bfis = new BufferedInputStream (System.in);
BufferedWriter bfw = new BufferedWriter(new FileWriter("F:\

\test.txt"));

InputStreamReader isr = new InputStreamReader(bfis);
int i;
//输入一行字符并保存

String str="";
while(true)
{
i=bfis.read();

if(i=='\n')//确定结束条件
{
if("over\r".equals(str))
break;
str=str+"\r\n";
bfw.write(str);
bfw.flush();//每读取一行写入一次
str="";
}
else
str=str+(char)i;
}
isr.close();
bfw.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: