JavaIO

412 查看

JAVA缓冲区就是先读一些数据在内存中间或者先写一部分数据在内存中。比如写,不是每次写数据到磁盘, 而是先把数据写到内存中,等到内存的缓冲区满了再一次写入磁盘,减少磁盘访问。JAVA读取大文需要使用radomAccessFileNIOInputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 每次调用InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader);

    import java.io.*;
    import java.io.DataInputStream;
    public  class   Main{
        public static void main(String[] args) throws  Exception {
    
          BufferedReader   reader= new BufferedReader(new InputStreamReader(new FileInputStream(new File("text.txt"))));
    String line=null;
     while((line=reader.readLine())!=null){
         String[]  s=line.split("\\s+");
         for ( String single:s ) {
               System.out.println(single);
         }
        
     }
        }
    }                                                                                 
    (System.in));

\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格。InputStreamReader 中的一个 read()是每次都会从磁盘里面读取一个字节。

关于flush方法:

每一个IO流都有自己的缓冲区。
flush本意是冲刷,这个方法大概取自它引申义冲马桶的意思,马桶有个池子,你往里面扔东西,会暂时保存在池子里,只有你放水冲下去,东西才会进入下水道。
同理很多流都有一个这样的池子,专业术语叫缓冲区,当你print或者write的时候,会暂时保存在缓冲区,并没有发送出去,这是出于效率考虑的,因为数据不会自己发送过去,必须有其他机制,而且这个很消耗资源,就像马桶你需要很多水,才能冲走,你如果扔一点东西,就冲一次水,那你水费要爆表了,同样如果你写一行文字,或者一个字节,就要马上发送出去,那网络流量,CPU使用率等等都要爆表了,所以一般只有在你真正需要发送否则无法继续的时候,调用flush,将数据发送出去。

flush的作用就是强制清空缓存,
写入IO,比如如果写操作之后程序不是对应着输出流的关闭,而是进行其他阻塞式的操作(比如从输入流里面读数据),
这个时候缓存数据就直接丢失。这个时候记住要flush一下,
只有这样服务端才能收到客户端发送的数据,否则可能会引起两边无限的互相等待