Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐字符快速读取文本文件(java)_Java_File - Fatal编程技术网

逐字符快速读取文本文件(java)

逐字符快速读取文本文件(java),java,file,Java,File,对不起我的英语。我尝试逐字符读取真正快速的大尺寸文本文件(不使用readLine()),但尚未获得。我的代码: for(int i = 0; (i = textReader.read()) != -1; ) { char character = (char) i; } 它读取1GB的文本文件56666ms,如何读取速度更快 UDP 其方法读取1GB文件28833ms FileInputStream fIn = null; FileChan

对不起我的英语。我尝试逐字符读取真正快速的大尺寸文本文件(不使用readLine()),但尚未获得。我的代码:

for(int i = 0; (i = textReader.read()) != -1; ) {
            char character = (char) i;
        }
它读取1GB的文本文件
56666ms
,如何读取速度更快

UDP

其方法读取1GB文件28833ms

FileInputStream fIn = null;
        FileChannel fChan = null;
        ByteBuffer mBuf;
        int count;

        try {
            fIn = new FileInputStream(textReader);
            fChan = fIn.getChannel();
            mBuf = ByteBuffer.allocate(128);

            do {
                count = fChan.read(mBuf);

                if(count != -1) {
                    mBuf.rewind();

                    for(int i = 0; i < count; i++) {
                        char c = (char)mBuf.get();
                    }
                }

            } while(count != -1);

        }catch(Exception e) {

        }
FileInputStream fIn=null;
FileChannel fChan=null;
ByteBuffer-mBuf;
整数计数;
试一试{
fIn=新文件输入流(文本阅读器);
fChan=fIn.getChannel();
mBuf=字节缓冲分配(128);
做{
计数=fChan.read(mBuf);
如果(计数!=-1){
mBuf.倒带();
for(int i=0;i
读取输入的最快方法是使用缓冲区。下面是一个具有内部缓冲区的类的示例

class Parser
{
   final private int BUFFER_SIZE = 1 << 16;
   private DataInputStream din;
   private byte[] buffer;
   private int bufferPointer, bytesRead;

   public Parser(InputStream in)
   {
      din = new DataInputStream(in);
      buffer = new byte[BUFFER_SIZE];
      bufferPointer = bytesRead = 0;
   }

   public int nextInt() throws Exception
   {
      int ret = 0;
      byte c = read();
      while (c <= ' ') c = read();
      //boolean neg = c == '-';
      //if (neg) c = read();
      do
      {
         ret = ret * 10 + c - '0';
         c = read();
      } while (c > ' ');
      //if (neg) return -ret;
      return ret;
   }

   private void fillBuffer() throws Exception
   {
      bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
      if (bytesRead == -1) buffer[0] = -1;
   }

   private byte read() throws Exception
   {
      if (bufferPointer == bytesRead) fillBuffer();
      return buffer[bufferPointer++];
   }
}
此代码在7782ms内读取250mb

免责声明: 这段代码不是我的,它已经被用户“Kamalakannan CM”发布为CodeChef上一个问题的解决方案。

我会使用它,它读起来是缓冲的。简短的示例:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.CharBuffer;

public class Main {
    public static void main(String... args) {
        try (FileReader fr = new FileReader("a.txt")) {
            try (BufferedReader reader = new BufferedReader(fr)) {
                 CharBuffer charBuffer = CharBuffer.allocate(8192);
                 reader.read(charBuffer);
            } catch (IOException e) {
                 e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
           e.printStackTrace();
        } catch (IOException e) {
           e.printStackTrace();
        }
   }
}
默认构造函数使用默认缓冲区大小8192。如果您想使用不同的缓冲区大小,可以使用构造函数。或者,您可以在阵列缓冲区中读取:

 ....
 char[] buffer = new char[255];
 reader.read(buffer);
 ....
或一次读取一个字符:

int char = reader.read();

您必须在codechef上注册并解决一个问题,这样才能看到代码
int char = reader.read();