背景


  • 在进行自然语言处理的中文词性标注时   进行测试时由于测试数据文本行数较多  而且测试每次标注一行的用时稍长
  • 如果一次将文件读进来测试机器运行时间要连续不能中断  而且 只能一台机器进行工作
  • 于是想到分布式的方式  将大文件拆分成小文件  分别用于测试  再将得到的结果文件 合并成 一个大文件 用于评估

拆分文本文件


  • 在此文件的文件夹进入powershell   使用如下命令进行拆分
//             源文件  目标文件  拆分的个数
java splitfile fromfile tofiles subfilenumber
  • 详细代码
public class splitfile {

    public static void main(String[] args) throws Exception{
DoFile dofile = new DoFile();
// 源文件 目标文件 拆分的个数
//dofile.splitfile("test.dat", "subtest/test", 10);
dofile.splitfile(args[0], args[1], Integer.parseInt(args[2])); } }
public class DoFile {

    public int getrows(File file) throws IOException{
int rows = 0;
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(file)));
for (rows = 0; br.readLine() != null; rows++);
br.close();
return rows;
} public void splitfile(String from, String to, int subfilenum) throws IOException{
File fromfile = new File(from); if (!fromfile.exists()) {
throw new IOException(fromfile + "不存在!!!");
}
if (!fromfile.isFile()) {
throw new IOException(fromfile + "不是文件!!");
}
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(fromfile))); String str = null;
int filerows = getrows(fromfile);
int subrows = (int) Math.ceil(1.0 * filerows / subfilenum); for (int i = 0; i < subfilenum; i++) { PrintWriter pw = new PrintWriter(to + "-" + i + ".dat");
int row = 0;
System.out.println("生成第:" + (i+1) + "个文件");
while(row < subrows) { if ((str = br.readLine()) != null) {
pw.println(str);
row++;
}else {
pw.flush();
pw.close();
break;
} }
pw.flush();
pw.close();
} br.close();
System.out.println("文件拆分完成!");
}
}

  • 测试结果


合并文本文件


  • 在此文件的文件夹进入powershell   使用命令
//装待合并的文件的文件夹  生成的新的文件
java mergefile dir newfile
  • 详细代码
public class mergefile {

    public static void main(String[] args) throws Exception{
DoFile dofile = new DoFile(); //合并文件 装小文件的文件夹 大文件
dofile.mergefile(args[0], args[1]);
} }
public class DoFile {

    //按行   合并文件    给定已知文件夹
public void mergefile(String dirname, String finalfile) throws IOException{
File dir = new File(dirname);
if (!dir.exists()) {
throw new IOException(dir + "不存在!!");
}
if (!dir.isDirectory()) {
throw new IOException(dir + "不是文件夹");
}
FileOutputStream out = new FileOutputStream(finalfile, true);
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(out));
int i = 1;
String[] files = dir.list(); for(String string: files) {
System.out.println("合并到第:" + i++ + "个文件");
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(dir + "/"+ string)));
String str = null;
while((str = br.readLine()) != null) {
bw.write(str);
bw.newLine();
}
br.close();
}
bw.flush();
bw.close();
System.out.println("文件合并完成!"); } }

  • 测试结果

按行拆分文本文件与合并文本文件---I/O流---java的更多相关文章

  1. Python文件操作---合并文本文件内容

    目前一个用的比较多的功能:将多个小文件的内容合并在一个统一的文件中,对原始文件重命名标记其已被处理过.之前使用其他脚本写的,尝试用python写了一下,顺便熟悉一下python的文件处理命令. 原始文 ...

  2. [C/C++标准库]_[0基础]_[使用fstream合并文本文件]

    场景: 1. 就是合并文本文件,而且从第2个文件起不要合并第一行. 2. 多加了一个功能,就是支持2个以上的文件合并. 3. 问题: http://ask.csdn.net/questions/192 ...

  3. 在论坛中出现的比较难的sql问题:27(字符串拆分、字符串合并、非连续数字的间隔范围、随机返回字符串)

    原文:在论坛中出现的比较难的sql问题:27(字符串拆分.字符串合并.非连续数字的间隔范围.随机返回字符串) 在论坛中看到一个帖子,帖子中有一些sql方面的面试题,我觉得这些面试题很有代表性. 原帖的 ...

  4. Oracle数据行拆分多行

    工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比. 单行拆分 如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如: select regexp_ ...

  5. Oracle字符串行拆分成列的三种方式

    Oracle字符串行拆分成列的三种方式 --muphy 开发过程中经常会遇到将前台多个值用逗号连接一同传递到后台查询,这个用逗号连接的字符串分隔的每个字符串分别对应Oracle数据库表的不同行. 如下 ...

  6. Linux:读取文件,每行拆分,并比较拆分数组长度

    读取文件,每行拆分,并比较拆分数组长度 #!/bin/bash FILENAME=./.txt function While_read_LINE(){ cat $FILENAME | while re ...

  7. 文本文件的合并操作方法 - Python

    我们有时候,看到几k的日志文件,一大堆,一个一个打开又很麻烦,少看几个,又担心遗漏,这个时候,如果有一个可以合并所有文本文件的工具就好了. 下面这个代码就可以实现,它不局限于.txt格式,基本上字符型 ...

  8. Oracle 字段拆分替换在合并成一条

    看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...

  9. Linux查看文件总的数据行数,并按行拆分

    先利用 wc -l BLM.txt       读出 BLM.txt 文件一共有多少行. 再 1. 以行数拆分 -l 参数: split –l 50 原始文件 拆分后文件名前缀 例:以50行对文件进行 ...

随机推荐

  1. 一步步创建第一个Docker App —— 4. 部署应用

    原文:https://docs.docker.com/engine/getstarted-voting-app/deploy-app/ 在这一步中,将会使用第一步提到的 docker-stack.ym ...

  2. VS2010 代码突然改变字体 解决办法

    sfsfsddffs dffsfsfsfsf 如上,第一行是突然变成宽体的字体,第二行是恢复后的字体,方法就是: shift+空格键,一起按就会在这两种字体之间变换~

  3. Win32+API学习笔记:创建基本的窗口控件

    创建一个标签 CreateWindowEx(0, "static", "姓名:",                                        ...

  4. 包学会之浅入浅出Vue.js:开学篇(转)

    包学会之浅入浅出Vue.js:开学篇 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门>书籍的翻译工作.目前专注前端图片优化与新技术的探研. ...

  5. REDIS 缓存的穿透,雪崩和热点key

    穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法:①用一个bitmap和n个hash函数做布隆过滤器过滤没有在缓存的键.   ②持久层查询不到就 ...

  6. 让外部网络访问K8S service的四种方式

    本文基于kubernetes 1.5.2版本编写 kube-proxy+ClusterIP kubernetes版本大于或者等于1.2时,配置: 修改master的/etc/kubernetes/pr ...

  7. vue中的插槽slot

    插槽(slot):是组件的一块HTML模板,父组件决定这块模板显不显示以及怎么显示. 位置由子组件自身决定(slot现在组件template的什么位置,父组件传过来的模板将来就显示在什么位置) 匿名插 ...

  8. AngularJs分层结构小demo

    后端mvc分层,前端也要分层才对嘛.分层的好处不言而喻.简直太清晰,容易维护.反正清爽的一逼.不信你看. 思路:分为controller层和service层.controller层再提取一个公共的层. ...

  9. IOS 与 PHP 通信加密,使用AES 128 CBC no padding

    这个网上的资料真实浩如烟海,但是真正有价值的屈指可数 自己尝试了一天多,终于还是搞定了. 再次要感谢网上的前辈么. 比如下面这个关于php和java端的实现: http://my.oschina.ne ...

  10. struts的理解

    1.struts是一个按MVC模式设计的Web层框架,其实他就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类.我们可以在web.xm ...