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();
“`