2015-07-02 61 views
1

讀我要讀Java中的文本文件,我使用下面的代碼:完整的文件在一次使用掃描儀中的Java

Scanner scanner = new Scanner(new InputStreamReader(
    ClassLoader.getSystemResourceAsStream("mock_test_data/MyFile.txt"))); 

scanner.useDelimiter("\\Z"); 
String content = scanner.next(); 
scanner.close(); 

據我所知StringMAX_LENGTH 2^31-1

但是,此代碼僅從輸入 文件(MyFile.txt)中讀取前1024個字符。

我無法找到原因。

使用 BufferedReader
+0

少數的可能會發現這是重複的問題,但這些問題不會對我的問題給出答案,主要的原因是,我要讀完整的文件一次,沒有任何循環。 – proudandhonour

+0

這是掃描儀的不當使用,使用字節流並讀取尺寸適當的緩衝區。無論如何,在內存中獲取文件並不是一個好習慣 – fantarama

+0

我已經嘗試過以及FileInputStream,但是該FileInputStream無法爲我讀取文件。 – proudandhonour

回答

1

謝謝您的回答:

最後我找到了解決方案公司招聘

String path = new File("src/mock_test_data/MyFile.txt").getAbsolutePath(); 
File file = new File(path); 
FileInputStream fis = null; 
fis = new FileInputStream(file); 
byte[] data = new byte[(int) file.length()]; 
fis.read(data); 
fis.close(); 
content = new String(data, "UTF-8"); 

由於我要讀一個很長的文件一次。

1

例如,對於大文件的偉大工程:

public String getFileStream(final String inputFile) { 
     String result = ""; 
     Scanner s = null; 

     try { 
      s = new Scanner(new BufferedReader(new FileReader(inputFile))); 
      while (s.hasNext()) { 
       result = result + s.nextLine(); 
      } 
     } catch (final IOException ex) { 
      ex.printStackTrace(); 
     } finally { 
      if (s != null) { 
       s.close(); 
      } 
     } 
     return result; 
} 

FileInputStream用於較小的文件。

使用readAllBytes並對它們進行編碼也解決了問題。

static String readFile(String path, Charset encoding) 
    throws IOException 
{ 
    byte[] encoded = Files.readAllBytes(Paths.get(path)); 
    return new String(encoded, encoding); 
} 

你可以看看this的問題。這很棒。

+0

@proudandhonour使用BufferedReader可以讀取非常大的文件,FileInputStream適用於較小的文件。 – Aleksandar

+0

感謝Aleksandar,通過您的評論我找到了解決方案。 – proudandhonour

+0

答案並未爲您提供解決方案?好。很高興提供幫助,即使沒有投票:-) – Aleksandar

1

我讀過一些評論,因此我認爲有必要指出,這個答案並不關心好的或不好的做法。對於那些需要快速解決方案的懶惰人來說,這是一個愚蠢的,很好認識的掃描器技巧。

final String res = "mock_test_data/MyFile.txt"; 

String content = new Scanner(ClassLoader.getSystemResourceAsStream(res)) 
    .useDelimiter("\\A").next(); 

被盜從here...

+0

您能否提供一些更好的解決方案? – proudandhonour

+0

你的問題根本沒有提到任何性能要求。你想要一個完全讀取文件/流的解決方案......在這裏,你去。我不會對性能做任何假設,因爲有許多因素超出了某些文件讀取的範圍。此外,單憑表演就毫無意義。例如還有可讀性。 –