使用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、减少磁盘读取次数
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 全面盘点MySQL中的那些重要日志文件
下一篇: layui实现登陆界面验证码