什么是最简单的方法来读取文件到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
方法一样,除了这些构造函数之外,不会IOException
exception。
如果发生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(); }