分割文件 – Java / Linux

我有一个大文件包含近2.5亿字符。 现在我想把它分成三部分,每部分包含三千万字(前八部分包含三千万,最后一部分包含一千万字)。 还有一点是,我想在下一部分的开始处包含每个文件的最后1000个字符(表示第2部分开始时第1部分的最后1000个字符附加 – 因此,第2部分包含3000万个字符,等等)。 任何人都可以帮助我如何做programmaticaly(使用Java)或使用Linux命令(以一种快速的方式)。

一种方法是使用常规的unix命令来拆分文件,并在前面的文件中加上前1000个字节。

首先分割文件:

split -b 30000000 inputfile part. 

然后,为每个部分(忽略farst从前一个最后1000个字节开始创建一个新文件:

 unset prev for i in part.* do if [ -n "${prev}" ] then tail -c 1000 ${prev} > part.temp cat ${i} >> part.temp mv part.temp ${i} fi prev=${i} done 

在汇编之前,我们再次遍历文件,忽略第一个,丢弃前1000个字节:

 unset prev for i in part.* do if [ -n "${prev}" ] then tail -c +1001 ${i} > part.temp mv part.temp ${i} fi prev=${i} done 

最后一步是重新组合文件:

 cat part.* >> newfile 

由于没有解释为什么需要重叠,我只是创建它,然后把它扔掉。

只要使用适当的选项split或csplit命令。

您可能希望使用更复杂的shell脚本或使用其他脚本语言来驱动这些程序,为其提供适当的参数(特别是处理重叠要求)。 也许你可以将它们与其他工具(如grepheadtailsedawk等)结合起来。

你可以试试这个 我不得不第一次使用read / mode,因为这个文件一开始不存在。 Youc使用只读,如代码所示。

 long start = System.nanoTime(); long fileSize = 3200 * 1024 * 1024L; FileChannel raf = new RandomAccessFile("deleteme.txt", "r").getChannel(); long midPoint = fileSize / 2 / 4096 * 4096; MappedByteBuffer buffer1 = raf.map(FileChannel.MapMode.READ_ONLY, 0, midPoint + 4096); MappedByteBuffer buffer2 = raf.map(FileChannel.MapMode.READ_ONLY, midPoint, fileSize - midPoint); long time = System.nanoTime() - start; System.out.printf("Took %.3f ms to map a file of %,d bytes long%n", time / 1e6, raf.size()); 

这是运行在一个窗口7 x64框与4 GB的内存。

 Took 3.302 ms to map a file of 3,355,443,200 bytes long 

你可以使用BreakIterator类和它的静态方法getCharacterInstance()来完成。 它为默认语言环境的字符分隔返回一个新的BreakIterator实例。

你也可以使用getWordInstance(),getLineInstance()来打破单词,行…等等

例如:

 BreakIterator boundary = BreakIterator.getCharacterInstance(); boundary.setText("Your_Sentence"); int start = boundary.first(); int end = boundary.next(); 

Iterate over it... to get the Characters....

For more detail look at this link:

http://docs.oracle.com/javase/6/docs/api/java/text/BreakIterator.html