我正在尝试阅读包含大约1000条很长行的文本文件。整个文件大约1.4MB。 我正在使用BufferedReader的readLine方法来读取文件。发生的事情是在控制台上打印输出需要8-10秒。我尝试使用PHP的fgets相同,它在眨眼间打印所有相同的行!这怎么可能? 以下是我正在使用的代码
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ClickLogDataImporter {
public static void main(String [] args) {
try {
new ClickLogDataImporter().getFileData();
} catch (Exception ex) {
Logger.getLogger(ClickLogDataImporter.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void getFileData() throws FileNotFoundException, IOException {
String path = "/home/shantanu/Documents";
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(path+"/sample.txt")));
String line = "";
while((line = (br.readLine())) != null) {
System.out.println(line);
}
}
}
PHP代码
<?php
$fileName = "/home/shantanu/Documents/sample.txt";
$file = fopen($fileName, 'r');
while(($line = fgets($file)) != false) {
echo $line."\n";
}
?>
请告诉我这个问题
答案 0 :(得分:0)
我不确定,但我认为PHP只是根据您使用的方法打印文件,Java读取文件并从中获取每一行,这意味着检查每个字符的断路器,该过程似乎不是完全一样。
string file_get_contents
如果您尝试使用PHP从文件中逐个打印每一行,它应该更慢。
答案 1 :(得分:0)
该代码的8秒声音很多对我来说太长了。老实说,我怀疑其他事情正在发生。你确定它不是控制台输出需要很长时间吗?
我建议你计算时间(例如System.nanoTime
)写出最后的总时间,但是最小化控制台运行它。我怀疑你会发现它足够快。
答案 2 :(得分:0)
这不仅仅是控制台输出很慢吗?既然您知道您的文件已正确阅读,请尝试注释掉System.out.println(line);
行。
答案 3 :(得分:0)
file_get_contents将所有文件内容加载到String中,您正在阅读并逐行打印Java代码。 如果您在像Eclipse这样的IDE内部进行测试,则控制台输出可能非常慢。 如果你想要file_get_contents的确切行为,你可以使用这个脏代码:
File f = new File(path, "sample.txt");
ByteArrayOutputStream bos = new ByteArrayOutputStream(new Long(Math.min(Integer.MAX_VALUE, f.length())).intValue());
FileInputStream fis = new FileInputStream(f);
byte[] buf = new byte[1024 * 8];
int size;
while((size = fis.read(buf)) > 0) {
bos.write(buf, 0, size);
}
fis.close();
bos.close();
System.out.println(new String(bos.toByteArray()));
答案 4 :(得分:0)
如果您使用readline,那么它将为每行读取文件1000次。尝试使用读取功能,使用非常大的缓冲区,超过28000左右。然后它将读取一个文件,总共60次,1.4 MB,远小于1000.如果你使用1000的小缓冲区,那么它将读取1300左右的文件或甚至比1000慢的东西(readline) 。同时打印线条时使用print而不是println,因为线条不是精确的线条而是字符数组。
答案 5 :(得分:-1)
读者通常很慢,你应该尝试快速的Stream阅读器。并确保FIlE开放过程不花时间。如果打开文件并创建流对象然后测量时间,那么您可以确切地知道它是由于文件打开问题或读取文件问题。确保在此操作时系统负载不高,否则测量将变坏。
BufferedInputStream reader=new BufferedInputStream(new FileInputStream("/home/shantanu/Documents/sample.txt"));
byte[] line=new byte[1024];
while(reader.read(line)>0) {
System.out.println(new String(line));
}