Java:将文本文件输出到控制台
我正试图用Java将文本文件输出到控制台。我想知道这样做最有效的方法是什么 我研究了几种方法,但很难确定哪种方法对性能影响最小 将文本文件输出到控制台需要读取文件中的每一行,然后将其写入控制台 是否最好使用:Java:将文本文件输出到控制台,java,file-io,console,bufferedreader,Java,File Io,Console,Bufferedreader,我正试图用Java将文本文件输出到控制台。我想知道这样做最有效的方法是什么 我研究了几种方法,但很难确定哪种方法对性能影响最小 将文本文件输出到控制台需要读取文件中的每一行,然后将其写入控制台 是否最好使用: 带文件读取器的缓冲读取器,在线读取并执行一系列system.out.println调用 BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); while (in.readLine() != null)
BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\"));
while (in.readLine() != null) {
System.out.println(blah blah blah);
}
in.close();
while (scanner.hasNextLine()) {
System.out.println(blah blah blah);
}
谢谢。如果您只想在控制台上打印文件内容(不想打印下一个int/double/etc),则可以使用
BufferedReader
但是,您的代码不会产生您想要的结果。请尝试以下方法:
BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\log001.txt"));
String line = in.readLine();
while(line != null)
{
System.out.println(line);
line = in.readLine();
}
in.close();
我不会对此太挂断电话,因为主要的瓶颈很可能是控制台打印Java发送的信息的能力。如果您对文本文件包含的基于字符的数据不感兴趣,只需将其以字节的形式“原始”流式传输即可
InputStream input = new BufferedInputStream(new FileInputStream("C:/logs.txt"));
byte[] buffer = new byte[8192];
try {
for (int length = 0; (length = input.read(buffer)) != -1;) {
System.out.write(buffer, 0, length);
}
} finally {
input.close();
}
这节省了字节和字符之间不必要的信息处理,以及在换行符上扫描和拆分并再次追加它们的成本
至于表演,你可能会觉得有趣。根据这篇文章,使用256K字节数组的a是最快的方法,该数组通过一个包装的文件读取,并直接从字节数组写入
FileInputStream input = new FileInputStream("C:/logs.txt");
FileChannel channel = input.getChannel();
byte[] buffer = new byte[256 * 1024];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
try {
for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
System.out.write(buffer, 0, length);
byteBuffer.clear();
}
} finally {
input.close();
}
如果您只想最有效地将文件内容转储到控制台,而中间不进行任何处理,那么将数据转换为字符并查找换行符是不必要的开销。相反,您可以从文件中读取字节块,然后直接写入
System.out
:
package toconsole;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class Main {
public static void main(String[] args) {
BufferedInputStream bis = null;
byte[] buffer = new byte[8192];
int bytesRead = 0;
try {
bis = new BufferedInputStream(new FileInputStream(args[0]));
while ((bytesRead = bis.read(buffer)) != -1) {
System.out.write(buffer, /* start */ 0, /* length */ bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try { bis.close(); } catch (Exception e) { /* meh */ }
}
}
}
如果您以前没有遇到过这种习惯用法,while条件中的语句都会将bis.read的结果赋值给bytesRead,然后将其与-1进行比较。因此,我们不断地将字节读入缓冲区,直到我们被告知文件已经结束。我们使用bytesRead-in-System.out.write来确保只写入刚才读取的字节,因为我们不能假设所有文件的长度都是8KB的倍数 如果它是一个相对较小的文件,一种单行Java 7+方法是:
System.out.println(new String(Files.readAllBytes(Paths.get("logs.txt"))));
有关更多详细信息,请参阅
干杯 对于Java 11,您可以使用更方便的方法:
FileInputStream input = new FileInputStream("D:\\Java\\output.txt");
FileChannel channel = input.getChannel();
byte[] buffer = new byte[256 * 1024];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
try {
for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
System.out.write(buffer, 0, length);
byteBuffer.clear();
}
} finally {
input.close();
}
Path temp = Files.move
(Paths.get("D:\\\\Java\\\\output.txt"),
Paths.get("E:\\find\\output.txt"));
if(temp != null)
{
System.out.println("File renamed and moved successfully");
}
else
{
System.out.println("Failed to move the file");
}
}
Files.copy(Path.of("file.txt"), System.out);
或要获得更快的输出:
var out = new BufferedOutputStream(System.out);
Files.copy(Path.of("file.txt"), out);
out.flush();
在路径名中应该使用斜杠(
/
)。Java将把它转换为操作系统特定的分隔符。这正是我想要的,谢谢!:)如果文件和输出目标使用不同的字符编码,则传输原始的“是”将产生奇怪的结果(似乎已中断)。@Raedwald:没错。这不再是服务器的错误(前提是头是正确的),而是客户端的错误,因此通常更容易修复。