黑马程序员_十四 【IO流认识】【字符流】

 

--------------------- android培训java培训、java学习型技术博客、期待与您交流! -------------------

 

 1  IO流认识 

概述:

1IO流:即Input Output的缩写。

2、特点:

1IO流用来处理设备间的数据传输。

2Java对数据的操作是通过流的方式。

3Java用于操作流的对象都在IO包中。

4)流按操作数据分为两种:字节流和字符流。

5)流按流向分为:输入流和输出流。

注意:流只能操作数据,而不能操作文件。

3IO流的常用基类:

1)字节流的抽象基流:InputStreamOutputStream

2)字符流的抽象基流:ReaderWriter

注:此四个类派生出来的子类名称都是以父类名作为子类名的后缀,以前缀为其功能;如InputStream子类FileInputStreamReader子类FileReader

如下图是IO体系:


 2  字符流 

简述:

1、字符流中的对象融合了编码表。使用的是默认的编码,即当前系统的编码。

2、字符流Writer,Reader只是用于处理文字数据,而字节流InputStreamOutputStream可以处理媒体数据,像图片,音频和视频等。

3、既然IO流是用于操作数据的,那么数据的最常见体现形式是文件。专门用于操作文件的Writer子类对象:FileWriter   --->  后缀名为父类名,前缀名为流对象的功能。

字符流的读写

1、写入字符流:

1)创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件。且该目录下如果已有同名文件,则同名文件将被覆盖。其实该步就是在明确数据要存放的目的地。

2)调用write(String s)方法,将字符串写入到流中。

3)调用flush()方法,刷新该流的缓冲,将数据刷新到目的地中。

4)调用close()方法,是关闭流资源。但是关闭前会刷新一次内部的缓冲数据,并将数据刷新到目的地中。

特别要注意几点:

close()flush()区别:flush()刷新后,流可以继续使用;而close()刷新后,将会关闭流,不可再写入字符流。

其实java自身不能写入数据,而是调用系统内部方式完成数据的书写,使用系统资源后,一定要关闭资源。

数据的续写是通过构造函数 FileWriter(String s,boolean append),根据给定文件名及指示是否附加写入数据的boolean值来构造FileWriter对象。

2、读取字符流:

1)创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件已经存在,若不存在,将会发生异常FileNotFoundException

2)调用读取流对象的read()方法。read():一次读一个字符,且会继续往下读。

      第一种方式:读取单个字符。第二种方式:通过字符数组进行读取。

3)读取后要将流资源关闭。

举例说明一下:

[java] view plaincopy

/* 

那么先以操作文件为主来演示 

 

需求:在硬盘上,创建一个文件,并写入文字数据。 

 

找到一个专门用于操作文件的Writer子类对象。FileWriter  后缀名是父类名,前缀名是该流对象的功能 

*/  

import java.io.*;  

class FileWriteDemo  

10 {  

11    public static void main(String []args) throws IOException  

12    {  

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

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

15      //其实该步就是在明确数据要存放的目的地。  

16      FileWriter fw =new FileWriter("C:/demo.txt");  

17       

18      fw.write("abcde");  

19      //刷新流对象中缓冲中的数据  

20      //将数据刷到目的地中  

21      fw.flush();  

22        

23       fw.write("分工哈哈哈哈");  

24      //将数据刷到目的地中  

25      fw.flush();  

26       

27      //关闭流资源,但是关闭之前会刷新一次缓冲中的数据  

28      //讲数据刷到目的地中,flush刷新后,流可以继续使用,close刷新后,会将流关闭。  

29      fw.close();  

30    }  

31      

32 }  


IO异常的处理方式:


凡是与设备上的数据发生关系的,进行处理的都会发生IO异常,无论读还是写

异常是针对方法来说的,抛出、声明抛出、捕获和处理异常都是在方法中进行的。        Java异常处理通过5个关键字trycatchthrowthrowsfinally进行管理。基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。异常中要记得在finally中判断流对象是否为空,并在使用完后关闭所有的流对象。

举例说明:

[java] view plaincopy

33 import java.io.*;  

34   

35 class FileWriteDemo2  

36 {  

37    public static void main(String []args)  

38    {  

39    //在外面建立引用,在try内初始化  

40    FileWriter fw=null;  

41    try{  

42      

43        //try里面定义的变量在外面访问不到  

44        //FileWriter fw=new FileWriter("demo.txt");  

45          

46        //向磁盘中写入文件  

47        fw=new FileWriter("c:\\demo.txt");  

48        //向文件中写入内容  

49        fw.write("abcdefg");  

50       

51       

52    }catch(IOException e)  

53    {  

54      System.out.println("catch:"+e.toString());  

55      //finally内关闭资源,一定会被执行的代码往里面放入  

56    }finally{  

57      

58          try{  

59          // 对流对象进行判断,如果不为空就关闭  

60           if(fw!=null)  

61           {  

62              fw.close();  

63           }  

64                  

65                  

66           }catch(IOException e)  

67           {  

68              System.out.println(e.toString());  

69           }  

70           

71    }  

72       

73    }     

74 }  

文件的续写

[java] view plaincopy

75   /* 

76 演示对已有文件的数据续写。 

77 */  

78 import java.io.*;  

79   

80 class FileWriteDemo3  

81 {  

82    public static void main(String []args)  

83    {  

84    //在外面建立引用,在try内初始化  

85    FileWriter fw=null;  

86    try{  

87      

88        //try里面定义的变量在外面访问不到  

89        //FileWriter fw=new FileWriter("demo.txt");  

90          

91        //向磁盘中写入文件  

92        //传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处进行数据的续写  

93        fw=new FileWriter("c:\\demo.txt",true);  

94        //向文件中写入内容  

95        fw.write("nihao\r\nxiexie");  

96       

97       

98    }catch(IOException e)  

99    {  

100      System.out.println("catch:"+e.toString());  

101      //finally内关闭资源,一定会被执行的代码往里面放入  

102    }finally{  

103      

104          try{  

105          // 对流对象进行判断,如果不为空就关闭  

106           if(fw!=null)  

107           {  

108              fw.close();  

109           }  

110                  

111                  

112           }catch(IOException e)  

113           {  

114              System.out.println(e.toString());  

115           }  

116           

117    }  

118       

119    }     

120 }  


文本文件读取方式

[java] view plaincopy

121 /*第一种方式:一次读取一个字符*/import java.io.*;  

122   

123 class FileReaderDemo  

124 {  

125    public static void main(String []args) throws IOException  

126    {   

127        //创建一个文件读流对象,和指定名称的文件相关联  

128        //要保证该文件时已经存在的,如果不存在,会发生异常FileNotFoundException  

129        FileReader fr=new FileReader("C:/demo.txt");  

130        //调用读取流对象的read方法  

131        //raed()方法一次读入一个字符,而且会自动往下读。  

132        /* 

133        int ch=fr.read(); 

134         

135        System.out.println("ch="+(char)ch); 

136         

137        int ch1=fr.read(); 

138         

139        System.out.println("ch="+(char)ch1); 

140         

141        */  

142        //read方法作为整数读取的字符,范围在065535之间,如果达到流的末尾,则返回-1  

143          

144        /* 

145        while(true) 

146        { 

147           int ch=fr.read(); 

148           if(ch==-1) 

149              break; 

150           System.out.println("ch="+(char)ch); 

151        } 

152        fr.close(); 

153        */  

154        int ch=0;  

155          

156        while((ch=fr.read())!=-1)  

157        {  

158          System.out.println("ch="+(char)ch);   

159        }  

160    }  

161 }  

[java] view plaincopy

162 /* 

163 第二种方式,通过字符数组进行读取。 

164  

165 这种读取方式最有效 

166 */  

167   

168 import java.io.*;  

169   

170 class FileReaderDemo2  

171 {  

172    public static void main(String []args) throws IOException  

173    {   

174      FileReader fr=new FileReader("C:/demo.txt");  

175        

176      //定义一个字符数组。用于存储读到字符  

177      //read(char[])返回的是读到的字符个数  

178        

179      char [] buf=new char[1024];  

180      /* 

181      int num=fr.read(buf); 

182       

183      System.out.println("num="+num+"..."+new String(buf)); 

184       

185      int num1=fr.read(buf); 

186       

187      System.out.println("num1="+num1+"..."+new String(buf)); 

188       

189      int num2=fr.read(buf); 

190       

191      System.out.println("num2="+num2+"..."+new String(buf,0,1)); 

192         */   

193     int num=0;  

194     while((num=fr.read(buf))!=-1)  

195     {  

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

197     }  

198     fr.close();   

199    }  

200 }  


拷贝文本文件:C盘一个文本文件复制到D盘。
复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件中。
步骤:
1,在D盘创建一个文件。用于存储C盘文件中的数据。
2,定义读取流和C盘文件关联。
3,通过不断的读写完成数据存储。

方式一:读取一个字符,存入一个字符
方式二:先将读取的数据存入到内存中,再将存入的字符取出写入D
4,关闭资源:输入流资源和输出流资源。
举例:

[java] view plaincopy

201 import java.io.*;  

202   

203 class CopyText   

204 {  

205     public static void main(String[] args) throws IOException  

206     {  

207         copy_2();  

208     }  

209   

210   

211     public static void copy_2()  

212     {  

213         FileWriter fw = null;  

214         FileReader fr = null;  

215         try  

216         {  

217             fw = new FileWriter("SystemDemo_copy.txt");  

218             fr = new FileReader("SystemDemo.java");  

219   

220             char[] buf = new char[1024];  

221   

222             int len = 0;  

223             while((len=fr.read(buf))!=-1)  

224             {  

225                 fw.write(buf,0,len);  

226             }  

227         }  

228         catch (IOException e)  

229         {  

230             throw new RuntimeException("读写失败");  

231   

232         }  

233         finally  

234         {  

235             if(fr!=null)  

236                 try  

237                 {  

238                     fr.close();  

239                 }  

240                 catch (IOException e)  

241                 {  

242                 }  

243             if(fw!=null)  

244                 try  

245                 {  

246                     fw.close();  

247                 }  

248                 catch (IOException e)  

249                 {  

250                 }  

251         }  

252     }  

253   

254     //C盘读一个字符,就往D盘写一个字符。  

255     public static void copy_1()throws IOException  

256     {  

257         //创建目的地。  

258         FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");  

259   

260         //与已有文件关联。  

261         FileReader fr = new FileReader("RuntimeDemo.java");  

262   

263         int ch = 0;  

264   

265         while((ch=fr.read())!=-1)  

266         {  

267             fw.write(ch);  

268         }  

269           

270         fw.close();  

271         fr.close();  

272   

273     }  

274 }  

示意图:


缓冲区,BufferedWriter

缓存区的作用?

字符流缓冲区对应那两个类?

缓冲区必须结合什么来使用?

缓冲区对应的类为什么没有空构造函数?

跨平台的换行方法是?

关闭缓冲区本质是什么?关闭后还需要关闭数据流吗?

缓冲区要记得做什么?

Buffer.newLine()方法只能适用于什么对象?

缓冲区的作用:提高对数据读写效率。

缓冲区的出现是为了提高流的操作效率而出现的,要结合流才能使用。所以在创建缓冲区之前,必须要先有流对象。

缓冲区的原理就是内部封装数组,先存入在取出.

字符读取流缓冲区:

该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。当返回null时,表示读到文件末尾。

readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

一般方法命名后缀都是父类,前缀都是功能

public BufferedWriter(Writer out)BufferedWriter没有空构造函数,必须有对象。原因是这个函数的作用就是为了提高流的操作效率,如果没有流的话无法使用。所以必须有流的对象——BufferedWriter要结合流才能使用。

该缓冲区中提供了一个跨平台的换行符。

newLine();注意:只有在缓冲区中才能使用这个方法,别的地方没有!

演示代码:

import java.io.*;

class  BufferedWriterDemo

{

      public static void main(String[] args) throws IOException

      {

           //创建一个字符写入流对象

           FileWriter fw = new FileWriter ("buf.txt");

           //为了提高字符写入流效率,加入了缓冲技术.

           //只要将需要被调高效率的流对象作为参数传递给缓冲区的构造函数即可。

           BufferedWriter bufw = new BufferedWriter (fw);

           bufw.write("abcdefg");

           bufw.newLine();//快平台换行方法,可以在任意系统下都执行换行操作。原理就是windows下封装\r\n,linux下封装的是\n,不容系统调用相对应的换行操作符

           //bufw.write("abcd\r\nefg");windows下的换行操作

           for(int x=1; x<5; x++)

           {

                 bufw.write("abcd"+x);

                 bufw.newLine();//调用newLine()打印进行换行,并刷新缓冲流

                 bufw.flush();//可以把刷新操作放在for循环外面,但是这样如果中途遇到停电会倒是数据没有实时写入文件,所以为了保险,写一次刷新一次

           }

           //记住:只要用到缓冲区,就要记得刷新

           //bufw.flush();缓冲区刷新方法

           bufw.close();//关上缓冲区的方法

           //fwclose();关上缓冲区就是在关闭缓冲区的流对象了。

      }

}

BufferedReader

读取缓冲区为什么没有构造函数?如何读取?

将缓冲流中的内容全读出来的方法?代码?

字符读取缓冲流

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

注意:BufferedReader的对象是一个ReaderBufferedWriter的对象是一个Writer

BufferedReader特有方法是可以读一行字符串,ReaderLine().

该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。

当返回null时,表示读到文件末尾。该方法读完不返回回车符,需要自行添加回车符。

演示代码:

import java.io.*;

class BufferedReaderDemo

{

      public static void main(String[] args) throws IOException

      {

           //创建一个读取流对象和文件相关联。

           FileReader fr = new FileReader("buf.txt");//建立一个流对象fr,将他与源对象buf相关联

           //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。

           BufferedReader bufr = new BufferedReader(fr);//建立一个字符串读取缓冲区bufr,对象为fr

           //String s1 = bufr.readLine();//执行bufrreadLine()函数,注意这个函数中的L是大写,将读取的第一行以字符串的形式返回给s1

           //继续执行此语句,将会继续向下读写。为了读取全部内容,建立循环语句。

           //查表得知:readLine()返回为:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

           String line = null ;//建立一个空字符串line

           while ((line=bufr.readLine())!=null)//bufr读取到那一行不为null时,就把值返回给line,然后执行下面的操作。

           {

                 System.out.println("line="+line);//输出

           }

           bufr.close();

      }

}

通过缓冲区复制文本文件

Readline()会读行休止符吗?

怎么copy文件?代码?

Readline()返回的是什么内容?

Readline()原理是?
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

两个流直接没有什么关系,需要中转站来进行中转读写文件

import java.io.*;

class CopyTestByBuf

{

      public static void main(String[] args)

      {

           BufferedReader bufr = null;//建立读写缓冲区,分别为bufrbuwr,值都是null。把这个缓冲区引用建立在try外面,在try里面进行初始化,这样就可以使finally中也可以访问到bufr了。

           BufferedWriter bufw = null;

           try

           {

                 bufr = new BufferedReader(newFileReader("BufferedWriterDemo.java"));//利用匿名函数建立源文件io流与BufferedWriterDemo.java对接,然后建立新的缓冲区并赋值给bufr

                 bufw = new BufferedWriter(newFileWriter("Buffered_copy.txt"));//利用匿名函数建立将要写入目的地文件Buffered_copy.txtio流与此文件对象,然后建立新的缓冲区,对象为此文件,并赋值给bufw

                 String line = null;//line充当中转站的作用,将两个缓冲区通过中转站来进行交换数据

                 while ((line=bufr.readLine())!=null)//将源文件中的内容全部读出。

                 {

                      System.out.println("line="+line);//这个必须带有换行,因为readLine()返回值不带有任何 行返回符,所以输出的时候才能输出回车

                      bufw.write(line);//line内的字符串同bufw缓冲区的write()函数,写入到line值中

                      bufw.newLine();//因为readLine()函数不返回行回车符,所以利用newLine()函数进行换行,读取一行就换行

                      bufw.flush();//刷新缓冲区,及时将line中的内容写入文件

                 }

           }

           catch (IOException e)//如果读写失败就抛出异常

           {

                 throw new RuntimeException("读写失败");

           }

           finally

           {

                 try

                 {

                      if(bufr!=null)

                            bufr.close();

                 }

                 catch (IOException e)

                 {

                      throw new RuntimeException("读取关闭失败");

                 }

                 try

                 {

                      if(bufw!=null)

                            bufw.close();

                 }

                 catch (IOException e)

                 {

                      throw new RuntimeException("写入关闭失败");

                 }

           }

      }

}

readLine的原理图示例:

无论是读一行,获取读取多个字符。其实最终都是在硬盘上一个一个读取。最终使用的还是read方法一次读一个的方法。读完一行,存入一个数组中区,然后返回该数组的字符串,再读下一行

MyBufferedReader

代码怎么写?

import java.io.*;

class MyBufferedReader//建立一个类,可以实现BufferedReader的功能

{

      private FileReader r;//私有化对象,方便本类可以读取

      MyBufferedReader (FileReader r)//构造函数,每次调用MyBufferedReader的接受对象r。没有对象r,就是没有FileReader不能执行MyBufferedReader

      {

           this.r = r;//将对象r赋值给本类成员变量r

      }

      public String myReadLine()throws IOException//建立myReadLine(),实现可以一次读一行数据的方法。

      {    //定义一个临时容器。原BufferReader封装的是字符数组。

           //为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。

           StringBuilder sb = new StringBuilder();//建立一个Stringbuilder函数,对象为sb

           int ch = 0;//int变量ch0

           while ((ch=r.read())!=-1)//当问及读取不为-1,即没有数据时,继续下面的指令,并且把值赋给ch

           {

                 if (ch=='\r')

                      continue;//如果遇到\r,就不进行任何操作,继续下面

                 if (ch=='\n')

                      return sb.toString();//如果遇到了\n就将sb转换成字符串的形式返回。

                 else

                      sb.append((char)ch);//如果没有遇到\n那么就将ch转换成字符,使用append将字符添加到sb中。

           }

           if(sb.length()!=0)//因为上面遇到回车才会记录字符,如果最后一行没有回车就不会记录,所以这里,当运行完上面的指令后,sb的长度不为零,即sb内有字符串的话,就继续返回字符串

                 return sb.toString();

           return null;

      }

      /*

      覆盖Reader类中的抽象方法。将上面的FileReader修改为Reader,这样接收的对象就是Reader,继承Reader,再覆写

      public int read(char[] cbuf, int off, int len) throwsIOException

      {

           return r.read(cbuf,off,len) ;

      }

      public void close()throws IOException

      {

           r.close();

      }

      */

      public void myClose()throws IOException

      {

           r.close();//FileReader的对象r关闭即可。其实BufferedReaderclose()函数的本质也是调用对象的close()函数

      }

}

class MyBufferedReaderDemo

{

      public static void main(String[] args) throws IOException

      {

           FileReader fr = new FileReader("buf.txt");//源文件与流关联

           MyBufferedReader myBuf = new MyBufferedReader(fr);//使用自己的方法来读取fr

           String line = null;

           while ((line=myBuf.myReadLine())!=null)

           {

                 System.out.println(line);

           }

           myBuf.myClose();//使用自己的函数关闭流

      }

}

示意图:



MyBufferedReader(自定义BufferedReader)原理:可根据BufferedReader类中特有发那个发readLine()的原理,自定义一个类中包含相同功能的方法

步骤:1.初始化自定义的类,加入流对象。

            2.定义一个临时容器,原BufferedReader封装的是字符数组,此类中可定义一个StringBuilder的容器,最终可实现字符串的提取。

[java] view plaincopy

351 /* 

352 明白了BufferedReader类中特有方法readLine的原理后, 

353 可以自定义一个类中包含一个功能和readline一致的方法 

354 来模拟一下BufferedReader 

355 */  

356 import java.io.*;  

357   

358 class MyBufferedReader extends Reader  

359 {  

360     

361   //装饰设计模式  

362    private Reader r=null;  

363      

364    MyBufferedReader(Reader r)  

365    {  

366       this.r=r;  

367    }  

368    //可以一次读一行数据的方法  

369    public String myReadLine() throws IOException  

370    {  

371      //定义一个临时容器,员BufferedReader封装的是字符数组  

372      //为了演示方便,定义一个StringBulilder容器,因为最终还是要将数据变成字符串。  

373      StringBuilder sb=new StringBuilder();  

374      int ch=0;  

375      while((ch=r.read())!=-1)  

376      {  

377        if(ch=='\r')  

378        continue;  

379        if(ch=='\n')  

380         return sb.toString();  

381        else  

382        sb.append((char)ch);  

383      }  

384      //如果没有遇到\nsb中而且有数据的话也要返回  

385       if(sb.length()!=0)  

386         return sb.toString();  

387      return null;  

388    }  

389   /* 

390   覆盖类中的抽象方法 

391   */  

392   public int read(char[] cbuf,int off,int len)throws IOException  

393   {  

394     return r.read(cbuf,off,len);  

395   }  

396     

397   public void close() throws IOException  

398   {  

399       r.close();  

400   }  

401     

402   public void myClose() throws IOException  

403   {  

404       r.close();   

405   }  

406 }  

407   

408   

409   

410 class MyBufferedReaderDemo  

411 {  

412    public static void main(String[] args) throws IOException  

413    {  

414       FileReader fr=new FileReader("buf.txt");  

415         

416       MyBufferedReader myBuf=new MyBufferedReader(fr);  

417      

418       String line=null;  

419         

420       while((line=myBuf.myReadLine())!=null)  

421       {  

422         System.out.println(line);  

423       }  

424         

425       myBuf.myClose();  

426    }  

427      

428 }  

简单总结:

字符输出流:Writer 从内存向硬盘中写数据

字符输入流:Reader 从硬盘中读取数据到内存

操作文字 优先考虑字符流。效率高

---------------------------------------------------

●FileWriter 

构造方法:

|--FileWriter("文件名或绝对路径名")

|--覆盖源文件

|--FileWriter("文件名或绝对路径名",boolean)

|--可续写源文件,boolean为true时

--------------------

方法:

|--write 写入内容

|--flush 对缓冲进行摔性能,使内容写进文件

|--close 对流进行关闭操作,可自动刷新

●FileReader

构造方法:

|--FileReader("文件名")

方法:

|--read 读取文件内容

|--int read()读取单个字符,返回一个对应的整数

|--读取到最后再读取的话返回-1,可以把-1当做流的结束标记

|--连续使用read方法,会自动往下读

|--重载(int char[])

|--按照数组的长度进行读取,可重复使用数组,每次读取到的下一个字符 存储进数组将对应地覆盖数组中的字符元素

|--返回读取到的字符数,返回的是新都区到的字符数而不是数组内的字符 数。

|--当返回-1时结束

|--重载(char[],int off,int len) //将字符读入数组或读入数组的一部分

|--read为阻塞式方法

|--close 关闭读取流

★文本文件的复制:

方法1---(读取一个写入一个):

|--创建输入输出流对象,参考try内外进行

|--while循环内读取一个写入一个,条件返回值ch!=-1

|--刷新 关闭流 结束

方法2---(读取全部后一次性写入):

|--输入流读取

|--1 先读取文件,将文件内容保存到字符数组

|--2 将字符数组转成字符串,用字符串记录下来

|--输出流写出

|--1 将字符串转成字符数组

|--2 将字符数组作为文件内容写进输出流

-----------------------------------------------------------------

缓冲区

用于提高对数据的操作效率。所以首先要有数据流存在,用缓冲区构造方法接收流对象。

●BufferedWriter

字符输出流缓冲区 类,创建对象后,需要先进行刷新再进行关闭,不同于字符输出流,关闭后自动刷新。

分为三种操作:单个字符、字符数组和字符串。

特有方法: newLine() 换行,具有跨平台性,在windows下的换行是\r\n,在Linux下是\n,用这个方法在其平台下都可以,使用的是相应的系统的line.separator属性。

注意:

缓冲区记性关闭操作时,同时把流关闭了,底层代码其实就是关闭流操作,所以调用了缓冲区的关闭操作后,就不能再进行流的操作了。 缓冲区并没有操作文件,只是提高了数据的操作效率,和文件没有直接关系,真正操作文件的还是流。

●BufferedReader

字符输入缓冲区,将数据读入缓冲区中。

其方法对文件的操作有两三种:字符、数组和行。读取行是文本特有的特性。

方法:

|--String readLine 一次读取一行,返回一个字符串

|--读到结尾的结束标记 返回 null

|--是基于read方法的扩展,read到的数据存到另一容器(数组或者 StringBuilder..)中,读到\r或\n是就停止,返回数组中的数据,就是一 行的数据,格式为字符串。

|--int read 读取单个字符到缓冲区

|--int read(char[],int off,int len) 把字符读进字符数组中

缓冲区操作输入输出操作,虽然和流直接操作表面没有太大差别,内在的读取输出是不同的。流是在源中读取,而缓冲区的读取是在缓冲区中进行的。

流对象直接对硬盘内容进行操作。而缓冲区对象操作的是:内存中保存了硬盘文件内容的数组。   就是一次性的先把文件内容装进内存数组中,再从内存数组中获取数据。

 

 

 

 

本篇博文结束!




                                                                                                   @感谢老师的辛苦批阅

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值