【java基础】--(3)javaIO详细阐释

1、总的4类

字符:Reader 和Writer

字节:InputStream和OutputStream

2、Reader

六个子类BufferedReader, CharArrayReader, FilterReader,InputStreamReader, PipedReader, StringReader

2.1 BufferedReader

为什么用它?

将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的

工作原理?

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

什么时候用?

建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)

示例1:包装InputStreamReader

InputStreamReader又包装System.in

将控制台输入,赋给字符串

BufferedReader buf = new BufferedReader(



                new InputStreamReader(System.in));



        String str = null;



        System.out.println("请输入内容");



        try{



            str = buf.readLine();



        }catch(IOException e){



            e.printStackTrace();



        }



        System.out.println("你输入的内容是:" + str);


子类:LineNumberReader
跟踪行号的缓冲字符输入流

2.2 CharArrayReader

工作原理?

把字符数组作为源的输入流的实现

什么时候用?

缓冲字符数组,读取每个字符的时候

示例1:读取字符数组中每个字符并输出

 String strTmp = "abcdefghijklmnopqrstuvwxyz"; 

  int intLen = strTmp.length();

  char c[] = new char[intLen];

  strTmp.getChars(0,intLen,c,0); 
  CharArrayReader input1 = new CharArrayReader(c);

  CharArrayReader input2 = new CharArrayReader(c,0,5);

 
 int i;

  System.out.println("input1 is : ");

  while((i=input1.read())!=-1){

   System.out.print((char)i);

  }

  System.out.println();

  System.out.println("input2 is : ");

  while((i=input2.read())!=-1){

   System.out.print((char)i);

  }


 

2.3 FilterReader抽象类

子类:PushbackReader

工作原理?

允许将字符推回到流的字符流

unread(char c) 回压一个字符; unread(char c[]) 回压数组 c 中全部字符 
unread(char c[],offset,int n) 回压 c 中从 offset 开始的 n 个字符

为什么用它?

编译原理的一个重要的组成部分叫做词法分析器,就是我上面提到的scanner。对于词法分析程序来说,输入就是源代码,输出就是一个一个的Token(想不出来合适的词),通常词法分析器会一个字符一个字符读取,然后将将这些字符根据一定的规则组成token的序列。有些时候,scanner需要超前读下一个字符才能判断当前的token是否已经结束。例如,int abc=5;这样一个语句,词法分析器要读到=这个字符的时候才能确定abc是一个id,而不是"abc=",这样=已经从输入流中读出来了,但是=又不属于当前的Token,所以要把这个=退回去,这时就要用到pushback。

 

2.4InputStreamReader

是字节流通向字符流的桥梁

要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

 BufferedReader in

   = new BufferedReader(new InputStreamReader(System.in));

 

 

 

子类:FileReader

工作原理?

用来读取字符文件的便捷类

示例1:读取字符文件并写到数组

路径分隔符:File.separator

 String fileName="D:"+File.separator+"hello.txt";



        File f=new File(fileName);



        char[] ch=new char[100];



        Reader read=new FileReader(f);



        int count=read.read(ch);



        read.close();



        System.out.println("读入的长度为:"+count);



        System.out.println("内容为"+new String(ch,0,count));


 

2.5 PipedReader

工作原理?

传送的字符输入流。

什么时候用?

管道输入输出流类主要用于线程之间的通信,不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。

示例1:管道输入输出流类用于线程之间的通信(读管道中数据到字符数组,写到管道中)

两个线程

一个读一个写,都用到管道流,并返回管道流对象

主函数中得到输入输出对象

输出对象与输入对象打通管道 t1.connect(t2);

开启各自线程 s.start(); r.start();

PipedInputStream,PipedOutputStream管道输入输出流类主要用于线程之间的通信,不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。

PipedReader,Pipedwriter字符输入输出流类和上面的类似

import java.io.*;

public class PipedStreamTest {

 

 public static void main(String[] args) {

  // TODO Auto-generated method stub

        Sender s=new Sender();

        Reciever r=new Reciever();

        PipedWriter t1=s.getWriter();

        PipedReader t2=r.getReader();

        try{

        t1.connect(t2);

        }

        catch(Exception e)

        {

         e.printStackTrace();

        }

        s.start();

        r.start();

 }

}

class Reciever extends Thread

{

      PipedReader in=new PipedReader();

      public PipedReader getReader()

      {

       return in;

      }

      public void run()

      {

       char [] buf=new char[1024];

      try{

       int len=in.read(buf);

       System.out.println("the following messageid:"+'\n'+

         new String(buf,0,len));

       in.close();

      }

      catch(Exception e)

      {

       e.printStackTrace();

      }

      }

}

class Sender extends Thread

{

    private PipedWriter out=new PipedWriter();

    public PipedWriter getWriter()

          {

            return out;

        }

    public void run()

    {

     String strInfo=new String("hello,how are you doing?");

     try{

     out.write(strInfo);

     out.close();

     }

     catch(Exception e)

     {

      e.printStackTrace();

     }

    }

}


 

2.6StringReader

工作原理?

其源为一个字符串的字符流。

什么时候用?

StringReader并不常用,因为通常情况下使用String更简单一些。但是在一些需要Reader作为参数的情况下,就需要将String读入到StringReader中来使用了

示例1:统计单词数

StreamTokenizer(reader);需要reader参数

文件未结束:streamTokenizer.nextToken() != StreamTokenizer.TT_EOF

读到单词:streamTokenizer.ttype == StreamTokenizer.TT_WORD

public void countWordsInAString() {



StreamTokenizer streamTokenizer = null;



String stringToBeParsed = "The quick brown fox jumped over the lazy dog";

StringReader reader = new StringReader(stringToBeParsed);



int wordCount = 0;



try {



streamTokenizer = new StreamTokenizer(reader);



while (streamTokenizer.nextToken() != StreamTokenizer.TT_EOF) {



if (streamTokenizer.ttype == StreamTokenizer.TT_WORD)

wordCount++;

}



System.out.println("Number of words in file: " + wordCount);



} catch (FileNotFoundException ex) {

ex.printStackTrace();

} catch (IOException ex) {

ex.printStackTrace();

}

}


 

 

你可能感兴趣的:(java基础)