2015-07-02 21 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

你的问题根本没有提到任何性能要求。你想要一个完全读取文件/流的解决方案......在这里,你去。我不会对性能做任何假设,因为有许多因素超出了某些文件读取的范围。此外,单凭表演就毫无意义。例如还有可读性。 –