[英]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.