Я создаю простое приложение для копирования файлов для личного использования.Но когда я запускаю программу, выходной файл немного больше исходного файла.Я использую буферы в зависимости от размера файла:
- , если размер файла меньше 9 КБ, а размер буфера составляет 512 байт.
- , если размер файла меньше 9 МБ, чемразмер буфера составляет 512 * 1024 байта (512 КБ).
- , если размер файла меньше 99 МБ, чем размер буфера 1024 * 1024 байта (1 МБ).
- другой размер буфера равен 2 *1024* 1024 байта (около 2,5 МБ).
Исходный код
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
/**
* mcopy
*/
public class mcopy {
private static byte buffersm[] = new byte[512]; // buffer for upto 9kb
private static byte buffermd[] = new byte[512 * 1024]; // buffer for upto 9 MB
private static byte bufferlg[] = new byte[1024 * 1024]; // buffer for upto 99MB
private static byte bufferxl[] = new byte[2 * 1024 * 1024]; // buffer for above 100MB
private static FileInputStream fin = null;
private static FileOutputStream fout = null;
private static int i = 0;
private static double length = 0;
private static double j = 0;
private static DecimalFormat decimal_p_ = new DecimalFormat("#.#");
private static void copysm(File a, File b) {
try {
length = a.length();
fin = new FileInputStream(a);
fout = new FileOutputStream(b);
i = fin.read(buffersm);
j = 0;
while (i != -1) {
j += i;
fout.write(buffersm);
System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
+ b.getPath() + " buffer: " + buffersm.length + " \r");
i = fin.read(buffersm);
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
fin.close();
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void copymd(File a, File b) {
try {
length = a.length();
fin = new FileInputStream(a);
fout = new FileOutputStream(b);
i = fin.read(buffermd);
j = 0;
while (i != -1) {
j += i;
fout.write(buffermd);
System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
+ b.getPath() + " buffer: " + buffermd.length + " \r");
i = fin.read(buffermd);
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
fin.close();
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void copylg(File a, File b) {
try {
length = a.length();
fin = new FileInputStream(a);
fout = new FileOutputStream(b);
i = fin.read(bufferlg);
j = 0;
while (i != -1) {
j += i;
fout.write(bufferlg);
System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
+ b.getPath() + " buffer: " + bufferlg.length + " \r");
i = fin.read(bufferlg);
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
fin.close();
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void copyxl(File a, File b) {
try {
length = a.length();
fin = new FileInputStream(a);
fout = new FileOutputStream(b);
i = fin.read(bufferxl);
j = 0;
while (i != -1) {
j += i;
fout.write(bufferxl);
System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
+ b.getPath() + " buffer: " + bufferxl.length + " \r");
i = fin.read(bufferxl);
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
fin.close();
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
File in = new File(args[0]);
File out = new File(args[1]);
double ld = in.length();
double l = ld / 1024 / 1024;
if (l <= ((9 * 1024) / 1024 / 1024)) {
copysm(in, out);
} else if (l <= 9) {
copymd(in, out);
} else if (l <= 99) {
copylg(in, out);
} else {
copyxl(in, out);
}
System.out.println();
}
}
Сравнение размера файла ....:
ИсточникФайл: "Dragon Ball Episode 84.mp4" ..... размер файла: 8,59,93,580 байт
Файл назначения: "sample.mp4" ..... Размер файла: 8,70,31,808 байт
Команда, используемая для запуска программы
Сравнение файлов, использованных и названных в этой задаче