讀取文件累加 `line.length()` 約為 `file.length()` 的 85%,差值約 15%。
`BufferedReader.readLine()` 會剝離行終結符(`\n`、`\r`、`\r\n`),而 `File.length()` 統計文件原始字節數(包含換行符)。
File file = new File(path);
long fileLen = file.length();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
long charCount = 0;
long lineCount = 0;
while ((line = reader.readLine()) != null) {
charCount += line.length(); // 無換行符
lineCount++;
}
System.out.println("文件字節數: " + fileLen);
System.out.println("字符數(無換行): " + charCount);
System.out.println("行數: " + lineCount);
System.out.println("推算換行符字節: " + (fileLen - charCount));
// Windows 預期 ≈ lineCount * 2
}
try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
byte[] buffer = new byte[8192];
int len;
long readBytes = 0;
while ((len = raf.read(buffer)) != -1) {
readBytes += len;
int progress = (int) (readBytes * 100 / fileLen);
updateProgress(progress);
// 處理 buffer...
}
}
`File.length()` = 磁盤字節數(含換行符),`readLine()` 累加 = 內容字符數(不含換行符)。**單位不一致**導致差異。進度條請使用字節位置 API。