前言:
现时看官们对“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; }}
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #java文件切分