java实现压缩指定文件(java实现对文件进行切割)
java实现压缩指定文件(java实现对文件进行切割)
一、创建相应的工具类
public class SplitFileUtil {
public static final String _encoding = "GB2312";
/**
*
* @param sourceFileUrl 源路径
* @param targetPath 目标路径
* @return
* @throws IOException
*/
public static List<String> separateFileByLine(String sourceFileUrl String targetPath) throws IOException {
List<String> filenames = new ArrayList<>();
int file_count;
//获取文件总行数
long lineNum = getFileLineNum(sourceFileUrl);
//不做分文件处理 Constants.line_num_per_file;自定义的常量
if(lineNum<= Constants.line_num_per_file){
filenames.add(sourceFileUrl);
}else{
//分割文件
if(lineNum%Constants.line_num_per_file==0){
file_count = (int)(lineNum/Constants.line_num_per_file);
}else{
file_count = (int)(lineNum/Constants.line_num_per_file 1);
}
Long[] countArray;
if(file_count>Constants.max_file_count){
file_count = Constants.max_file_count;
//将每个文件的起始索引记录下来
countArray = new Long[file_count];
long file_start_index;
int line_num_per_file;
if(lineNum%file_count==0){
line_num_per_file = (int)(lineNum/file_count);
}else{
line_num_per_file = (int)(lineNum/file_count 1);
}
for(int i=0;i<file_count;i ){
file_start_index = (i 1)*line_num_per_file;
countArray[i] = file_start_index;
}
}else{
//将每个文件的起始索引记录下来
countArray = new Long[file_count];
long file_start_index = 0;
for(int i=0;i<file_count;i ){
file_start_index = (i 1)*Constants.line_num_per_file;
countArray[i] = file_start_index;
}
}
/*处理文件*/
InputStreamReader fr = null;
BufferedReader br = null;
try {
fr = new InputStreamReader(new FileInputStream(sourceFileUrl) _encoding);
br = new BufferedReader(fr);
int count = 0;
int _index = 0;
String rec ;// 一行
List<String> result = new ArrayList<>();
//读取掉第一行数据,第一行为标题
br.readLine();
// 读取一行
while ((rec = br.readLine()) != null) {
count ;
result.add(rec);
if(count==countArray[_index]){
//一次性写入文件
String targetFile = targetPath "data_part_" _index ".Csv";
writeCsv(targetFile result);
result.clear();
_index ;
filenames.add(targetFile);
}
}
if(result.size()>0){
String targetFile = targetPath "data_part_" (file_count-1) ".csv";
writeCsv(targetFile result);
result.clear();
filenames.add(targetFile);
}
}catch(Exception e){
e.printStackTrace();
}finally {
if(!StringUtils.isEmpty(br)){
br.close();
}
if(!StringUtils.isEmpty(fr)){
fr.close();
}
}
}
return filenames;
}
public static void writeCsv(String csvFile List<String> contentList) throws IOException {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile) _encoding) 1024);
for(int i=0;i<contentList.size();i ){
String str = contentList.get(i);
bw.write(str);
bw.newLine();
}
bw.flush();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(!StringUtils.isEmpty(bw)){
bw.close();
}
}
}
public static long getFileLineNum(String filename) throws IOException {
long time1 = System.currentTimeMillis();
//取出文件总行数
long count = 0;
InputStreamReader fr = null;
BufferedReader br = null;
try {
fr = new InputStreamReader(new FileInputStream(filename) _encoding);
br = new BufferedReader(fr);
// 读取一行
while (br.readLine() != null) {
count ;
}
}catch(Exception e){
e.printStackTrace();
}finally {
if(!StringUtils.isEmpty(br)){
br.close();
}
if(!StringUtils.isEmpty(fr)){
fr.close();
}
}
long time2 = System.currentTimeMillis();
System.out.println("getFileLineNum==[" count "] time is:" (time2-time1));
return count;
}
}
实现写入文件的方法
获取文件的行数