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

黑马程序员 -IO流(上)

2016-01-25 17:43 387 查看

IO 流 (上)

1 IO 流

用来处理设备之间的数据传输 。流只操作数据。

流按操作数据分为:字节流,字符流

流按流向分为:输入流,输出流

输入:将外设的数据读取到内存中。

输出:将内存的数写入到外设中。

流按操作数据又分为 字节流 和 字符流,字节流读取文字字节数据后 ,不直接操作而是先查看指定的编码表,获取相对性的文字,再对这个文字进行操作,简单说字节流+编码表。

字节流的抽象基类:InputStream,OutputStream.

字符流的抽象基类 : Reader , Writer.

1 明确操作中存在的数据源和数据的目的

存在数据源 : InputStream Reader

数据的目的 : OutputStream Writer

2 明确数据是否是纯文本数据

数据源 是纯本文:Reader

否:InputStream

数据目的 是纯文本 :Writer

否:OutputStream

3 明确具体的设备

数据源的设备:

硬盘:File

键盘: System.in

内存:数组

网络:Socket流

数据目的的设备:

硬盘:File

键盘: System.out

内存:数组

网络:Socket流

4 是否需要缓冲区

1 需要高效 加上 buffer

IO 流常用基类

字节流的抽象基类:InputStream ,OutputStream

字符流的抽象基类 : Reader,Writer

字符流:FileWriter、FileReader (缓冲区:BufferedWriter、BufferedReader)
字节流:FileOutputStream、FileInputStream


(缓冲区:BufferedOutputStream、BufferedInputStream)

由这四类派生出来的子类名称都是以其父类名作为子类名的后缀。

转换 流:

InputStreamReader : 字节 转字符

OutputStreamWriter : 字符 转字节

使用 :

转换流是字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。

2 字符流

2.1 Writer

子类必须实现的方法仅有 writer(char[] , int , int)、flush()、close(), 多数子类将重写方法,以提供更高的效率和其他功能。

直接已知子类 7 个: BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter,PipedWriter, PrintWriter, StringWriter


构造方法:

); //创建一个新的字符流 writer,其关键部分将同步 writer 自身。

protected Writer(Object lock);

//创建一个新的字符流 writer,其关键部分将同步给定的对象。

方法:

append(); 添加

void writer(); // 写入单个字符、字符数组、字符串、字符串的某一部分

需要子类去做不同实现的方法:

writer(char[] , int , int); //写入字符数组的某一部分

flush 刷新该流的缓冲

abstract void close(); //关闭此流,但要先刷新它

**

2.2 FileWriter

FileWriter: 用来写入字符文件的便捷类。继承 OutputStreamWriter 类。

不存在空参数构造函数。

步骤 :

1 创建文件。 文件。 创建一个 FileWriter 对象, 该对象一初始化就必须要明确被操作的文件。

而且该文件会被创建到指定的目录下。如果该目录下已有同名文件,已有文件将被覆

盖。明确数据要存放的目的地(文件) 。

一定要做异常处理或者抛异常。否则 报错 。 在 s windows 中 目录 分隔符 用\ \ \ 。

eg:FileWriter fw=new FileWriter(“demo.txt”);

2 调用 writer 方法,将字符串写入( 写入( 内存 )流中 流中。

eg:fw.writer(“abcfgggg”);

3 刷新 刷新流对象中的缓冲区数据 数据。将数据刷新到目的地(文件) 。

Note:在流关闭之前,流一直存在,可以反复写入数据,但每次写入后,都需要进行

此刷新操作。

eg:fw.flush();

4 关闭 流资源 (必须有的步骤) ) 。但关闭之前会刷新一次内部缓冲区中的数据,将数

据刷新到目的地(文件) 。

eg:fw.close();

flush 与 与 close 的 区别:

flush ,流一直存在,可以

close 刷新后会将流关闭,不能再继续写入数据。关闭资源需要单独做 try 处理。

构造函数:

FileWrite(String filename,boolean append)throws IOException{ }

//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对

象。

//如果 append 为 true,则将数据写入文件末尾处。

eg:

FileWriter fw = new FileWriter(“demo.txt”,true);

//传递一个 true 参数,代表不覆盖已有的文件。 并在已有文件的末尾处进行数据续写。若没有该文件,则创建。

2.3 缓冲区与 与 BufferedWriter

缓冲区的出现是为了提高流的操作效率,因此,在创建缓冲区前,必须要有流对象。
BufferedWriter: 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组、字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。

FileWriter w = new FileWriter("test.txt");
BufferedWriter bfw = new BufferedWriter(w);//加入缓冲区
bfw.write(“abc\r\nde”);//写数据
bfw.flush();//只要用到缓冲区,必须将写入的字符刷新,才能将字符写入目的地
bfw.close();//关闭流


2.4 Reader

Reader: 用于读取字符流的抽象类。子类必须实现的方法只有 read(char[] , int , int )和close()。

方法 :

read(); //读取的是单个字符

boolean ready(); //判断是否准备读取此流。

void reset(); //重置该流

long skip(long n); //跳过字符, 返回实际跳过的字符数; 若 n 为负 数, 发生异常 IllegalArgumentException

void mark(); //标记流中的当前位置

boolean markSupported(); //判断此流是否支持 mark()操作

`

2.5 FileReader ( 文本 文件的读取 )

FileReader: 用来读取字符文件的便捷类。此类构造方法假定默认字符编码和默认字节缓冲区大小适当。

方法:

close(); //关闭该流

int read(); //读取。

FileReader read=new FileReader(“demo.txt”);
``` int ch=0;
while((ch=fr.read()!=-1)){

System.out.println((char)ch);

}
fr.close();

//通过字符数组进行读取
FileReader read=new FileReader(“demo.txt”);
char[] buf=new char[1024];
int num=0;
//将读到的字符存入字符数组中
while((num=fr.read(buf))!=-1){

System.out.println(new String(buf,o,num));

}

fr.close();

<div class="se-preview-section-delimiter"></div>

2.5 BufferedReader( 缓冲区)
----------------------------
BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
readLine(); //读取一个文本行。
这个方法是利用了内容的缓冲区,将数据也就是二进制数据(一部分)首先从硬盘中提取到内存数组中,new  bufferedreader(new Reader).read() 这个方法从缓冲区中取出字符数据,这步为 readLine() 的实现提供了基础,之后我们再设置一个零时的数组,这个容器可以是StringBuilder.其实是使用了 上述的方法,把换行,回车符之前的数据,读取到这个容器中,然后再将这个容器的字符数据变成字符串返回。

<div class="se-preview-section-delimiter"></div>


FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);

FileWriter fw = new FileWriter("buf_copy.txt");
BufferedWriter bufw = new BufferedWriter(fw);

String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();//换行
bufw.flush();
}
bufw.close();
bufr.close();


“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序io-上