Java 使用和不使用GZip和Jar文件(内存中的GZip?)访问给定行文本文件的最快方法

Java 使用和不使用GZip和Jar文件(内存中的GZip?)访问给定行文本文件的最快方法,java,gzip,text-files,Java,Gzip,Text Files,我已经给出了大量(5-7)的大型UTF8文本文件(7MB)。在unicode中,它们的大小约为15MB 我需要加载给定文件的给定部分。这些文件是已知的,不会更改。我想尽快进入并装载give place的管线。我通过添加HTML标记加载这些行,并将它们显示在一个窗格中。我知道瓶颈将是JEditorPane对生成的HTML的渲染,但现在我想集中讨论文件访问性能 此外,用户可以在所有文件中搜索给定的单词 目前,我使用的代码是: private static void loadFile(String f

我已经给出了大量(5-7)的大型UTF8文本文件(7MB)。在unicode中,它们的大小约为15MB

我需要加载给定文件的给定部分。这些文件是已知的,不会更改。我想尽快进入并装载give place的管线。我通过添加HTML标记加载这些行,并将它们显示在一个窗格中。我知道瓶颈将是JEditorPane对生成的HTML的渲染,但现在我想集中讨论文件访问性能

此外,用户可以在所有文件中搜索给定的单词

目前,我使用的代码是:

private static void loadFile(String filename, int startLine, int stopLine) {
    try {
        FileInputStream fis = new FileInputStream(filename);                
        InputStreamReader isr = new InputStreamReader(fis, "UTF8");
        BufferedReader reader = new BufferedReader(isr);
        for (int j = startLine; j <= stopLine; j++) {
            //here I add HTML tags
            //or do string comparison in case of search by the user 
            sb.append(reader.readLine());
        }
        reader.close();
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e) {
        System.out.println(e);
    }
}
private静态void加载文件(字符串文件名、int-startLine、int-stopLine){
试一试{
FileInputStream fis=新的FileInputStream(文件名);
InputStreamReader isr=新的InputStreamReader(fis,“UTF8”);
BufferedReader读取器=新的BufferedReader(isr);

对于(int j=startine;j如果文件真的不经常更改,我建议使用其他一些数据结构。创建一个包含所有显示的单词和位置的哈希表将使搜索速度大大加快,创建所有行起始位置的索引将使搜索速度大大加快

但是,要更直接地回答您的问题:

  • 是的,一个大文件可能仍然比许多小文件好,我怀疑从UTF8读取一行代码和解码与打开许多文件或解压缩许多文件相比是否值得注意

  • 是的,解压过程是在内存中执行的,并且是动态的。它在您请求数据时发生,但作为一个缓冲流,它将一次解压整个块,因此实际上非常有效

  • 我无法直接修复您的代码,但我可以建议您查找getResourceAsStream: 这个函数将打开zip/jar文件中的一个文件,并允许您以流的形式访问它,在您使用它时在内存中自动解压缩它

  • 如果您将其视为一种资源,java将为您完成所有工作,您必须阅读一些处理资源的细节,但是java应该相当智能地处理它

  • 我认为将文件加载到内存会更快。然后,您可以快速切换到文件的任何部分。 看看这个

  • GZipInputStream将文件作为缓冲流读入内存

  • 这完全是另一个问题:)

  • 同样,zip文件将在内存中解压缩,具体取决于打开它所使用的类


  • 你还没有解释为什么不能将文件加载到内存中,因为这是最快的。100 MB的内存并不多,这取决于你的系统。彼得:这个程序很简单。显示部分文本文件并搜索它们。我被要求编写“可移植”的程序尽可能。这意味着可以在世界各地的许多不同系统上使用,当然也可以在旧机器上使用。当我签入启动管理器(windows)时,只有少数程序使用超过100MB的内存,所以我告诉自己这是一个很好的限制。此外,如果进行了其他翻译,并且我达到了10个或更多文件,我可以很容易地在使用的内存中变大。你同意吗?此外,当我将生成的HTML放入JEditorFrame中时,速度瓶颈是。你可以检查最大内存JVM拥有并决定是使用更快的选项加载所有内容,还是使用更慢但内存效率更高的选项根据需要读取行。内存效率和速度之间通常存在权衡(这就是为什么拥有更多内存可以使系统更快的原因)在可移植性方面,您也需要一种有效地检查大文件的方法(但性能会受到影响),我同意,尤其是在内存和速度之间的权衡。这让我认为我应该让用户决定!我认为我将对这两种解决方案进行编程,并让用户决定。
    private static void loadFile(String filename, int startLine, int stopLine) {
        try {                           
            GZIPInputStream zip = new GZIPInputStream(this.class.getResourceAsStream("resources/"+filename));            
            InputStreamReader isr = new InputStreamReader(zip, "UTF8");
            BufferedReader reader = new BufferedReader(isr);
            for (int j = startLine; j <= stopLine; j++) {
                //here I add HTML tags
                //or do string comparison in case of search by the user 
                sb.append(reader.readLine());
            }
            reader.close();
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }
    }