问题描述如下:有一个文件A.csv,
内容如下:Q123,"""S,""",F
A123,Jonathan Ackerman,A
B234,Grady O'Neil,B
C456,"Susan, Peter and Dave",C
D789,"Amelia ""meals"" Maurice",E
X234,"Peter ""peg leg"", Jimmy & Samantha ""Sam""",G......................
......................
A的大小大约有几十m。
我现在想在A的最前面一行加上字段名
理想中的内容:
1,2,3,4
Q123,"""S,""",F
A123,Jonathan Ackerman,A
B234,Grady O'Neil,B
C456,"Susan, Peter and Dave",C
D789,"Amelia ""meals"" Maurice",E
X234,"Peter ""peg leg"", Jimmy & Samantha ""Sam""",G
...................
...................大家看明白了,就是想把“1,2,3,4”加入到最上面一行。大家给你高招。小弟利马送100分。不赞成去读a文件,因为他太大了。

解决方案 »

  1.   

    用nio的API方法,速度很快,读a文件也没什么,因为可以分段读
      

  2.   

    不遍历文件而想插入内容, 不太可能吧.? 即使是用RandomAccessFile..好像也不太容易
      

  3.   

    新生成一个文件,叫做b,里面的内容就是你的字段叫做1,2,3,4加上回车。用RUNTIME调用系统命令
    1.copy b + a c /Y
    2.del a
    3.rename c a就可以了。
      

  4.   

    用copy的方法Croatia(Croatia)和我想的一样
      

  5.   

    不遍历也道是有办法,用RandomAccessFile,但要把第一条记录移动到最后一条,应该不会影响你的结构吧RandomAccessFile在writeBytes(1,2,3,4);的时候要覆盖文件指针的位置,这样第一条Q123,"""S,""",F 中的Q123就会被覆盖掉,但不要紧,你还用空格把,"""S,""",F也覆盖掉,
    然后seek到文件尾把这个记录加上就可以了。当然你先要把第一条记录读出来。最XP的方法就是我说上边说的:用写字板
      

  6.   

    例子:import java.io.IOException;
    import java.io.RandomAccessFile;public class Test2 { public static void main(String[] args) { try {
    RandomAccessFile a = new RandomAccessFile("b","rw");
    a.writeChars("1,2,3,4\r\n");
    a.close();

    a = new RandomAccessFile("a","rw");
    a.writeChars("TEST,TEST\r\n");
    a.close();

    String[] command = {"cmd.exe", "/c", "copy b + a c /Y"};
    Runtime.getRuntime().exec(command);
    System.out.println("Finished..Copy");


    String[] command2 = {"cmd.exe", "/c", "del a"};
    Runtime.getRuntime().exec(command2);
    System.out.println("Finished..DELETE");

    String[] command3 = {"cmd.exe", "/c", "del b"};
    Runtime.getRuntime().exec(command3);
    System.out.println("Finished..DELETE2");

    String[] command4 = {"cmd.exe", "/c", "ren c a"};
    Runtime.getRuntime().exec(command4);
    System.out.println("Finished..RenName");

    } catch (IOException e) {
    e.printStackTrace();
    }

    }
    }
      

  7.   

    sorry,逗号也占位置,writeBytes("1,2,3,4");覆盖的是Q123,""
      

  8.   

    测试环境:
    WIN2000 Pro,
    ECLIPSE2.1.2,
    JDK1.4.2_08测试通过.LiNUX的话,需要改成相关的命令.
    类似下面.String [] command = {"/bin/sh", "-c", "cp file1 file2"};
    Runtime.getRuntime().exec(command);
      

  9.   

    嘿嘿 测试完毕,首先感谢 Croatia(Croatia) 提出的这么想法。但是由于字符集和文件的字符编码的问题,copy并不可使,因为在后面会加上一个"->"感谢提出把第一条记录换掉的想法的 gemouzhi(gemouzhi)。茅塞顿开。
      

  10.   

    gemouzhi(gemouzh)的方法比较好些,不过需要注意的是csv是个二进制文件,用byte去写。还有更好的办法吗?下周二回来揭帖
      

  11.   

    赫赫,其实字符集也没有问题,Copy有一个参数是/B。copy 1.txt/B + 3.txt/B 2.txt /Y这样的方式。不要否定的这么快吗。赫赫,我不觉得,把原来的第一行的数据放到最后一行就是好办法。假如原来的数据按照一定的顺序来排序,这个就没有什么可行性了。
      

  12.   

    如果把第一行换掉最后,bug比较多,如果加入的列名 比第一行少那么没有问题,
    如果列名比第一行记录的字节数多 嘿嘿 。这个方法是行不通的。还是试试copy吧
      

  13.   

    如果把第一行换掉最后,bug比较多,如果加入的列名 比第一行少那么没有问题,
    如果列名比第一行记录的字节数多 嘿嘿 。这个方法是行不通的。还是试试copy吧
      

  14.   

    seek(long pos);利用RandomAccessFile用的seek()方法来确定你要写或者读的位置,然后进行操作
      

  15.   

    如果按照楼主的意思,那么只要seek(0);然后再写入东西
      

  16.   

    windows的文件系统应该不支持文件的插入操作,windows API里应该没有那种操作,就是Unix下的c语言的文件操作也提供那样的功能呀,运行.class的虚拟机本身就是个普通软件(区别于操作系统),它自己的功能实现不也是要用到操作系统提供的API么?? 如果操作系统不提供文件的插入操作,那就不可能做到。
      

  17.   

    文件的插入操作最后肯定是做了处理的,一定要遍历。因为windows API和unix的c只有文件的追加操作。
      

  18.   

    Cute solution: read more records, eg.3 or more.
    I know that is a god damn answer, however, if you set out to employ Copy solution, so why not take FileWriter or PrintWriter or so on classes like that?Because first I said I thought u want the efficiency, huh?
    But you know in the windows OS itself, it employ CopyFileEx function to handle the copy enquiry. Besides, Copy, this action is a read & write process. so its efficiency is totally the same as FileWriter which is based on the Byte.I slao said already the most XP solution is employing things like Notepad coz' it possess the equal efficiency as the Copy, u might deem it is retard coz' it lost the time on GUI. so you know. Regards
      

  19.   

    问题是 调用cmd的句子是:
    Process proces  = Runtime.getRuntime().exec("cmd.exe /c start copy d:\\test.csv /b +d:\\sample.csv /b d:\\c.csv /Y/b");打开了dos窗口 郁闷阿?  有啥办法关掉吗?如果我去了 start 那么就不执行,如果去了 /c  也不拷贝。晕阿  救命
      

  20.   

    在调用cmd的时候,有没有可以去掉dos窗口的方法?
      

  21.   

    同样关注,不过感觉有点mission impassable