2017-04-10 112 views
1

我有一個大的文本文件,我想要閱讀它,當我嘗試做它沒有任何操作,如從該文件中添加一些文本列出它的讀取文件最大爲一分鐘,但是當我嘗試添加一些文本到arrayList和接下來我想做一些操作它太慢了,你知道我怎麼讀取這些數據並使用它? 這是我的代碼:如何閱讀大文本文件,並在Java中使用它

public class ReaderTEst { 
public static void main(String[] args) throws IOException { 
    List<String> graphList = new ArrayList<>(); 
    List<String> edgeList = new ArrayList<>(); 
    FileInputStream inputStream = null; 
    Scanner sc = null; 
    try { 
     inputStream = new FileInputStream("myText.txt"); 
     sc = new Scanner(inputStream, "UTF-8"); 
     while (sc.hasNextLine()) { 
      String line = sc.nextLine(); 
      line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character 
      if (Character.isWhitespace(line.charAt(0))) { 
       edgeList.add(line.trim()); 
      } else { 
       graphList.add(line); 
      } 
     } 
     if (sc.ioException() != null) { 
      throw sc.ioException(); 
     } 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (sc != null) { 
      sc.close(); 
     } 
    } 
} 

} 它需要很多的時間,你知道它是如何可能會更快?我有600 MB 文件TXT當我改變:

List<Integer> graphList = new ArrayList<>(1); 
int i = 0; 
while (sc.hasNextLine()) {`String line = sc.nextLine();` 
     line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character 

      graphList.add(i++); 

    } 

我的作品,但是當我想要把字符串時間太長的時間

回答

0

你的主要問題如下:

List<String> graphList = new ArrayList<>(); 
List<String> edgeList = new ArrayList<>(); 

您應該使用初始容量初始化每個List,以便JVM不需要自動擴展後備陣列。

line = line.replace("\uFEFF", ""); 

這也會減慢你的程序。 \uFEFF每隔多久一次?在嘗試更換之前,我會檢查該行是否包含\uFEFF

除此之外,沒有其他優化;也許你可以利用FileChannel來讀取文件,但這就是它。

1

您應該使用BufferedReader.readLine()。你可以閱讀每秒數百萬行。 Scanner對於你正在做的事情來說是過火。

但是\uFEFF不是文字。這是真的一個文本文件?這是一個BOM標記嗎?在這種情況下,它只會在第一行的開頭:不需要在每行中掃描它。

+0

這是正弦波我使用UTF-8和第一個字符我有奇怪的空字符,所以我儘量只的charAt(0) – grapexs

+0

所以用它它*是一個BOM標記,所以你應該只從第一行刪除它。 – EJP

0

首先我建議使用列表的LinkedList實現,因爲架構特性。因此,ArrayList是建立在數組上的,LinkedList由Nodes組成。 ArrayList創建新的更大的數組,然後將舊的數組複製到新的數組中,然後達到一定的容量。 Oracle有這個完美的文檔,我把它推薦給你LinkedList ArrayList