精华内容
下载资源
问答
  • 主要介绍了Java实现文件切割拼接的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Java实现文件切割拼接

    2018-11-22 22:20:58
    单线程实现 文件分割 在老的FAT32文件系统中,最大的单个文件大小必须保存在4G内,对于经常看电影的我这个是不能允许的。不过现在Windows有NTFS文件系统,Linux大部分发行版为Ext4文件系统,最大单个文件大小能...

    单线程实现

    文件分割

    在老的FAT32文件系统中,最大的单个文件大小必须保存在4G内,对于经常看电影的我这个是不能允许的。不过现在Windows有NTFS文件系统,Linux大部分发行版为Ext4文件系统,最大单个文件大小能大于4G。不过这二者并不能兼容。。格式化NTFS的U盘Linux不能识别,格式化Ext4的U盘Windows不能识别,只能用老的FAT32兼容二者。所以将文件分割,再进行拼接就很重要,文件经过分割了在网络上传输就十分方便,也能开多线程对每部分进行HASH提高处理效率。

     

     

    最近看的BradPitt的《狂怒》

     

    首先:对文件进行分割需要确定每一部分的大小,假设上面的Fury.mkv文件大小为280M,分割每一块设置默认大小为64M,所以:

     

    对于最后一块,一般小于等于设定好的每块默认大小。 每块大小设置好了,接下来,就需要将文件的路径获取,代码中搭建输入流,将文件读入内存缓冲区中,再搭建输出流,将缓冲区输出到新的分割文件中。 再接下来实现就很简单了。 新建一个FileSlice类:有切割方法,拼接方法。

     

    public class FileSlice {
        /**
         * 分割文件
         * @param filePath 文件路径
         * @param filePieceSize 文件每块大小,单位为字节,为-1则默认为每块64M
         * @return 成功返回True,出错则返回False
         */
        public static boolean slice(Path filePath, int filePieceSize){
            return true;
        }
    
        /**
         * 将分割好的文件重新链接
         * @param filePath 被分割好的其中之一文件路径,默认其他块与其在同一目录下
         * @param howManyParts 一共有多少块
         * @return 成功返回True,出错则返回False
         */
        public static boolean glue(Path filePath, int howManyParts){
            return true;
        }
    }

    接下来实现单线程的分割方法: 用图解的话应该是这样:

     

    代码实现: 进入函数首先判断文件是否存在:

     

    if (!Files.exists(filePath)){
        return false;
    }

    接下来判断每块大小是否使用默认值:

    if(filePieceSize == -1){
        filePieceSize = 1024*1024*64;
    }

    将路径转换为文件对象,再计算将分割多少块:

    File file = filePath.toFile();
    int howManyParts = (int) Math.ceil(file.length() / (double)filePieceSize);

    初始化输入输出流,出错输出错误信息,返回false,获得当前目录:

    DataInputStream fileReader = null;
    try {
        fileReader = new DataInputStream(new FileInputStream(file));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.out.println("文件找不到!");
        return false;
    }
    DataOutputStream fileWriter;
    Path dir = filePath.getParent();

    接下来读取文件,并且分别输出到各个part文件中:

    int readLength = -1;
    long total = 0;
    
    try {
        for (int i = 1; i <= howManyParts ; i++){
            //新建文件part i
            Path temp = Files.createFile(dir.resolve(filePath.getFileName() + ".part" + i));
            //搭建输出流
            fileWriter = new DataOutputStream(new FileOutputStream(temp.toFile()));
            //读取文件并输出
            while ( (readLength = fileReader.read(buffer)) != -1){
                fileWriter.write(buffer,0,readLength);
                fileWriter.flush();
                total += readLength;
                if (total == filePieceSize){
                    total = 0;
                    break;
                }
            }
            //part i的文件已经输出完毕,关闭流
            fileWriter.close();
        }
        //读取完毕,关闭输入流
        fileReader.close();
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("IO错误!");
        return false;
    }

    该函数已经实现完毕,接下来测试(由于电影Fury有14G。。太大了。。还是换个吧):

     

    我是大哥大第5集,有729M,大概能分个12个part吧。

     

    public static void main(String[] args) throws IOException {
        double before = System.currentTimeMillis();
    
        Path bigboss = Paths.get("D:\\Video\\我是大哥大\\我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4");
    
        FileSlice.slice(bigboss,-1);
    
        double after = System.currentTimeMillis();
    
        System.out.println("分割文件我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4," + Files.size(bigboss) + "字节,总用时" + (after - before) + "ms" );
    
    }

    运行结果:

    分割文件我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4,765321889字节,总用时16335.0ms

     

     

    速度还是挺慢的。。 下次还是换成多线程来实现,再来测试下速度。在单线程情况下一个普通的40分钟日剧都要15-30s左右,要是mkv格式的电影都要好久了。。不过其实极限应该不在CPU中执行的速度,而是在硬盘IO中,如果是普通硬盘那么就算是多线程也应该提速不了多少。。

     

    文件拼接

    这个就很简单了,和分割相反就OK。 直接上完整代码:

    public static boolean glue(Path filePath, int howManyParts){
        if (!Files.exists(filePath)){
            return false;
        }
        //获取原始文件名
        String filename = getOriginalFileName(filePath.getFileName().toString());
    
        if (filename == null){
            System.out.println("传入part文件名解析出错!");
            return false;
        }
        //初始化缓冲区
        byte [] buffer = new byte[1024 * 8];
        //获取文件存储的路径
        Path dir = filePath.getParent();
    
        try {
            DataInputStream fileReader  = null;
            //创建原始文件
            Files.createFile(dir.resolve(filename));
            //搭建原始文件输出流
            DataOutputStream fileWriter = new DataOutputStream(new FileOutputStream(dir.resolve(filename).toFile()));
    
            int readLength = -1;
            for (int i = 1; i <= howManyParts ; i++){
                //得到part i文件路径
                Path temp = dir.resolve(filename + ".part" + i);
                //搭建输入流
                fileReader = new DataInputStream(new FileInputStream(temp.toFile()));
                //读取文件并输出
                while ( (readLength = fileReader.read(buffer)) != -1){
                    fileWriter.write(buffer,0,readLength);
                    fileWriter.flush();
                }
                //part i的文件已经读入完毕,关闭流
                fileReader.close();
            }
            //写入完毕,关闭输出流
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO错误!");
            return false;
        }
        return true;
    }

    再测试刚刚分割好的我是大哥大第5集

    public static void main(String[] args) throws IOException {
        double before = System.currentTimeMillis();
    
        Path bigboss = Paths.get("D:\\Video\\我是大哥大\\我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4.part1");
    
        FileSlice.glue(bigboss,12);
    
        double after = System.currentTimeMillis();
    
        System.out.println("拼接12个part,用时" + (after - before) + "ms");
    
    }

    结果输出,用12s左右,还行。

    拼接12个part,用时12147.0ms

    打开播放毫无问题,最后截张图。

     

    未完待续。。下次来使用多线程进行实现。

    展开全文
  • 主要介绍了java 实现切割文件和合并文件的功能的相关资料,这里实现文件的切割的实现代码和文件合并的实现代码,需要的朋友可以参考下
  • 主要介绍了java实现上传图片进行切割的方法,以完整实例形式分析了Java针对上传图片进行切割的技巧,非常具有实用价值,需要的朋友可以参考下
  • 将图片横切或者竖切为两张public void carveImage(String dir, File file, String orient, int width, int height) {ImageFilter cropFilter;Image img;try {// 读取源图像BufferedImage bi = ImageIO.read(file);...

    将图片横切或者竖切为两张

    public void carveImage(String dir, File file, String orient, int width, int height) {

    ImageFilter cropFilter;

    Image img;

    try {

    // 读取源图像

    BufferedImage bi = ImageIO.read(file);

    int srcWidth = bi.getWidth(); // 源图宽度

    int srcHeight = bi.getHeight(); // 源图高度

    int destWidth, destHeight;

    int j = 1, k = 1;

    // 判断

    if ("2".equals(orient)) {// 竖切

    destWidth = srcWidth / 2;

    destHeight = srcHeight;

    k = 0;

    } else if ("1".equals(orient)) {// 横切

    destWidth = srcWidth;

    destHeight = srcHeight / 2;

    j = 0;

    } else {

    return;

    }

    String fileName;

    String filePath;

    if (srcWidth >= destWidth && srcHeight >= destHeight) {

    Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);

    for (int i = 0; i < 2; i++) {

    fileName = System.currentTimeMillis() + ".jpg";

    filePath = dir + "/" + fileName;

    cropFilter = new CropImageFilter(i * destWidth * j, i * destHeight * k, destWidth, destHeight);

    img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));

    BufferedImage tag = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);

    Graphics g = tag.getGraphics();

    new CropThread(g, img).start();

    ImageIO.write(tag, "JPEG", new File(filePath));

    }

    }

    } catch (Exception e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

    class CropThread extends Thread {

    Graphics g = null;

    Image img = null;

    public CropThread(Graphics g, Image img) {

    this.g = g;

    this.img = img;

    }

    public void run() {

    g.drawImage(img, 0, 0, null); // 绘制缩小后的图

    g.dispose();

    }

    }

    展开全文
  • 实现图片切割功能,适合初步认识使用
  • 利用Java代码实现图片切割

    千次阅读 热门讨论 2019-03-29 14:46:36
    利用Java代码实现图片切割 将一张大图分割成指定数量的小图 private static void splitImage() throws IOException { //String originalImg = "C:\\img\\split\\a380_1280x1024.jpg"; String originalImg = "F:\...

    利用Java代码实现图片切割

    将一张大图分割成指定数量的小图

      private static void splitImage() throws IOException {
    
            //String originalImg = "C:\\img\\split\\a380_1280x1024.jpg";
            String originalImg = "F:\\images\\school\\-11ff2b32525fd5f2.jpg";
            // 读入大图
            File file = new File(originalImg);
            FileInputStream fis = new FileInputStream(file);
            BufferedImage image = ImageIO.read(fis);
    
            // 分割成4*4(16)个小图
            int rows = 4;
            int cols = 4;
            int chunks = rows * cols;
    
            // 计算每个小图的宽度和高度
            int chunkWidth = image.getWidth() / cols;
            int chunkHeight = image.getHeight() / rows;
    
            int count = 0;
            BufferedImage imgs[] = new BufferedImage[chunks];
            for (int x = 0; x < rows; x++) {
                for (int y = 0; y < cols; y++) {
                    //设置小图的大小和类型
                    imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType());
    
                    //写入图像内容
                    Graphics2D gr = imgs[count++].createGraphics();
                    gr.drawImage(image, 0, 0,
                            chunkWidth, chunkHeight,
                            chunkWidth * y, chunkHeight * x,
                            chunkWidth * y + chunkWidth,
                            chunkHeight * x + chunkHeight, null);
                    gr.dispose();
                }
            }
    
            // 输出小图
            for (int i = 0; i < imgs.length; i++) {
                //ImageIO.write(imgs[i], "jpg", new File("C:\\img\\split\\img" + i + ".jpg"));
                ImageIO.write(imgs[i], "jpg", new File("E:\\temp" + i + ".jpg"));
            }
    
            System.out.println("完成分割!");
        }
    
    展开全文
  • java实现的均匀切割图片

    千次阅读 2018-12-07 08:12:18
    在做拼图的时候,需要将图片均匀切割,这时候就需要一个切图工具了,ps虽然有一个切图工具,但是那个ps太大了,于是手动做了一个用来切图的小工具,具体代码实现如下   package Mytool; import java.awt.Button; ...

    在做拼图的时候,需要将图片均匀切割,这时候就需要一个切图工具了,ps虽然有一个切图工具,但是那个ps太大了,于是手动做了一个用来切图的小工具,具体代码实现如下

     

    package Mytool;
    import java.awt.Button;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.Box;
    import javax.swing.ImageIcon;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTabbedPane;
    import javax.swing.JTextField;
    class toolWindow extends JFrame implements ActionListener{
           Button m_cut,m_loading,m_save;
           String RecRoad=null;//路径
           Image image;
           Image w_image[];//剪切好的图片
           ImageIcon icon;
           JTextField row,col;
           JLabel rowtext,coltext,nametext;
           int t_row=0,t_col=0;//行列数
           JTabbedPane pane;
           BufferedImage bf_image;
           int flag=1,flag2=0,flag3=0;
           Box box;
           public toolWindow(String s) {
                 setTitle(s);//设置名字
                 setBounds(100, 100,232, 236);//窗口位置和大小
                 setLayout(new FlowLayout(FlowLayout.LEFT));//窗口布局
                 m_cut=new Button("剪切");//按钮设置
                 m_loading=new Button("加载图片");
                 m_save=new Button("保存图片");
                 rowtext=new JLabel("切割行数:");
                 coltext=new JLabel("切割列数:");
                 nametext=new JLabel("制作人:高镜皓     制作日期:2018.5.15");
                 box=Box.createVerticalBox();
                 box.add(new JLabel("1.先按下加载按钮,加载图片"));
                 box.add(new JLabel("2.输入行列数"));
                 box.add(new JLabel("3.点击剪切再保存"));
                 box.add(new JLabel("4.文件在程序当下的image文件夹下"));
                 row=new JTextField(10);
                 col=new JTextField(10);
                 m_cut.addActionListener(this);//按钮监听
                 m_loading.addActionListener(this);
                 m_save.addActionListener(this);
                 add(m_cut);
                 add(m_save);
                 add(m_loading);//添加组件
                 add(rowtext);add(row);
                 add(coltext);add(col);
                 add(nametext);
                 add(box);
                 setVisible(true);//显示窗口
                 this.setResizable(false);
                 validate();//显示按钮
                 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
           }
           void cut(int k) throws IOException//剪切图片
           {
                 bf_image=ImageIO.read(new File(RecRoad));
                 int w = (bf_image.getWidth(this))/t_col;
                 int h = (bf_image.getHeight(this))/t_row;
                 System.out.println("图片宽度:"+w);
                 System.out.println("图片高度:"+h);
                 for (int i = 0; i < k; i++) {
                        BufferedImage outImg=bf_image.getSubimage(i%t_col*w,i/t_row*h , w, h);
                        w_image[i]=(Image)outImg;
                 }
                 System.out.println("剪切成功");
           }
           public String open(){  //获取文件路径
                 JFileChooser jFileChooser=new JFileChooser();
                 File fileone = null;
                  if(jFileChooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION){
                        fileone=jFileChooser.getSelectedFile();
                        return fileone.getAbsolutePath();
                 }
                 return null;
           }
           public void actionPerformed(ActionEvent e) {//监听按钮
                 if(e.getSource()==m_loading){
                        RecRoad=open();
                 }
                 else if(e.getSource()==m_save)
                 {
                        if (RecRoad!=null && flag>=1) {
                               for (int i = 0; i < t_row*t_col; i++) {
                                     savePic(w_image[i], i);
                               }
                               flag++;
                        }
                 }
                 else if(e.getSource()==m_cut)//调用cut
                 {
                        try {
                               t_row=Integer.parseInt(row.getText());
                               t_col=Integer.parseInt(col.getText());
                               if (t_row!=0 && t_col!=0) {
                                     flag2=1;
                                     w_image=new Image[t_col*t_row];
                                     try {
                                            cut(t_col*t_row);
                                     } catch (IOException e1) {
                                            e1.printStackTrace();
                                     }
                               }
                        } catch (NumberFormatException ee) {
                               row.setText("请输入行数");
                               col.setText("请输入列数");
                        }
                 }
                 
           }
           public void savePic(Image myimage,int i){//保存图片
                 int w = myimage.getWidth(this);
                 int h = myimage.getHeight(this);
                 //首先创建一个BufferedImage变量,因为ImageIO写图片用到了BufferedImage变量。
                 BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
                 System.out.println("保存图片"+i);
                 //再创建一个Graphics变量,用来画出来要保持的图片,及上面传递过来的Image变量
                 //Graphics g = bi.getGraphics();
                 try {
                        //g.drawImage(myimage, 0, 0, null);
                        //将BufferedImage变量写入文件中。
                        File file = new File("./image");
                        file.mkdirs();
                        ImageIO.write(bi,"jpg",new File("./image/image"+flag+"_"+i+".jpg"));
                 } catch (IOException e) {
                        e.printStackTrace();
                 }
           }
    }
    public class Mytool {
           public static void main(String[] args) {
                 new toolWindow("切片工具");
           }
    }

     

    展开全文
  • java实现切割文本文件

    千次阅读 2012-06-19 13:53:06
    利用java实现将比较大的文本切割成小的文本 public static void splitToSmallFiles(File file,String outputpath) throws IOException{ //文件计数器,用于产生文件名 int filepointer=0; //定义单个文件...
  • java实现的文件切割

    2008-06-03 12:14:09
    java实现的一个简单的文件切割器,是一个完整的Eclipse project.
  • 主要介绍了Java实现大文件的切割与合并操作,结合实例形式分析了java基于io及util操作大文件按指定个数分割与合并相关操作技巧,需要的朋友可以参考下
  • 主要介绍了java实现切割wav音频文件的方法,结合实例形式详细分析了java切割wav音频文件的相关原理、操作技巧与注意事项,并附带外部jar包供读者下载,需要的朋友可以参考下
  • 可以利用java代码实现图片切割再重组么?如何实现?求案例讲解或者思路!
  • Java实现第十届蓝桥杯矩形切割

    万次阅读 多人点赞 2019-07-27 22:09:24
    试题 B: 矩形切割 本题总分:5 分 【问题描述】 小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。 当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形,剩下一块矩形,然后再切割...
  • 主要介绍了Java编程实现用hash方法切割文件,简单介绍了hash的概念,然后分享了使用方法示例,具有一定借鉴价值,需要的朋友可以了解下。
  • java实现上传图片进行切割

    千次阅读 2014-08-22 13:26:17
    为什么我要进行上传的图片进行切割呢,我这个项目的图片是部门logo,每个部门都可以选择不同的logo,但是要应对浏览器的兼容以及拉伸,我选择了把一张图片切成左、中、右和剩下的部分,因为左边和中变可能会有图案...
  • java使用ffmpeg实现视频切割

    千次阅读 2020-06-05 15:18:10
    目前demo实现了,后续还会继续优化,在视频截取的时候,从关键帧开始或结束. 1.首先需要安装FFmpeg. 2.直接上代码了 //分割视频的大小 private long blockSize = 1 * 1024 * 1024; @Test public void Test1() ...
  • 参见附件的类 SCMain可以实现切割和合并
  • leetcode切割分组 The algorithms implemented in Java Project Description sort the sort algorithm ds the data structure:stack/list/linked list/queue sort Name Time Complexity Space Complexity Stable ...
  • 一、实现文件切割功能 01. import java.io.File; 02. import java.io.FileInputStream; 03. import java.io.FileOutputStream; 04. import java.io.IOException; 05. import java.util.Properties; 06. 07. ...
  • java实现文件的切割及合并

    千次阅读 2016-01-30 22:31:22
    本文系转载,原文地址:http://www.cnblogs.com/yjmyzz/p/how-to-split-a-large-file-into-small-files-fastly.html 文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再...
  • jsp js java网页头像切割实例 jsp js java网页头像切割实例 jsp js java网页头像切割实例
  • 本座以前发表过一篇文章:《用 Java 实现的日志切割清理工具》,在网络上被大量转载(虽然大多数都没有注明原文出处 ^_^)。有不少看官留言给本座希望能提供工具的源代码。因此,本座也不敢敝帚自珍,现把源代码分享...
  • 金条切割问题(java实现

    千次阅读 2018-10-10 10:19:14
    金条切割 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共...
  • 主要介绍了如何用Java来进行文件切割和简单的内容过滤的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,206
精华内容 11,282
关键字:

java实现地址切割

java 订阅