基于大文本文件的文本读取查找

时间:2023-02-11 08:40:52

一、

1、本地磁盘读取大文件(可能是本地记事本打不开的文本文件),并获取需要的某个数据,显示一共有多少条数据----大数据文本浏览器

    public static  int  getLine() throws FileNotFoundException, IOException 
    {                           //获得行数
        int line=0;
        String path="F:\\data\\kaifang.txt";
        InputStream fin=new FileInputStream(path);//创建文件读取流
        Scanner  sc=new Scanner (fin,"GBK");//扫描文件
        while(sc.hasNextLine())
        {
            String rdstr=sc.nextLine();
            if(rdstr.contains("嘿嘿"))
            {
                System.out.println(rdstr);//打印 可以打印某一行的数据内容
            }
            line++;
        } 
        fin.close();
        sc.close();
        return line; //可以返回数据的行数
            
    }

2、加载到内存,实现快速查找  二次赋值实现索引快速读取读取文件

生成索引用到了随机存取文件RandomAccessFile及方法 raf.seek(index[line]);

     public static  void init(     int [] index) throws FileNotFoundException, IOException
     {
         System.out.println("init start");
        int line=0;
        String path="F:\\data\\kaifang.txt";
        InputStream fin=new FileInputStream(path);//创建文件读取流
        Scanner  sc=new Scanner (fin,"GBK");//扫描文件
        while(sc.hasNextLine()  )
        {
            if(line<index.length)//避免越界
            {
                 String rdstr=sc.nextLine();
                 index[line]=rdstr.length();//获取每一行长度
                 line++;
            }
            else
            {
                break;
            }
          
        }
        //11  12   15  14   19  21
        //11  23   38  52   71  92
        //完成索引
        for(int j=1;j<index.length;j++)
        {
            index[j]+=index[j-1];
        }
       fin.close();
       sc.close();
         
            System.out.println("init end");
     }


        //数据显示
     public static void show(int [] index,int line ) throws FileNotFoundException, IOException
     {
             System.out.println("show start");
            String path="F:\\data\\kaifang.txt";
            RandomAccessFile  raf=new   RandomAccessFile(path,"r");//只读的打开随机访问数据流
            raf.seek(index[line]);//移动文件指针
            for(int i=0;i<5;i++)    //一次显示5条数据
            {
               String str1=new String(raf.readLine().getBytes("ISO-8859-1"),"GBK");
               System.out.println(str1);
            }
            raf.close();
         
            System.out.println("show end");
     }
编写测试类
    public static void main(String[] args) throws FileNotFoundException, IOException 
    {
        //20151574
        //System.out.println(getLine());
        int [] index =new int[20151574];
        init(index);//初始化
        
        while(true)
        {
            String inputstr=JOptionPane.showInputDialog("输入你要查看的行数:");
            int line=Integer.parseInt(inputstr);//数据转换,输入默认是字符串
            show( index,line );
  
        }
    }
数组index[]两次赋值:
索引一:当前行的字节数

索引二:当前行前边所有行的字节数

可以search()或者show()方法中,可以如上RandomAccessFile辅助进行索引查询,也可以直接进行遍历查找。

上读的是int数组读的时长度,下着直接读的是内容。

二、磁盘本地实现某一数据或者多个数据在数量级文本文件中的查找

    public static void main(String[] args) throws FileNotFoundException 
    {
        String [] QQ=new String[] { "1111","222","222","3333","444","555","666","777"};
              
        String path="F:\\data\\1E~001.txt";
        InputStream fin=new FileInputStream (path);
        Scanner sin=new    Scanner(fin);
        while(sin.hasNextLine())
        {
            String readstr=sin.nextLine();
           
           for(String myqq:QQ)
           {
                if(readstr.contains(myqq))
                {
                     System.out.println(readstr);
                }
           }
        }
    }
三 、将文本文件加载内存,查询某一个数据的详细内容

     public static  void init(String [] strs) throws FileNotFoundException, IOException
     {
         System.out.println("init start");
        String path="F:\\data\\1E~001.txt";
        InputStream fin=new FileInputStream(path);//创建文件读取流
        Scanner  sc=new Scanner (fin,"GBK");//扫描文件
        int i=0;
        while(sc.hasNextLine()  )
        {
            if(i< strs.length)
            {
                 String rdstr=sc.nextLine();
                 strs[i]=rdstr;
                 i++;
            }
            else
            {
                break;
            }
        }
        
       fin.close();
       sc.close();
         
       System.out.println("init end");
     }
     public  static void search(String str, String [] strs)
     {
         for(String strall:strs)
         {
             if(strall.contains(str))
             {
                 System.out.println(strall);
             }
         }
         
     }
    public static void main(String[] args) throws IOException 
    {
       final int N=10;
       String [] strs=new String[N];
       init( strs) ;
       
         while(true)
        {
            String inputstr=JOptionPane.showInputDialog("输入你查询的数据");
          
             search(inputstr,strs);
        }
    }


.