使用BufferedReader讀取TXT文件中數值,並輸出最大值

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、減少磁盤讀取次數

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: