搜索文件中的字符串,并将匹配的行写入Java中的另一个文件

Gee*_*eta 6 java file-io

为了在文件中搜索字符串并将匹配字符串的行写入另一个文件,对于70MB(压缩状态)的单个zip文件,需要15-20分钟.有没有办法减少它.

我的源代码:

获取Zip文件条目

zipFile = new ZipFile(source_file_name);

entries = zipFile.entries();

while (entries.hasMoreElements())

{ ZipEntry entry = (ZipEntry)entries.nextElement();

if (entry.isDirectory()) 
{ 
continue; 
} 
searchString(Thread.currentThread(),entry.getName(), new BufferedInputStream (zipFile.getInputStream(entry)), Out_File, search_string, stats); }

zipFile.close();
Run Code Online (Sandbox Code Playgroud)

搜索字符串

public void searchString(Thread CThread, String Source_File, BufferedInputStream in, File outfile, String search, String stats) throws IOException

{ 

    int count = 0; 
    int countw = 0; 
    int countl = 0; 
    String s; 
    String[] str; 
    BufferedReader br2 = new BufferedReader(new InputStreamReader(in)); 
    System.out.println(CThread.currentThread()); 

        while ((s = br2.readLine()) != null) 
        { 
            str = s.split(search); 
            count = str.length - 1; 
            countw += count; //word count 
            if (s.contains(search)) 
            { 
            countl++;  //line count 
            WriteFile(CThread,s, outfile.toString(), search); 
            } 
        } 

    br2.close(); 
    in.close(); 


} 

--------------------------------------------------------------------------------

public void WriteFile(Thread CThread,String line, String out, String search) throws IOException

{ 
    BufferedWriter bufferedWriter = null; 
    System.out.println("writre thread"+CThread.currentThread()); 
    bufferedWriter = new BufferedWriter(new FileWriter(out, true)); 
    bufferedWriter.write(line); 
    bufferedWriter.newLine(); 
    bufferedWriter.flush(); 
} 
Run Code Online (Sandbox Code Playgroud)

请帮我.对于使用线程的10个文件,它实际上需要40分钟,在压缩后,对于70MB的单个文件,它需要15到20分钟.任何最小化时间的方法.

Uri*_*Uri 3

我不确定您看到的成本是来自磁盘操作还是来自字符串操作。我现在假设问题出在字符串上,您可以通过编写一个测试驱动程序来检查,该驱动程序使用同一行一遍又一遍地运行您的代码。

我可以告诉你,在你的情况下,这split()非常昂贵,因为你正在生产不需要的字符串,然后回收它们,从而产生很大的开销。您可能希望使用 -Xmx 增加 JVM 的可用空间量。

如果您只是通过空格来分隔单词,那么您可以使用在循环之前创建的正则表达式匹配器并将其应用于字符串,效果会更好。应用于给定字符串时的匹配数将是您的字数,并且不应该创建字符串数组(这是非常浪费的并且您不使用它)。您将在 JavaDocs 中看到 split 确实通过正则表达式起作用;这是事实,但是 split 执行了创建单独字符串的额外步骤,这可能就是您的浪费。

您还可以使用正则表达式来搜索匹配项,而不是包含,尽管这可能不会快得多。

您可以通过使用多个线程使事情并行。但是,如果 split() 是您悲伤的原因,那么您的问题是开销和堆空间耗尽,因此您不一定会从中受益。

更一般地说,如果您需要经常这样做,您可能需要使用对字符串操作更“友好”的语言编写脚本。Python 中的 10 行脚本可以更快地完成此任务。