日志解析(四) 大文件分割

将百兆大文件分割成几十M的小文件,按大小进行分割

package com.fenge;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

public class fenge {
    public static final String SUFFIX = ".txt"; // 分割后的文件名后缀
    // 将指定的文件按着给定的文件的字节数进行分割文件,其中name指的是需要进行分割的文件名,size指的是指定的小文件的大小

public static String[] divide(String name, long size) throws Exception {
        File file = new File(name);
        if (!file.exists() || (!file.isFile())) {
            throw new Exception("指定文件不存在!");
        }
        // 获得被分割文件父文件,将来被分割成的小文件便存在这个目录下
        File parentFile = file.getParentFile();
        // 取得文件的大小
        long fileLength = file.length();
        System.out.println("文件大小:" + fileLength + "字节");
        if (size <= 0) {
            size = fileLength / 2;
        }
        // 取得被分割后的小文件的数目
        int num = (fileLength % size != 0) ? (int) (fileLength / size + 1)
                : (int) (fileLength / size);
        // 存放被分割后的小文件名
        String[] fileNames = new String[num];
        // 输入文件流,即被分割的文件
        FileInputStream in = new FileInputStream(file);
        // 读输入文件流的开始和结束下标
        long end = 0;
        int begin = 0;
        // 根据要分割的数目输出文件
        for (int i = 0; i < num; i++) {
            // 对于前num – 1个小文件,大小都为指定的size
            File outFile = new File(parentFile, file.getName() + i + SUFFIX);
            // 构建小文件的输出流
            FileOutputStream out = new FileOutputStream(outFile);
            // 将结束下标后移size
            end += size;
            end = (end > fileLength) ? fileLength : end;
            // 从输入流中读取字节存储到输出流中
            for (; begin < end; begin++) {
                out.write(in.read());
            }
            out.close();
            fileNames[i] = outFile.getAbsolutePath();
        }
        in.close();
        return fileNames;
    }

public static void readFileMessage(String fileName) {// 将分割成的小文件中的内容读出
        File file = new File(fileName);
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));
            String string = null;
            // 按行读取内容,直到读入null则表示读取文件结束
            while ((string = reader.readLine()) != null) {
                System.out.println(string);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }

public static void main(final String[] args) throws Exception {
        String name = "E:/Automation/branches/UV/home_fang_com-zhuangxiu2.txt";
        long size = 1024 * 1024 * 20;// 1K=1024b(字节)
        String[] fileNames = fenge.divide(name, size);
        System.out.println("文件" + name + "分割的结果如下:");
        for (int i = 0; i < fileNames.length; i++) {
            System.out.println(fileNames[i] + "的内容如下:");
            // FenGeFile.readFileMessage(fileNames[i]);
            System.out.println();
        }
    }
}

时间: 2024-10-10 16:35:19

日志解析(四) 大文件分割的相关文章

c#大文件分割过程

需求: 在项目开发中,我们会遇到单个文件大小超过1TB的文件,这样的文件只能进行单文件读取,往往会造成读取完成耗时过长,导致客户在使用体验过程中不满意. 为了解决提升大文件的解析速度,我想到了先分割大文件为小文件,之后进行并行多个文件同时解析入库方案. 那么,怎么才可以把一个大文件分割为多个小文件呢? 如果我按照大小来控制分割出来的小文件,会造成文件的丢失问题,如果按照行数来分割,一行一行进行读取务必会造成分割文件耗时过长. 讨论:如果一个1TB的文件,我们按照大小来控制文件个数,假设每个分割出

linux大文件分割 split命令

linux split 命令 功能说明:切割文件. 语 法:split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名] [前缀] 补充说明:split可将文件切成较小的文件,预设每1000行会切成一个小文件. 参 数: -<行数>或-l<行数> 指定每多少行就要切成一个小文件. -b<字节> 指定每多少字就要切成一个小文件.支持单位:

android下大文件分割上传

由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. 1 //文件分割上传 2 public void cutFileUpload(String fileType,String filePath) 3 { 4 try 5 { 6 FileAccessI fileAccessI = new FileAccessI(filePath, 0); 7 Long nStartPo

python学习——大文件分割与合并

在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情况),假设现在只有一个2G或4G的优盘,该怎么办呢? 有很多方法,例如winrar压缩的时候分成很多小卷,这里不累述. 在学习python之后,我们自己就可以解决这个问题啦. 我们可以自己写一个脚本去分割合并文件,将文件分割成适合优盘大小的小文件,在拷贝,然后再合并. 下面是文件分割脚本: 1 im

js大文件分割上传

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <title>分割大文件上传<

Linux大文件分割split和合并cat使用方法

本文主要介绍linux下两个命令:split和cat.其中,相信大家都熟悉cat命令,一般用来查看一个文件的内容,但是它还其它的功能,比如这里要介绍的文件合并功能,它可把多个文件内容合并到一个文件中.从split词义不拿理解,其为分割之意,常用于分割大文件.下面详细介绍. split命令 — 分割文件 语法:split [–help][–version][-][-l][-b][-C][-d][-a][要切割的文件][输出文件名] –version 显示版本信息 – 或者-l,指定每多少行切割一次

解析rsync大文件传输慢原因以及解决方法

rsync作为一个简便的同步工具,在linux环境中应用较多.能够实现比较简单的文件或目录传输.至于配置相关部分这里不做过多的讲解. +++++++++++++++++++++++++++++++++++++++++++++++ 这里说下rsync大文件时遇到的传输慢的问题,以及应该如何合理的解决这个问题. 现实场景如下,线上环境中需要同步一个15G的文件,服务器都是千兆网卡,正常同步也就150s左右.但是线上环境中同步有时候需要一个多小时,让人很崩溃. 分析过程:开始怀疑网络问题,查了网络环境

POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280.html . Office2007与Office Open XML 在Office 2007之前,Office一直都是以二进制位的方式存储,但这种格式不易被其它软件拿来使用,在各界的压力下,MicroSoft于2005年发布了基于XML的ooxml开放文档标准.ooxml的xml schema强调减

ElementTree 解析xml(minidom解析xml大文件时,MemoryError)

在使用minido解析xml文件时,因为文件过大,结果报错MemoryError.查询后得知是因为minidom在解析时是将所有文件放到内存里的,很占用内存,所以要考虑换一种方法来处理xml文件. ElementTree相比minidom消耗内存更小,下面是ElementTree的一些简单用法 XML源文件中的部分内容: #导入ElementTree from xml.etree import ElementTree #读入并解析XML文件,读入的是树形结构 doc = ET.parse(XML