在 Java 中链接 InputStream
Chaining InputStream in Java
所以我知道 InputStream
将数据视为原始数据,而 Reader
将其视为字符。
缓冲它们会使事情更有效率。
但是像这样链接它们怎么样:
InputStream in = new InputStream(...);
in = new BufferedInputStream(in);
Reader r = new InputStreamReader(in);
r = new BufferedReader(r);
这样对吗?
在Java 7中,这是一个应用程序示例,它使用BufferedReader
和InputStreamReader
组合简单地读取一个4MB的文件到BufferedInputStream
并比较 Java 7.
下回合技术阅读的表现
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class MainIO_Optimization {
public static void main(String[] args) {
BufferedInputStream bis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
// ------ 1 ------
bis = new BufferedInputStream(new FileInputStream(new File("data/dictionnaire.txt")));
isr = new InputStreamReader(bis);
// ------ 2 ---------------
br = new BufferedReader(new FileReader("data/dictionnaire.txt"));
char[] buf = new char[10];
// ****** Performance *****
// we get system time
long startTime = System.currentTimeMillis();
// we simply read
while( br.read(buf) != -1 );
// print the time of execution
System.out.println("Time reading using BufferedReader with FileReader : "+ (System.currentTimeMillis()-startTime) + " ms" );
long startTime2 = System.currentTimeMillis();
while( isr.read(buf) != -1 );
System.out.println("Time reading using InputStreamReader with BufferedInputStream et FileInputStream : " + (System.currentTimeMillis() - startTime2 + " ms" ));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(bis != null)
bis.close();
if(isr != null)
isr.close();
if(br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
结果
Time reading using BufferedReader with FileReader : 31 ms
Time reading using InputStreamReader with BufferedInputStream et FileInputStream : 32 ms
如您所见,结果相差 1 毫秒。 BufferedReader
更快。
在 Java 8 中,你最好使用 NIO
包而不是 IO
。所以 FileChannels
会更有效率。
此类问题已回答:
根据其他人的一些意见,我得出结论:
在我的情况下,在另一个缓冲中使用缓冲是不行的。没用。
所以我知道 InputStream
将数据视为原始数据,而 Reader
将其视为字符。
缓冲它们会使事情更有效率。
但是像这样链接它们怎么样:
InputStream in = new InputStream(...);
in = new BufferedInputStream(in);
Reader r = new InputStreamReader(in);
r = new BufferedReader(r);
这样对吗?
在Java 7中,这是一个应用程序示例,它使用BufferedReader
和InputStreamReader
组合简单地读取一个4MB的文件到BufferedInputStream
并比较 Java 7.
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class MainIO_Optimization {
public static void main(String[] args) {
BufferedInputStream bis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
// ------ 1 ------
bis = new BufferedInputStream(new FileInputStream(new File("data/dictionnaire.txt")));
isr = new InputStreamReader(bis);
// ------ 2 ---------------
br = new BufferedReader(new FileReader("data/dictionnaire.txt"));
char[] buf = new char[10];
// ****** Performance *****
// we get system time
long startTime = System.currentTimeMillis();
// we simply read
while( br.read(buf) != -1 );
// print the time of execution
System.out.println("Time reading using BufferedReader with FileReader : "+ (System.currentTimeMillis()-startTime) + " ms" );
long startTime2 = System.currentTimeMillis();
while( isr.read(buf) != -1 );
System.out.println("Time reading using InputStreamReader with BufferedInputStream et FileInputStream : " + (System.currentTimeMillis() - startTime2 + " ms" ));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(bis != null)
bis.close();
if(isr != null)
isr.close();
if(br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
结果
Time reading using BufferedReader with FileReader : 31 ms
Time reading using InputStreamReader with BufferedInputStream et FileInputStream : 32 ms
如您所见,结果相差 1 毫秒。 BufferedReader
更快。
在 Java 8 中,你最好使用 NIO
包而不是 IO
。所以 FileChannels
会更有效率。
此类问题已回答:
根据其他人的一些意见,我得出结论:
在我的情况下,在另一个缓冲中使用缓冲是不行的。没用。