Java 逐字符读取文件并在其中查找输入字符串

Java 逐字符读取文件并在其中查找输入字符串,java,file,bufferedreader,Java,File,Bufferedreader,我有一个文件,我需要逐字读取并找到输入字符串。我需要返回“输入字符串”在文件中出现的次数,但我只需要逐字读取文件 我想出了下面的代码,但是我在通过逐字符读取来找出文件中的字符串时遇到了问题。我先迭代for循环,然后在while循环中迭代,但是如果char不匹配,那么我需要从for循环重新开始,我不知道怎么做 public static void main(String[] args) throws IOException { String input = "hello world";

我有一个文件,我需要逐字读取并找到输入字符串。我需要返回“输入字符串”在文件中出现的次数,但我只需要逐字读取文件

我想出了下面的代码,但是我在通过逐字符读取来找出文件中的字符串时遇到了问题。我先迭代for循环,然后在while循环中迭代,但是如果char不匹配,那么我需要从for循环重新开始,我不知道怎么做

  public static void main(String[] args) throws IOException {
    String input = "hello world"; // "hello";
    handleFile(new File("some_file"), input);
  }

  private static int handleFile(File file, String input) throws IOException {
    int count = 0;
    try (BufferedReader br =
        new BufferedReader(new InputStreamReader(new FileInputStream(file),
            Charset.forName("UTF-8")))) {
      char[] arr = input.toCharArray();
      int r;

      // confuse here what logic I should have here?
      for (char a : arr) {
        while ((r = br.read()) != -1) {
          char ch = (char) r;
          if (ch == a) {
            break;
          }
        }
      }
    }

    return count;
  }

因此,从概念上讲,您需要保持匹配字符数的偏移量,每次出现不匹配时,您都会将偏移量重置回
0
。此偏移量用于确定输入中的给定字符是否与文件中的下一个字符匹配

一个简单的实现可能看起来像

String value = "Thistestistestatesttest";
String input = "test";

int offset = 0;
int matches = 0;
for (char next : value.toCharArray()) {
    if (next == input.charAt(offset)) {
        offset++;
        if (offset == input.length()) {
            matches++;
            offset = 0;
        }
    } else {
        offset = 0;
    }
}
System.out.println("Found " + matches);
注意,我特意使用了
字符串作为源代码,这样您就可以测试它,更好地理解它是如何工作的,并将逻辑实现为您自己的解决方案

现在,如果你花时间去桌面检查问题,它可能看起来像

+======+========+==============+=======+x
| Next | offset | offset value | match |
+======+========+==============+=======+
| T    |      0 | t            | false |
+------+--------+--------------+-------+
| h    |      0 | t            | false |
+------+--------+--------------+-------+
| i    |      0 | t            | false |
+------+--------+--------------+-------+
| s    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| i    |      0 | t            | false |
+------+--------+--------------+-------+
| s    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| a    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+

因此,从概念上讲,您需要保持匹配字符数的偏移量,每次出现不匹配时,您都会将偏移量重置回
0
。此偏移量用于确定输入中的给定字符是否与文件中的下一个字符匹配

一个简单的实现可能看起来像

String value = "Thistestistestatesttest";
String input = "test";

int offset = 0;
int matches = 0;
for (char next : value.toCharArray()) {
    if (next == input.charAt(offset)) {
        offset++;
        if (offset == input.length()) {
            matches++;
            offset = 0;
        }
    } else {
        offset = 0;
    }
}
System.out.println("Found " + matches);
注意,我特意使用了
字符串作为源代码,这样您就可以测试它,更好地理解它是如何工作的,并将逻辑实现为您自己的解决方案

现在,如果你花时间去桌面检查问题,它可能看起来像

+======+========+==============+=======+x
| Next | offset | offset value | match |
+======+========+==============+=======+
| T    |      0 | t            | false |
+------+--------+--------------+-------+
| h    |      0 | t            | false |
+------+--------+--------------+-------+
| i    |      0 | t            | false |
+------+--------+--------------+-------+
| s    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| i    |      0 | t            | false |
+------+--------+--------------+-------+
| s    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| a    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+

因此,从概念上讲,您需要保持匹配字符数的偏移量,每次出现不匹配时,您都会将偏移量重置回
0
。此偏移量用于确定输入中的给定字符是否与文件中的下一个字符匹配。因此,您希望在文件中查找“输入字符串”,并且它在文件中出现的时间必须与所有字符匹配??因为我不明白为什么要逐字符读取文件。因此,从概念上讲,您需要保持匹配字符数的偏移量,每次出现不匹配时,您都将偏移量重置回
0
。此偏移量用于确定输入中的给定字符是否与文件中的下一个字符匹配。因此,您希望在文件中查找“输入字符串”,并且它在文件中出现的时间必须与所有字符匹配??因为我不明白你为什么要一个字符一个字符地读文件。是的,我现在知道了。很好的解释。。谢谢你。。另外,如果文件太大,无法放入内存,则不会耗尽内存,对吗?因为我们是一个字符一个字符地读取,这确实是最快、最有效的方法?@flash如果你是一个字符一个字符地读取文件,你不会有任何内存问题,因为只有输入、偏移量和下一个值被管理。我现在得到了它。很好的解释。。谢谢你。。另外,如果文件太大,无法放入内存,则不会耗尽内存,对吗?因为我们是一个字符一个字符地读取,而这确实是最快、最有效的方法?@flash如果您是一个字符一个字符地读取文件,您不会有任何内存问题,因为只有输入、偏移和下一个值被管理