字符流的由来:
字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。
简单说:字节流+编码表 。
字节流的两个顶层父类: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"); //文件不存在抛出异常IOExceptionint 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; }
|
|