我正在通过缓冲读取器机制读取日志文件,该机制占用的总执行时间以毫秒为单位:12944,请告知我该如何提高性能并降低该时间,请注意,尼奥比缓冲读取器的性能更好。
!文件大小为10MB,因为它是一个日志文件。也请告知使用nio也可以实现相同的目的.. !!
public class BufferedRedeem
{
public static void main(String[] args)
{
BufferedReader br = null;
long startTime = System.currentTimeMillis();
try
{
String sCurrentLine;
br = new BufferedReader(new FileReader("C://abc.log"));
while ((sCurrentLine = br.readLine()) != null)
{
}
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Total execution time taken in millis: " + elapsedTime);
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (br != null)
br.close();
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}
由于OP渴望了解如何使用NIO来完成此操作。
由于文件很小,很难看到差异,但是可以测量。
public static void main(String... args) throws IOException {
PrintWriter pw = new PrintWriter("abc.log");
for (int i = 0; i < 100 * 1000; i++) {
pw.println("0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
}
pw.close();
long start2 = System.nanoTime();
int count2 = 0;
BufferedReader br = new BufferedReader(new FileReader("abc.log"));
while (br.readLine() != null) count2++;
br.close();
long time2 = System.nanoTime() - start2;
System.out.printf("IO: Took %,d ms to read %,d lines%n", time2 / 1000 / 1000, count2);
long start = System.nanoTime();
FileChannel fc = new FileInputStream("abc.log").getChannel();
ByteBuffer bb = ByteBuffer.allocateDirect((int) fc.size());
fc.read(bb);
fc.close();
bb.flip();
CharBuffer cb = ByteBuffer.allocateDirect(bb.remaining() * 2).order(ByteOrder.nativeOrder()).asCharBuffer();
CharsetDecoder cd = Charset.forName("UTF-8").newDecoder();
cd.decode(bb, cb, true);
cb.flip();
StringBuilder sb = new StringBuilder();
int count = 0;
while (cb.remaining() > 0) {
char ch = cb.get();
if (isEndOfLine(cb, ch)) {
// process sb
count++;
sb.setLength(0);
} else {
sb.append(ch);
}
}
long time = System.nanoTime() - start;
System.out.printf("NIO as UTF-8: Took %,d ms to read %,d lines%n", time / 1000 / 1000, count);
long start3 = System.nanoTime();
FileChannel fc2 = new FileInputStream("abc.log").getChannel();
MappedByteBuffer bb2 = fc2.map(FileChannel.MapMode.READ_ONLY, 0, fc2.size());
bb.flip();
StringBuilder sb3 = new StringBuilder();
int count3 = 0;
while (bb2.remaining() > 0) {
char ch = (char) bb2.get();
if (isEndOfLine(bb2, ch)) {
// process sb
count3++;
sb3.setLength(0);
} else {
sb3.append(ch);
}
}
fc2.close();
long time3 = System.nanoTime() - start3;
System.out.printf("NIO as ISO-8859-1: Took %,d ms to read %,d lines%n", time3 / 1000 / 1000, count3);
}
private static boolean isEndOfLine(CharBuffer cb, char ch) {
if (ch == '\r') {
if (cb.remaining() >= 1 && cb.get() == '\n') {
return true;
}
cb.position(cb.position() - 1);
return true;
} else if (ch == '\n') {
return true;
}
return false;
}
private static boolean isEndOfLine(ByteBuffer bb, char ch) {
if (ch == '\r') {
if (bb.remaining() >= 1 && bb.get() == '\n') {
return true;
}
bb.position(bb.position() - 1);
return true;
} else if (ch == '\n') {
return true;
}
return false;
}
打印每一行的长度为102字节,因此文件约为10 MB。
IO: Took 112 ms to read 100,000 lines
NIO as UTF-8: Took 207 ms to read 100,000 lines
NIO as ISO-8859-1: Took 87 ms to read 100,000 lines
如前所述,使用NIO节省35毫秒的额外复杂性不太值得。
顺便说一句:如果您有硬盘驱动器,并且文件不在内存中,则仅驱动器的速度至关重要。
本文向大家介绍Java缓冲读取器,包括了Java缓冲读取器的使用技巧和注意事项,需要的朋友参考一下 示例 介绍 该BufferedReader班是以外的包装Reader是有两个主要目的类: ABufferedReader为包装的提供缓冲Reader。这允许应用程序一次读取一个字符,而不会产生过多的I / O开销。 一个BufferedReader用于一次读取文本行提供的功能。 使用Buffered
问题内容: 为了寻求帮助,我目前已编写了HTTP服务器。目前,它可以很好地处理GET请求。但是,在使用POST时,缓冲的读取器似乎挂起。当请求停止时,其余输入流将通过缓冲的读取器读取。我在Google上找到了一些东西。我尝试将CRLF和协议版本从1.1更改为1.0(浏览器会自动将请求发送为1.1),任何想法或帮助将不胜感激。谢谢 问题答案: 这不安全!但是显示了如何在初始HTTP标头之后的输入流中
我有以下代码来读取java文件,并打印出行。我通过两种方式实现了它: 使用流: 使用循环: 我被告知这是错误的,使用缓冲读取器是错误地使用了语言的特性。有没有更好的方法,我想知道使用语言功能的正确方法。
问题内容: 任何人都可以解释我的类之间的区别,以及?我想阅读文本文件时使用哪一个? 问题答案: 好: 只是使用平台默认编码(urgh)读取文件的 是另一个的包装,增加了缓冲并可以一次读取一行 从各种不同的来源读取内容,但通常用于交互式输入。我个人觉得API的痛苦和晦涩。 要读取一个文本文件,我建议使用一个包裹在一个(这样你就可以指定编码),然后包裹在缓冲和在同一时间读取线的能力。 或者,您可以使用
与malloc'相同大小的内存和手动读取整个文件到malloc'区域相比,这有什么不同?
问题内容: 我正在尝试从FTP服务器读取文件。该文件是一个文件。我想知道在套接字打开的情况下是否可以对此文件执行操作。我试图按照什么分两个问题,提到的阅读文件,而不写入磁盘和读取从FTP文件,而无需下载,但没有成功。 我知道如何提取下载文件上的数据/工作,但不确定是否可以即时执行。有没有一种方法可以连接到站点,在缓冲区中获取数据,还可以提取某些数据并退出? 尝试StringIO时出现错误: 我只需