• 【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:"+'
    '+
             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();
    }
    }


     

  • 相关阅读:
    C/C++分别读取文件的一行
    (转载)C库函数strtok()
    (转载)C++常量折叠和C语言中const常量对比
    ssh
    ubuntu ufw
    uplevel
    ubuntu lucid source.list
    tail
    socket client with proc
    pack forget
  • 原文地址:https://www.cnblogs.com/riskyer/p/3354313.html
Copyright © 2020-2023  润新知