黑马程序员 -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();
“`
相关文章推荐
- 失败的面试经历
- 面试笔试杂项积累-leetcode 1-5
- 程序员网址大全
- 一个游戏程序员的学习资料
- 一个游戏程序员的学习资料
- Android面试——Activity的四种启动模式
- 写代码如坐禅:你是哪一类程序员
- 程序员的工作环境与效率
- 程序员的工作环境与效率
- 写代码如坐禅:你是哪一类程序员
- 《Clean Coder》读后感:程序员自我管理的9个原则
- 关于程序员成长的一点思考
- 为什么程序员的工作效率跟他们的工资不成比例
- 《Clean Coder》读后感:程序员自我管理的9个原则
- 为什么程序员的工作效率跟他们的工资不成比例
- 关于程序员成长的一点思考
- 【转】每个程序员都必须遵守的编程原则
- 【转】每个程序员都必须遵守的编程原则
- 【转】是什么成就了一名“高级”程序员?
- 【转】是什么造就了伟大的程序员?