それを機能させるには、現在のパーセンテージを前回の反復からのパーセンテージと照合する必要があります。うまく機能させるには、行数ではなくバイト数でパーセンテージを計算する必要があります。
バイトを使用すると、次のことができます。
- ファイルを 2 回ロード/読み取りしないようにします。これにより、実行時間がほぼ2 倍になります。
- 各行に読み取られた実際のバイト数を使用して、より正確なパーセンテージを提供します (1 つの大きな行が 100 の小さな行としてカウントされるなど)。
これを 100MB のファイルで実行し、実行時間を調べます。
(最初の方法は JVM ウォームアップも行っていることに注意してください)
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Date;
public class FilePercentageTest {
public static void main(String[] args) throws java.lang.Exception {
File file = new File("D:/test.txt");
showPercentageByBytes(file);
showPercentageByLines(file);
}
private static void showPercentageByBytes(File file) throws Exception{
long start = new Date().getTime();
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "UTF-8"));
long totalBytes = file.length();
long bytesRead = 0;
int previousPercent = 0;
String line = reader.readLine();
while (line != null) {
bytesRead+=line.length();
int percent = (int)(bytesRead * 100 / totalBytes);
if (previousPercent<percent){
System.out.println(percent + "% read.");
previousPercent = percent;
}
line = reader.readLine();
}
long end = new Date().getTime();
System.out.println(end - start + " milliseconds ");
}
private static void showPercentageByLines(File file) throws Exception{
long start = new Date().getTime();
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "UTF-8"));
String line = reader.readLine();
BufferedReader reader2 = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "UTF-8"));
int totalLines = 0;
int previousPercent = 0;
while (reader2.readLine() != null) {
totalLines++;
}
int lineNumber = 1;
while (line != null) {
int percent = lineNumber * 100 / totalLines;
if (previousPercent<percent){
System.out.println(percent + "% read.");
previousPercent = percent;
}
line = reader.readLine();
lineNumber++;
}
long end = new Date().getTime();
System.out.println(end - start + " milliseconds ");
}
}