有人可以帮助我让缓冲读者在Java中工作吗?

时间:2014-04-03 14:25:26

标签: java bufferedreader

这里我试图阅读一个包含单词和相应缩写的文档。例如。

one,1
two,2
easy,ez

每一行都是分开的,并且用逗号将这些单词与缩写分开。


当我希望缓冲的阅读器继续使用

读取行时
while ((line = br.readLine()) != null)

它赢了。它只会读取第一行。这意味着它将显示一个的缩写,即1.但如果我输入另一个值,则为2,我收到此错误消息。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
    at java.lang.String.charAt(String.java:658)
    at shortener.NewClass.Short(NewClass.java:41)
    at shortener.NewClass.main(NewClass.java:26)
Java Result: 

这里是代码

public static String Short(String input) {

    try {
        FileReader fr = new FileReader("abbreviations.txt");
        BufferedReader br = new BufferedReader(fr);

        String line;
        while ((line = br.readLine()) != null) {

            for(int i = 0; i <= line.length(); i++) {
                if(line.charAt(i) == ','){
                    String strOrig = line.substring(0, i);
                    if(strOrig.equals(input)) {
                        String strAbv = line.substring(line.length()-1);
                        return strAbv;
                        }
                    }                
                }
            }   
        br.close();
        } catch (IOException e) {
        out.println("File Not found");
    }
    return null;
}

3 个答案:

答案 0 :(得分:1)

这是不正确的:

for(int i = 0; i <= line.length(); i++) {

因为访问太多了。纠正:

for(int i = 0; i < line.length(); i++) {

请注意,如果找到缩写,则发布的代码不会close()阅读器。使用finally阻止或try-with-resources语句来确定读者已关闭。

其他:

  • String.split()可用于将行分成两个令牌,而不是显式编码分隔。
  • Properties样式文件可用于存储缩写到期限地图,而不是逗号分隔文件。 Properties类提供了一种加载文件的机制和搜索地图的方法:

       // If the 'abbreviations.txt' file is not updated
       // by the program then arrange for it to be loaded once.
       //
       try (final FileInputStream is =
                new FileInputStream("abbreviations.txt"))
       {
           final Properties p = new Properties();
           p.load(is);
           return p.getProperty(input);
       }
    

答案 1 :(得分:0)

您已将for循环中的条件表达式设为 i小于或等于line.length()。那是错的。i不应该等于行的长度。改变这个

for(int i = 0; i <= line.length(); i++)

for(int i = 0; i < line.length(); i++)

你不能使i等于行长。索引从0开始。因此,有效索引将从0length-1

答案 2 :(得分:0)

查看代码的for循环部分:

for(int i = 0; i <= line.length(); i++) {

应该改为:

for(int i = 0; i < line.length(); i++) {

注意<=如何更改为<

for(int i = 0; i <= line.length(); i++) {
//vs:
for(int i = 0; i < line.length(); i++) {

对于几乎所有编码,包括java,计数从0开始。所以你通常会说5,在编码中你会说4。

我们假设数组的长度为3,这意味着它包含012。所以,当这样做时:

for(int i = 0; i <= line.length(); i++) {
//length of the line is 3, so:
for(int i = 0; i <= 3; i++) {

现在,它会循环抛出数字0123。但是,该行仅包含012。所以,如果我们这样做:

for(int i = 0; i < line.length(); i++) {
//length of the line is 3, so:
for(int i = 0; i < 3; i++) {

使用这个新代码,它会循环抛出012,与我们的行01的长度相同,和2