繁体   English   中英

Java帮助从文件读取

[英]Java help reading from a file

我有一段代码,我只是不知道该怎么办。 它应该显示一个对话框来选择一个文件,选择该文件后,它将在直方图中输出结果。 我有一切工作,除了我无法弄清楚我需要把什么变量作为text2。

private int[] countLetters2()
 {
  // Count for 26 letters
  int[] count = new int[26];

  //get contents from file  
  chooser.showOpenDialog(null);
  File f = chooser.getSelectedFile();

  try
  {
   FileReader fr = new FileReader(f);
   BufferedReader br = new BufferedReader(fr);
   String s;
   while((s = br.readLine()) != null)
   {
    System.out.println(s);   <------simply to see if the reader and buffer were working

   }
  }
  catch(IOException g) {} 


  String text2 = ; <------------------------------------this is the problem

  //converts every letter to uppercase
  text2 = text2.toUpperCase();  

  //Count occurrence of each letter (case insensitive)
  for (int i = 0; i < text2.length(); i++)
  {
   char character = text2.charAt(i);

   if ((character >= 'A') && (character <= 'Z'))
   {
    count[(int)character - 65]++; // The ASCII for 'A' is 65
   }
  }
  return count; // Return the count array 

只需收集到while循环内的text2变量即可。

         String text2 = "";
            try { FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); String s="" while((s = br.readLine()) != null) {
text2+=s; 
ystem.out.println(s);

            } } catch(IOException g) {}

要么

String s = "";
            try { FileReader fr = new FileReader(f); 
            BufferedReader br = new BufferedReader(fr);
            String tmp;
            while((tmp = br.readLine()) != null) {              
                System.out.println(s);
                s += tmp;
            } } catch(IOException g) {}

            text2=tmp;

将计数字符的循环移到打印行的循环中。 就像是

private int[] countLetters2()
 {
  // Count for 26 letters
  int[] count = new int[26];

  //get contents from file  
  chooser.showOpenDialog(null);
  File f = chooser.getSelectedFile();

  try
  {
   FileReader fr = new FileReader(f);
   BufferedReader br = new BufferedReader(fr);
   String s;
   while((s = br.readLine()) != null)
   {
    System.out.println(s);   
    //converts every letter to uppercase
    String text2 = s.toUpperCase();  

    //Count occurrence of each letter (case insensitive)
    for (int i = 0; i < text2.length(); i++)
    {
       char character = text2.charAt(i);

       if ((character >= 'A') && (character <= 'Z'))
       {
        count[(int)character - 65]++; // The ASCII for 'A' is 65
       }
    }
   }
  }
  catch(IOException g) {} 

  return count;
 }

我认为使用BufferedReader逐行浏览文件,然后逐字符逐行浏览是没有意义的。 鉴于您基本上只想遍历所有字符,因此这是不必要的复杂且效率低下的操作:这正是Reader为您提供的功能。

您可以像这样大大简化您的例程:

    [...]

    BufferedReader br = new BufferedReader(fr);
    for (int c; (c = br.read()) > -1;) {
        char character = Character.toUpperCase((char) c);

        if ((character >= 'A') && (character <= 'Z')) {
            count[character - 'A']++;
        }
    }
} catch (IOException g) { /* this is no good */ }

return count;

这样一来,您便完全摆脱了text2的代码,并且由于丢弃了不必要的String构造,因此您的程序将运行得更快(如果可以衡量)。

PS:无关的注释:请确保处理用户在文件选择器对话框中单击“取消”的情况。

PPS:用户是否可以在程序中无意中选择目录而不是适当的文件? 那会发生什么呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM