当前位置: 首页 > 知识库问答 >
问题:

使用字节缓冲区复制文件略微增加目标文件的文件大小,Java

漆雕令秋
2023-03-14

我正在创建一个简单的文件复制应用程序供我个人使用。但是当我运行这个程序时,输出文件比源文件稍大。我根据文件大小使用缓冲区,如下所示

  1. 如果文件大小小于9KB,则缓冲区为512字节

源代码

    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字节

用于运行程序的命令

此问题中使用和命名的文件之间的比较

共有1个答案

赖俊
2023-03-14

这基本上就是你现在正在做的事情,但是只复制读到的内容,而不是缓冲区的全部内容。本质上,主要区别在于使用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!!! 我使用了这些依赖项: 我