黑马程序员技术交流社区
标题:
学习笔记-IO输入与输出-字符流和字符流的缓冲区
[打印本页]
作者:
李云贵
时间:
2014-7-23 09:26
标题:
学习笔记-IO输入与输出-字符流和字符流的缓冲区
字符流
的由来:
字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。
简单说:字节流+编码表 。
字节流的两个顶层父类:
1,InputStream 2,OutputStream.
字符流的两个顶层父类:
1,Reader 2,Writer
这些体系的子类都以父类名作为后缀。 而且子类名的前缀就是该对象的功能。
FileReader
和
FileWriter
新建对象new
FileWriter()/
new
FileReader()
,读/写rend()/write(),关闭close()。
写文件新建对象带true参数支持续写。读文件文件不存在会报异常。
read()参数支持 (空),
字符流
读取,返回单字符int。
(
字符数组
),把文件内容一次读入到数组,返回成功读取的字符数,然后在文件结尾处返回-1
(字符数组,int offset,int length),可以控制写在数组哪里,最多读取多少个字符。
(
CharBuffer
),返回成功放入CharBuffer中的字符数
write()参数支持 (int),
字符流
写入。
(字符数组),
字符数组
写入
(字符数组,int offset,int length),可以控制数组哪里开始写入,最多读取多少个字符。
(String),
字符串
写入
(String,int offset,int length),可以控制数组哪里开始写入,最多读取多少个字符。
FileReader
(用的是字符流)
FileReader fr=new FileReader("c:\\test.txt"); //文件不存在抛出异常
IOException
int ch=0;
//
fr.read()会自动逐字符读取,返回一个字符。
while((ch=fr.read())!=-1){
System.out.println((char)ch);
}
fr.close();
会抛出IOException。必须检查。
要么直接在调用方法后throws
IOException,要么直接try-catch。
还可以
使用
read(char[]) 把字符全部读入数组,返回成功读取的字符数。到结尾处再返回-1。
char[] buf = new char[1024];
int len = 0;
while((len=fr.read(buf))!=-1){
System.out.println(new String(buf,0,len));//把字符数组后面的空格去了
}
输出 hello world
FileWriter
fw=new FileWriter("c:\\test.txt");//
创建一个FileWriter对象,可带
true参数。作用是续写文件(不覆盖)
fw.write("test hello world");//
将字符串写入到流中
fw.close();//
刷新流对象中的缓冲中的数据到目的地中,然后关闭流资源
也可手动调用
fw.flush();刷新流对象中的缓冲中的数据到目的地中。会抛出IOException。必须检查。要么直接在调用方法后throws IOException,要么直接try-catch。
public static void main(String[] args) throws IOException{
FileWriter fw=null; try{ fw=new FileWriter("c:\\test.txt"); fw.write("test hello world"); }catch(IOException io){ io.printStackTrace(); }finally{ if(fw!=null){ try{ fw.close(); }catch(IOException io){ throw new RuntimeException("关闭失败"); } } } }
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。BufferedWriter: write(); newLine(); BufferedReader: readLine();BufferedReader步骤1.创建一个字符写入流对象FileReader fr=new FileReader ("a.txt");2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数BufferedReader bufr=new BufferedReader (fr);3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾String line=null;while((line=bufr.readLine())!=null){String s=line;}4.关闭bufr.close();readLine()方法的原理:无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。BUfferedWriter步骤:1.创建一个字符写入流对象FileWriter fw=new FileWriter("a.txt");2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数bufferedWriter bufw=new BufferedWriter(fw);buff.write("asdasdas");bufw.newLine();//换行符,跨平台的3.将缓冲区刷新bufw.flush;4.关闭缓冲区,就是在关闭缓冲区中的流对象bufw.close();自己实现readLine()方法 public String myReadLine() throws IOException{ StringBuilder sb = new StringBuilder(); int ch = 0; while((ch = myRead())!=-1){ if(ch=='\r') continue; if(ch=='\n') return sb.toString(); //将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中。 sb.append((char)ch); } if(sb.length()!=0) return sb.toString(); return null; }
作者:
曾翀
时间:
2014-7-23 09:43
学习了。。。哈哈
作者:
梦里听传说
时间:
2014-8-31 23:24
学习了,顶
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2