我正在创建一个简单的文件复制应用程序供我个人使用。但是当我运行这个程序时,输出文件比源文件稍大。我根据文件大小使用缓冲区,如下所示
源代码
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();
}
}
文件大小比较…:<源文件:“龙珠84集mp4”。。。。。文件大小:8,59,93580字节
目标文件:“sample.mp4”。。。。。文件szie:8,70,31808字节
用于运行程序的命令
此问题中使用和命名的文件之间的比较
这基本上就是你现在正在做的事情,但是只复制读到的内容,而不是缓冲区的全部内容。本质上,主要区别在于使用FileOutputStream。写入(字节[],偏移量,len)
而不是文件输出流。写入(字节[])
。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
/**
* mcopy
*/
public class mcopy {
private static DecimalFormat format = new DecimalFormat("#.#");
private final static int SMALL = 512;
private final static int MEDIUM = 512 * 1024;
private final static int LARGE = 1024 * 1024;
private final static int XLARGE = 2 * 1024 * 1024;
private static void copy(File a, File b, byte[] buffer) {
FileInputStream fin = null;
FileOutputStream fout = null;
try {
double j = 0;
double length = a.length();
fin = new FileInputStream(a);
fout = new FileOutputStream(b);
int i;
while(-1 != (i = fin.read(buffer))) {
j += i;
fout.write(buffer, 0, i);
System.out.print("Copying... " + format.format(((j / length) * 100)) + " " + a.getName() + " to "
+ b.getPath() + " buffer: " + buffer.length + " \r");
}
} 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;
byte[] buffer = null;
if (l <= ((9 * 1024) / 1024 / 1024)) {
buffer = new byte[SMALL];
} else if (l <= 9) {
buffer = new byte[MEDIUM];
} else if (l <= 99) {
buffer = new byte[LARGE];
} else {
buffer = new byte[XLARGE];
}
copy(in, out, buffer);
System.out.println();
}
}
我希望在复制现有的pdf文件时,文件大小大致相同。我不明白为什么尺寸会增加这么多。 我也试过PdfCopy类。我使用PDFcopy遵循了2种方法: 逐页复制。 对pdfcopy对象调用setMergeFields(),然后调用pdfcopy.AddDocument(reader); 但这两种方法的问题都是,它会从pdf文件中丢弃一些非内容的元数据,因此当Adobe Reader打开新的pdf时会损
问题内容: 在Windows上的Python中,我可以通过创建一个大文件 现在大约是1 GB。但是,在Linux上,这将返回。 有没有办法在Linux上获得与Windows相同的行为?也就是说,能够使用?来增加文件的大小。 问题答案: 至少在POSIX系统上,不能用于增加(或减小)文件的大小。的功能是将文件的一部分映射到内存。合乎逻辑的是,您请求映射的东西应该确实存在!坦白说,我真的很惊讶您实际上
问题内容: 该文件规定,对于缓冲的默认值是: 。我目前在Red Hat Linux 6上,但是我无法弄清楚为系统设置的默认缓冲。 谁能指导我如何确定系统的缓冲? 问题答案: 由于您链接到2.7文档,因此我假设您使用的是2.7。(在Python 3.x中,这一切都变得更加简单,因为在Python级别上公开了更多的缓冲。) 所有实际上做(在POSIX系统)是调用,然后,如果你已经通过了什么,。由于您没
本文向大家介绍emacs 文件和缓冲区,包括了emacs 文件和缓冲区的使用技巧和注意事项,需要的朋友参考一下 示例 在Emacs中,文件的含义与操作系统中的含义相同,并且用于永久存储数据。甲缓冲器是正在编辑的文件的内部表示。可以使用将文件读取到缓冲区中C-x C-f,并且可以使用C-x C-s(将文件保存到当前位置)或C-x C-w(将文件写入其他位置,提示输入-等效于Save as)将缓冲区写
本文向大家介绍java文件和目录的增删复制,包括了java文件和目录的增删复制的使用技巧和注意事项,需要的朋友参考一下 在使用java进行开发时常常会用到文件和目录的增删复制等方法。我写了一个小工具类。和大家分享,希望大家指正: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
我在Android studio中创建了一个Android应用程序,并使用Kotlin作为编程语言 现在我的应用程序完成了,我想构建我的应用程序,但构建应用程序后,我的APK文件大小变为35mb<我的可绘制文件夹大小是2mb,我没有任何大文件,但为什么我的应用程序大小是35mb?! 为了生成测试apk版本,我使用了构建- 但是当我使用java语言时,这个大小是7mb!!! 我使用了这些依赖项: 我