什么是最简单的方法来读取文件到string?

我正在尝试读取一个简单的文本文件到一个string。 当然,通常的方法是获取inputstream并使用readLine()进行迭代并将内容读入String。

过去做了这么多次,我只是想知道如何在最less的代码行中做到这一点? 在Java中没有像String fileContents = XXX.readFile(myFile/*File*/) ..有什么东西看起来这么简单?

我知道有像Apache Commons IO这样的库提供这样的简化,甚至我可以写一个简单的Util类来做到这一点。 但是我想知道的是 – 这是一个非常频繁的操作,每个人都需要为什么不提供这样简单的function? 是不是真的有一个单一的方法来读取文件到string与一些默认或指定的编码?

是的,你可以在一行中做到这一点(虽然对于强壮的IOException处理你不会想)。

 String content = new Scanner(new File("filename")).useDelimiter("\\Z").next(); System.out.println(content); 

这使用一个java.util.Scanner ,告诉它用\Z来定界input,这是string定位的结尾。 这最终使得input有一个实际的令牌,这是整个文件,所以它可以通过一次调用next()来读取。

有一个构造函数需要一个File和一个String charSetName (在许多其他的重载)。 这两个构造函数可能会抛出FileNotFoundException ,但是和所有Scanner方法一样,除了这些构造函数之外,不会IOExceptionexception。

如果发生IOException您可以通过ioException()方法查询Scanner本身。 读取内容之后,您可能还想明确地close() Scanner ,因此可能将Scanner参考存储在本地variables中是最好的。

也可以看看

  • Java教程 – I / O基础知识 – 扫描和格式化

相关问题

  • 使用java.util.Scannervalidationinput – 有许多更典型用法的例子

第三方库选项

为了完整起见,如果你有这些非常有名的和非常有用的第三方库,这些是非常好的select:

番石榴

com.google.common.io.Files包含许多有用的方法。 这里相关的是:

  • String toString(File, Charset)
    • 使用给定的字符集,将文件中的所有字符读入String
  • List<String> readLines(File, Charset)
    • …将文件中的所有行读取到List<String> ,每行一个条目

Apache Commons / IO

org.apache.commons.io.IOUtils也提供类似的function:

  • String toString(InputStream, String encoding)
    • 使用指定的字符编码,将InputStream的内容作为String
  • List readLines(InputStream, String encoding)
    • …作为(原始) String List ,每行一个条目

相关问题

  • 最有用的免费第三方Java库(删除)?

从Java 7 (API描述)开始,您可以执行:

new String(Files.readAllBytes(Paths.get(filePath)));

其中filePath是表示要加载的文件的string。

你可以使用apache的commons IO ..

 FileInputStream fisTargetFile = new FileInputStream(new File("test.txt")); String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8"); 

这应该为你工作:

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public static void main(String[] args) throws IOException { String content = new String(Files.readAllBytes(Paths.get("abc.java"))); } 

使用Apache Commons IO 。

 import org.apache.commons.io.FileUtils; //... String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8") 

你可以看到de javadoc的细节方法 。

不要写你自己的util类来做到这一点 – 我会build议使用番石榴 ,这是充满了各种善良。 在这种情况下,你会想要Files类(如果你真的只是读文件)或CharStreams更通用的阅读。 它有方法来读取数据到一个string列表( readLines )或完全( toString )。

它也有类似的二进制数据的有用的方法。 然后还有图书馆的其他部分

我同意这很烦人,标准库中没有任何类似的东西。 哎呀,只是能够提供一个文件CharSet将使生活更简单…

另一种替代方法是:

如何从文件内容创buildJavastring?

其他的select是使用提供开源库的实用程序
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

为什么java不提供这样一个常见的util API?
a)保持API通用,以便编程,缓冲等由程序员处理。
b)让程序员做一些工作,写/共享opensource util库:D 😉

可悲的是,不。

我同意这种频繁的操作应该比逐行循环复制input行更容易实现,但是你必须写辅助方法或使用外部库。

我发现接受的答案实际上并不总是有效,因为\\Z可能出现在文件中。 另一个问题是,如果你没有正确的字符集,可能会发生一大堆意外的事情,这可能会导致扫描器只读取文件的一部分。

 String content = new Scanner(new File("filename")).useDelimiter("\\Z").next(); System.out.println(content); 

因此,我提出了一个小小的调整,但仍然无法正常工作,但在这些情况下至less会抛出Exception:

 final String CHARSET = "UTF-8"; final String DELIMITER = "Some text that is unlikely to occur in the file"; File file = new File("filename") Scanner scanner = new Scanner(file,CHARSET).useDelimiter(DELIMITER); String content = null; if (scanner.hasNext()) content = scanner.next(); if (scanner.hasNext()) throw new IllegalStateException("DELIMITER occurs in file. Use a different delimiter"); if (file.length() != content.getBytes(CHARSET).length) throw new IllegalStateException("Inconsistent file lengths. Probably a charset related problem."); System.out.println(content); 

下面是将文件内容读入string的简单代码

  try { String line; File file = new File("C:/LEO/abc.txt"); FileReader fr = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fr); HashMap< String, Integer> objHashMap = new HashMap<>(); while((line = bufferedReader.readLine()) != null) { String lineWords[] = line.split(" "); for(String singleWord:lineWords) { System.out.println(singleWord); } } for(String keyObject:objHashMap.keySet()) { System.out.println(keyObject + ": " + objHashMap.get(keyObject)); } } catch(Exception exception) { System.out.println("IOException occured"); exception.printStackTrace(); }