龙哥网

龙哥网

使用BufferedReader读取TXT文件中数值,并输出最大值_java(bufferedreader read方法)
2022-03-01

目录
  • BufferedReader读取TXT文件中数值输出最大值
    • 1.题目
    • 2.BufferedReader 介绍
    • 3.思路
    • 4.问题
    • 5.解决
    • 6.小结一下
  • 使用BufferedReader读取文件的好处

    BufferedReader读取TXT文件中数值输出最大值

    1.题目

    txt文件中数字的读取,并输出最大值

    输出最大值92

    2.BufferedReader 介绍

    • BufferedReader 是缓冲字符输入流。它继承于Reader。
    • BufferedReader 的作用是为其他字符输入流添加一些缓冲功能。

    BufferedReader 函数列表:

    BufferedReader(Reader in)
    BufferedReader(Reader in, int size)
     
    void     close()
    void     mark(int markLimit)
    boolean  markSupported()
    int      read()
    int      read(char[] buffer, int offset, int length)
    String   readLine()
    boolean  ready()
    void     reset()
    long     skip(long charCount)

    3.思路

    • 打开文件
    • 使用BufferedReader读取
    • readLine读取每一行,保存到新个 String 变量中
    • 将String中的数字,转换成数组
    • 从数组中比较出最大值

    4.问题

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常.,使用后要记得close

    使用readLine依次读取各行,处理后输出,如果用以下方法,则会出现除第一行外行首字符丢失,原因就在于br.read() != -1 这判断条件上。 因为在执行这个条件的时候其实它已经读取了一个字符了,然而在这里并没有对读取出来的这个字符做处理,所以会出现少一个字符,如果你这里写的是while(br.readLine()!=null)会出现隔一行少一行!

    String str  = null;
    br=new BufferedReader(new FileReader(fileName));
    while(br.read()!=-1){
      str = buf.readLine()); 
    }

    java.lang.NumberFormatException: For input string: " "这里的Integer.valueOf(s2[i]);参数里开头和结尾不能含有空格

       for(int i=0;i<s2.length;i++){
    	  a[i]= Integer.valueOf(s2[i]);
        }

    5.解决

    直接上代码了。。。。。

    package test; 
    import java.io.*; 
    public class testtwo {
    		public static void main(String[] args) throws IOException {
    	       try {
    	    	   //1.打开文件
    	    	   FileReader fr=new FileReader("test.txt");
    	    	   //2.使用BufferedReader读取
    	    	   BufferedReader br=new BufferedReader(fr);
    	    	   //保存数据
    	    	   String message = "";  
    	    	   String line = null;  
    	    	   while((line = br.readLine()) != null) {
    	    		   message = message+" "+line;  
    	    	   }
    	    	   //去掉两端空格
    	    	   message = message.trim();
                       //转化成数组
    	    	   String s2[]=message.split(" ");
    	    	   int a[]=new int[message.length()];
    	    	   for(int i=0;i<s2.length;i++){
    	    		    a[i]= Integer.valueOf(s2[i]);
    	    	   }
    	    	   //比较最大值
    	    	   int max=a[0];
    	    	   for(int j=1;j<a.length;j++){
    	    		   if(max<a[j]){
    	    			   max=a[j];
    	    		   }
    	    	   }
    	    	   System.out.println("最大值为"+max);
    	    	   //4.关闭文件
    		       br.close();
    	    	   fr.close();	    	   
    	       } catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    	 } 
    }

    6.小结一下

    • 使用BufferedReader中readLine一行一行的读取txt中数字
    • 使用line将要丢失的一行,先保存起来,就不会丢失了
    • String.trim()将数据两端的空格给去掉了

    使用BufferedReader读取文件的好处

    • 没有缓冲区时,每次读取操作都会导致一次文件读取操作(就是告诉操作系统内核我要读这个文件的这个部分,麻烦你帮我把它取过来)。
    • 有缓冲区时,会一次性读取很多数据,然后按要求分次交给上层调用者。

    读取块大小通常是按最适合硬件的大小来读的,因为对于硬件来说,一次读取一块连续数据(比如 1K)和一次读取一个字节需要的时间几乎是一样的(都是一次读操作,只是最终提交的数据量有差异)。带缓冲的 I/O 和不带缓冲的相比效率差异是非常显著的,你可以自行写程序测试。

    说到java reader缓存,其实有两层缓存:

    OS缓存,把磁盘数据 读入内存,通过read ahead, io scheduler等减少磁盘读取次数.

    App缓存,做缓存/预读,即BufferredReader的角色.

    BufferredReader的作用:我的理解

    1、减少System Call次数

    2、减少磁盘读取次数

    免责声明
    本站部分资源来源于互联网 如有侵权 请联系站长删除
    龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。