Java读取文件到字符串

时间:2020-02-23 14:36:47  来源:igfitidea点击:

有时在处理文件时,我们需要将文件读取为Java中的String。
今天,我们将研究使用Java将文件读取为String的各种方法。

Java读取文件到字符串

在Java中,有很多方法可以将文件读取为String。
在本教程中,我们将探索以下方式。

  • Java使用BufferedReader将文件读取为String
  • 使用FileInputStream在Java中将文件读取为String
  • Java使用Files类将文件读取为字符串
  • 使用Scanner类将文件读取到String
  • Java使用Apache Commons IO FileUtils类将文件读取为字符串

现在,让我们研究这些类,然后将文件读取到String。

Java使用BufferedReader将文件读取为String

我们可以使用BufferedReader的readLine方法逐行读取文件。
我们要做的就是将这些附加到带有换行符的StringBuilder对象上。
下面是使用BufferedReader将文件读取为String的代码片段。

BufferedReader reader = new BufferedReader(new FileReader(fileName));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
String ls = System.getProperty("line.separator");
while ((line = reader.readLine()) != null) {
	stringBuilder.append(line);
	stringBuilder.append(ls);
}
//delete the last new line separator
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
reader.close();

String content = stringBuilder.toString();

还有一种使用BufferedReader和char数组将文件读取到String的有效方法。

BufferedReader reader = new BufferedReader(new FileReader(fileName));
StringBuilder stringBuilder = new StringBuilder();
char[] buffer = new char[10];
while (reader.read(buffer) != -1) {
	stringBuilder.append(new String(buffer));
	buffer = new char[10];
}
reader.close();

String content = stringBuilder.toString();

使用FileInputStream在Java中将文件读取为String

我们可以使用FileInputStream和字节数组将文件读取为String。
您应该使用此方法读取非基于字符的文件,例如图像,视频等。

FileInputStream fis = new FileInputStream(fileName);
byte[] buffer = new byte[10];
StringBuilder sb = new StringBuilder();
while (fis.read(buffer) != -1) {
	sb.append(new String(buffer));
	buffer = new byte[10];
}
fis.close();

String content = sb.toString();

Java使用Files类将文件读取为字符串

我们可以使用Files实用程序类将所有文件内容读取为一行代码。

String content = new String(Files.readAllBytes(Paths.get(fileName)));

使用Scanner类将文件读取为String

扫描程序类是一种将文本文件读取为Java中字符串的快速方法。

Scanner scanner = new Scanner(Paths.get(fileName), StandardCharsets.UTF_8.name());
String content = scanner.useDelimiter("\A").next();
scanner.close();

Java使用Apache Commons IO FileUtils类将文件读取为字符串

如果您在项目中使用Apache Commons IO,那么这是一种将文件读取为Java中字符串的简单快捷方法。

String content = FileUtils.readFileToString(new File(fileName), StandardCharsets.UTF_8);

Java读取文件到字符串的例子

这是具有适当异常处理的最终程序,该程序显示了将文件读取为字符串的所有不同方式。

package com.theitroad.files;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

import org.apache.commons.io.FileUtils;

public class JavaReadFileToString {

	/**
	 * This class shows different ways to read complete file contents to String
	 * 
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) {
		String fileName = "/Users/hyman/Downloads/myfile.txt";

		String contents = readUsingScanner(fileName);
		System.out.println("*Read File to String Using Scanner*\n" + contents);

		contents = readUsingApacheCommonsIO(fileName);
		System.out.println("*Read File to String Using Apache Commons IO FileUtils*\n" + contents);

		contents = readUsingFiles(fileName);
		System.out.println("*Read File to String Using Files Class*\n" + contents);

		contents = readUsingBufferedReader(fileName);
		System.out.println("*Read File to String Using BufferedReader*\n" + contents);

		contents = readUsingBufferedReaderCharArray(fileName);
		System.out.println("*Read File to String Using BufferedReader and char array*\n" + contents);

		contents = readUsingFileInputStream(fileName);
		System.out.println("*Read File to String Using FileInputStream*\n" + contents);

	}

	private static String readUsingBufferedReaderCharArray(String fileName) {
		BufferedReader reader = null;
		StringBuilder stringBuilder = new StringBuilder();
		char[] buffer = new char[10];
		try {
			reader = new BufferedReader(new FileReader(fileName));
			while (reader.read(buffer) != -1) {
				stringBuilder.append(new String(buffer));
				buffer = new char[10];
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

		return stringBuilder.toString();
	}

	private static String readUsingFileInputStream(String fileName) {
		FileInputStream fis = null;
		byte[] buffer = new byte[10];
		StringBuilder sb = new StringBuilder();
		try {
			fis = new FileInputStream(fileName);

			while (fis.read(buffer) != -1) {
				sb.append(new String(buffer));
				buffer = new byte[10];
			}
			fis.close();

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fis != null)
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		return sb.toString();
	}

	private static String readUsingBufferedReader(String fileName) {
		BufferedReader reader = null;
		StringBuilder stringBuilder = new StringBuilder();

		try {
			reader = new BufferedReader(new FileReader(fileName));
			String line = null;
			String ls = System.getProperty("line.separator");
			while ((line = reader.readLine()) != null) {
				stringBuilder.append(line);
				stringBuilder.append(ls);
			}
			//delete the last ls
			stringBuilder.deleteCharAt(stringBuilder.length() - 1);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

		return stringBuilder.toString();
	}

	private static String readUsingFiles(String fileName) {
		try {
			return new String(Files.readAllBytes(Paths.get(fileName)));
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	private static String readUsingApacheCommonsIO(String fileName) {
		try {
			return FileUtils.readFileToString(new File(fileName), StandardCharsets.UTF_8);
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	private static String readUsingScanner(String fileName) {
		Scanner scanner = null;
		try {
			scanner = new Scanner(Paths.get(fileName), StandardCharsets.UTF_8.name());
			//we can use Delimiter regex as "\A", "\Z" or "\z"
			String data = scanner.useDelimiter("\A").next();
			return data;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		} finally {
			if (scanner != null)
				scanner.close();
		}

	}

}

您可以使用上述任何一种方式将文件内容读取为java中的字符串。
但是,如果文件太大,则不建议这样做,因为您可能会遇到内存不足的错误。