使用java中的扫描仪一次性完成文件读取

使用java中的扫描仪一次性完成文件读取,java,java.util.scanner,Java,Java.util.scanner,我必须阅读Java中的文本文件,为此我使用以下代码: Scanner scanner = new Scanner(new InputStreamReader( ClassLoader.getSystemResourceAsStream("mock_test_data/MyFile.txt"))); scanner.useDelimiter("\\Z"); String content = scanner.next(); scanner.close(); 据我所知,String具有MA

我必须阅读Java中的文本文件,为此我使用以下代码:

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

scanner.useDelimiter("\\Z");
String content = scanner.next();
scanner.close();
据我所知,
String
具有
MAX_LENGTH 2^31-1

但此代码仅读取输入的前1024个字符 文件(MyFile.txt)


我找不到原因。

使用
BufferedReader
的示例非常适合大文件:

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);
}

你们可以看看这个问题。非常好。

谢谢您的回答:

我终于找到了解决这个问题的办法-

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

因为我必须立即阅读一个很长的文件。

我已经阅读了一些评论,因此我认为有必要指出,这个答案并不关心好的或坏的做法。对于需要快速解决方案的懒人来说,这是一个愚蠢的、很好理解的扫描技巧

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

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

偷来的,很少有人会发现这是一个重复的问题,但这些问题并不能回答我的问题,主要原因是我必须一次读取完整的文件,没有任何循环。这是对扫描仪的不当使用,使用ByTestStream并在大小合适的缓冲区中读取。无论如何,在内存中获取文件不是一个好做法。我也尝试过通过FileInputStream获取文件,但在该文件中,FileInputStream无法为我读取文件。什么是“无法读取文件”?发布异常或代码。谢谢你的帮助fantarama,我已经找到了答案。我也发布了此内容。@ProudandHonor使用BufferedReader,您可以读取非常大的文件,而FileInputStream则用于较小的文件。谢谢Aleksandar,通过使用您的评论,我找到了解决方案。答案没有提供解决方案吗?好啊很高兴为您提供帮助,即使未经表决:-)请您提供一些更好的解决方案,这也会影响性能。您的问题根本没有提到任何性能要求。您想要一个完全读取文件/流的解决方案。。。干得好。我不会对性能做任何假设,因为有许多因素远远超出了在文件中读取某些行的范围。除此之外,单凭表演一点意义都没有。例如,还有可读性。