读取包含单个文件的大文件的最佳方法
  我为具有单行字符串和多行字符串的Reading文件做了一个小实验。  单线文件长度为198890,多线文件长度为208890。  我用以下六种方法测试了它们,并获得了它们读取的时间和字符串长度。  这里我提到了测试方法,结果和实现。 
  我的实际考虑是阅读一个包含单行文本的大文件。  根据结果,它看起来像IO utils比其他人好。 
  那么,除了我在下面实现的方法(如果有的话)之外,我可以使用的最佳方式是什么。 
结果:(时间以秒为单位,0表示小于1秒))
iOTest(). : Single Line Test...
singleStr.txt is deleted!
writeToFile().198890 lenghted String wrote to the file
[ReadWithBufferedReaderByLine] Text length: 198890, Total time: 18
[ReadWithBufferedReaderToCharArray] Text length: 204800, Total time: 8
[ReadWithStreamToByteArray] Text length: 198890, Total time: 8
[ReadWithStreamToByteArrayChunks] Text length: 1950, Total time: 1
[ReadFromApacheFileUtils] Text length: 198890, Total time: 30
[ReadFromApacheIOUtils] Text length: 198890, Total time: 1
iOTest(). : Multi Line Test...
multiStr.txt is deleted!
writeToFile().208890 lenghted String wrote to the file
[ReadWithBufferedReaderByLine] Text length: 198890, Total time: 15
[ReadWithBufferedReaderToCharArray] Text length: 212992, Total time: 2
[ReadWithStreamToByteArray] Text length: 208890, Total time: 1
[ReadWithStreamToByteArrayChunks] Text length: 2040, Total time: 2
[ReadFromApacheFileUtils] Text length: 208890, Total time: 0
[ReadFromApacheIOUtils] Text length: 208890, Total time: 1
测试方法 :
public void iOTester(){
        System.out.println("niOTester(). : Single Line Test...");
        String testStr = "";
        for(int i = 0; i < 10000; i++)  testStr += "[Namal"+i+"Fernando] ";
        writeToFile("singleStr.txt", testStr);
        readWithBufferedReaderByLine("singleStr.txt");
        readWithBufferedReaderToCharArray("singleStr.txt");
        readWithStreamToByteArray("singleStr.txt");
        readWithStreamToByteArrayChunks("singleStr.txt");
        readFromApacheFileUtils("singleStr.txt");
        readFromApacheIOUtils("singleStr.txt");
        System.out.println("niOTester(). : Multi Line Test...");
        testStr = "";
        for(int i = 0; i < 10000; i++) testStr += "[Namal"+i+"Fernando] n";
        writeToFile("multiStr.txt", testStr);
        readWithBufferedReaderByLine("multiStr.txt");
        readWithBufferedReaderToCharArray("multiStr.txt");
        readWithStreamToByteArray("multiStr.txt");
        readWithStreamToByteArrayChunks("multiStr.txt");
        readFromApacheFileUtils("multiStr.txt");
        readFromApacheIOUtils("multiStr.txt");
    }
实现:
方法1:(ReadWithBufferedReaderByLine)
BufferedReader  br          = new BufferedReader(new 
FileReader(file));
String          line        = null;
StringBuilder   sb          = new StringBuilder();
while ((line = br.readLine()) != null) {
    sb.append(line);
}
String          text        = sb.toString();
方法2:(ReadWithBufferedReaderToCharArray)
BufferedReader  br              = new BufferedReader(new 
FileReader(file));
StringBuilder   sb          = new StringBuilder();
char[]          chars       = new char[8192];
for(int len; (len = br.read(chars)) > 0;) {
    sb.append(String.valueOf(chars));
}
String          text        = sb.toString();
方法3:(ReadWithStreamToByteArray)
InputStream     is          = new FileInputStream(file);
byte[]          b       = new byte[is.available()];
is.read(b);
String          text        = new String(b);
方法4:(ReadWithStreamToByteArrayChunks)
InputStream     is          = new FileInputStream(file);
byte[]          b       = new byte[1024];
StringBuilder   sb          = new StringBuilder();
int read;
while((read = is.read(b)) != -1){
    sb.append(String.valueOf(b));
}
String          text        = sb.toString();
方法5:(ReadFromApacheFileUtils)
String text  = new String(FileUtils.readFileToByteArray(new File(filePath)));
方法6:(ReadFromApacheIOUtils)
String text = new String(IOUtils.toByteArray(new FileInputStream(filePath)));
参考:
你也可以测试这个方法
String text = new String(Files.readAllBytes(Paths.get(path)));
还有带有直接缓冲区的FileChannel
    FileChannel fc = FileChannel.open(path);
    ByteBuffer buf = ByteBuffer.allocateDirect((int)fc.size());
    fc.read(buf);
上一篇: Best way to read a large file containing a single
下一篇: GHC GC'ing sparks
