如何在java中获取文件内容?
Posted
技术标签:
【中文标题】如何在java中获取文件内容?【英文标题】:How to get file content in java? 【发布时间】:2011-08-04 05:00:18 【问题描述】:为了获取 txt 文件的内容,我通常使用扫描仪并遍历每一行以获取内容:
Scanner sc = new Scanner(new File("file.txt"));
while(sc.hasNextLine())
String str = sc.nextLine();
java api 是否提供了一种通过一行代码获取内容的方法,例如:
String content = FileUtils.readFileToString(new File("file.txt"))
【问题讨论】:
【参考方案1】:经过一番测试,我发现BufferedReader
和Scanner
在各种情况下都有问题(前者经常检测不到新行,而后者经常去除空格,例如,从 org.json 库)。还有其他可用的方法,但问题是它们仅在某些 Java 版本之后才受支持(例如,这对 android 开发人员不利),并且您可能不想仅出于这样的单一目的使用 Guava 或 Apache 公共库。因此,我的解决方案是将整个文件读取为字节并将其转换为字符串。下面的代码取自我的一个爱好项目:
/**
* Get byte array from an InputStream most efficiently.
* Taken from sun.misc.IOUtils
* @param is InputStream
* @param length Length of the buffer, -1 to read the whole stream
* @param readAll Whether to read the whole stream
* @return Desired byte array
* @throws IOException If maximum capacity exceeded.
*/
public static byte[] readFully(InputStream is, int length, boolean readAll)
throws IOException
byte[] output = ;
if (length == -1) length = Integer.MAX_VALUE;
int pos = 0;
while (pos < length)
int bytesToRead;
if (pos >= output.length)
bytesToRead = Math.min(length - pos, output.length + 1024);
if (output.length < pos + bytesToRead)
output = Arrays.copyOf(output, pos + bytesToRead);
else
bytesToRead = output.length - pos;
int cc = is.read(output, pos, bytesToRead);
if (cc < 0)
if (readAll && length != Integer.MAX_VALUE)
throw new EOFException("Detect premature EOF");
else
if (output.length != pos)
output = Arrays.copyOf(output, pos);
break;
pos += cc;
return output;
/**
* Read the full content of a file.
* @param file The file to be read
* @param emptyValue Empty value if no content has found
* @return File content as string
*/
@NonNull
public static String getFileContent(@NonNull File file, @NonNull String emptyValue)
if (file.isDirectory()) return emptyValue;
try
return new String(readFully(new FileInputStream(file), -1, true), Charset.defaultCharset());
catch (IOException e)
e.printStackTrace();
return emptyValue;
您可以简单地使用getFileContent(file, "")
来读取文件的内容。
【讨论】:
【参考方案2】:您可以将 FileReader 类与 BufferedReader 一起使用来读取文本文件。
File fileToRead = new File("file.txt");
try( FileReader fileStream = new FileReader( fileToRead );
BufferedReader bufferedReader = new BufferedReader( fileStream ) )
String line = null;
while( (line = bufferedReader.readLine()) != null )
//do something with line
catch ( FileNotFoundException ex )
//exception Handling
catch ( IOException ex )
//exception Handling
【讨论】:
【参考方案3】:不是内置 API - 但Guava 确实如此,除此之外还有其他宝藏。 (这是一个很棒的图书馆。)
String content = Files.toString(new File("file.txt"), Charsets.UTF_8);
有类似的方法可以读取任何Readable,或将二进制文件的全部内容加载为字节数组,或将文件读入字符串列表等。
请注意,此方法现已弃用。新的等价物是:
String content = Files.asCharSource(new File("file.txt"), Charsets.UTF_8).read();
【讨论】:
Files#toString 已弃用。文档状态:Prefer @code asCharSource(file, charset).read(). This method is scheduled to be removed in January 2019.
【参考方案4】:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public static void main(String[] args) throws IOException
String content = Files.readString(Paths.get("foo"));
来自https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Files.html#readString(java.nio.file.Path)
【讨论】:
Files.readString()
在 Java 11 中让它变得更加简单。【参考方案5】:
对于 Java 7,有一个类似的 API。
Files.readAllLines(Path path, Charset cs)
【讨论】:
链接好像失效了。 已更新固定链接。 酷,您也可以使用 readAllBytes() 并在没有任何第三方库的情况下执行以下一行: String content = new String (Files.readAllBytes(new File("/my/file.txt" )).toPath()))【参考方案6】:commons-io 有:
IOUtils.toString(new FileReader("file.txt"), "utf-8");
【讨论】:
以上是关于如何在java中获取文件内容?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AMP 中创建类似 Bootstrap 的可折叠文件?