黑马程序员:Java基础总结----字符流Reader&Writer

来源:互联网 发布:北电网络的业务有哪些 编辑:程序博客网 时间:2024/05/23 02:05
黑马程序员:Java基础总结



字符流Reader&Writer

 ASP.Net+Android+IO开发.Net培训、期待与您交流!




字符流

字符流两个基类:
Reader Writer


类 Writer 方法

 Writerappend(char c)
          将指定字符添加到此 writer。
abstract voidclose()
          关闭此流,但要先刷新它。abstract voidflush()
          刷新该流的缓冲。
 voidwrite(String str)
          写入字符串。
             //创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
             //而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
             //其实该步就是在明确数据要存放的目的地。
            FileWriter fw = new FileWriter("demo.txt" );

             //调用write方法,将字符串写入到流中。
            fw .write("abcde");

             //刷新流对象中的缓冲中的数据。
             //将数据刷到目的地中。
            //fw. flush();


             //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
             //将数据刷到目的地中。
             //和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
            fw. close();

类 FileWriter

FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
FileWriter(File file, boolean append)
          根据给定的 File 对象构造一个 FileWriter 对象。

             //传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
             FileWriter fw = new FileWriter("demo.txt",true );

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

            fw.close()

类 BufferedWriter

BufferedWriter(Writer out)
          创建一个使用默认大小输出缓冲区的缓冲字符输出流。

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

该缓冲区中提供了一个跨平台的换行符。
newLine();
voidnewLine()
          写入一个行分隔符。
      BufferedReader bufr = null ;
            BufferedWriter bufw = null;

             try
            {
                  bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java" ));
                  bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt" ));

                  String line = null;

                   while((line=bufr.readLine())!=null)
                  {
                        bufw.write(line);
                        bufw.newLine();
                        bufw.flush();

                  }
            }

类 Reader 方法

 intread()
          读取单个字符。如果已到达流的末尾,则返回 -1 abstract intread(char[] cbuf, int off, int len)
          将字符读入数组的某一部分。

类 FileReader

构造同FileWriter,方法同Reader,

             FileWriter fw = null;
            FileReader fr = null;
             try
            {
                  fw = new FileWriter("SystemDemo_copy.txt");
                  fr = new FileReader("SystemDemo.java");

                   char[] buf = new char[1024];//提高效率

                   int len = 0;
                   while((len=fr.read(buf))!=-1)
                  {
                        fw.write(buf,0,len);
                  }
            }

类 BufferedReader

BufferedReader(Reader in)
          创建一个使用默认大小输入缓冲区的缓冲字符输入流。
字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。(windows中回车是\r\n)
StringreadLine()
          读取一个文本行。包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 
      String line = null ;

             while((line=bufr.readLine())!=null)
            {
                  System.out.print(line);
            }

类 LineNumberReader  extends BufferedReader

特有方法:
 intgetLineNumber()
          获得当前行号。
 voidsetLineNumber(int lineNumber)
          设置当前行号。
默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由 getLineNumber() 返回的值。

下面模拟了这一过程

import java.io.*;

class MyLineNumberReader {
       private Reader r ;
       private int lineNumber ;

      MyLineNumberReader(Reader r) {
             this.r = r;
      }

       public String myReadLine() throws IOException {

             lineNumber++;
            StringBuilder sb = new StringBuilder();

             int ch = 0;

             while ((ch = r .read()) != -1) {
                   if (ch == '\r' )
                         continue;
                   if (ch == '\n' )
                         return sb.toString();
                   else
                        sb.append(( char) ch);
            }
             if (sb.length() != 0)
                   return sb.toString();
             return null ;
      }

       public void setLineNumber(int lineNumber) {
             this.lineNumber = lineNumber;
      }

       public int getLineNumber() {
             return lineNumber ;
      }

       public void myClose() throws IOException {
             r.close();
      }
}

public class Ts {
       public static void main(String[] args) throws IOException {
            FileReader fr = new FileReader("copyTextByBuf.java" );
            MyLineNumberReader mylnr = new MyLineNumberReader(fr);
            String line = null;
            mylnr.setLineNumber(100);
             while ((line = mylnr.myReadLine()) != null) {
                  System. out.println(mylnr.getLineNumber() + "::" + line);
            }
            mylnr.myClose();
      }
}









 ASP.Net+Android+IO开发.Net培训、期待与您交流!

原创粉丝点击