所以我有一个分配,要求我“逐行搜索一个给定字符串的文件。输出必须包含行号和行本身,例如,如果单词文件被选中,输出看起来像
5:他有文件
9:文件是他的
void Search(String input) throws IOException {
int x = 1;
FileReader Search = new FileReader(f);
Scanner in = new Scanner(f);
LineNumberReader L = new LineNumberReader(Search, x);
StreamTokenizer token = new StreamTokenizer(Search);
while (in.hasNextLine())
{
try
{
if (!in.findInLine(input).isEmpty())
{
display(Integer.toString(L.getLineNumber()) + ": " + L.readLine(), "\n");
in.nextLine();
}
} catch (NullPointerException e)
{
System.out.println("Something Happened");
in.nextLine();
}
}
}
到目前为止,我需要通过我的代码找出3个问题。
答案 0 :(得分:2)
你的主要问题是......
FileReader Search = new FileReader(f);
Scanner in = new Scanner(f);
LineNumberReader L = new LineNumberReader(Search, x);
StreamTokenizer token = new StreamTokenizer(Search);
while (in.hasNextLine())
{
你基本上打开了两个针对同一个文件的文件阅读器,但你似乎期望他们相互了解。您提前Scanner
,但这对LineNumberReader
没有影响。这会混淆报告和线条阅读过程。
从Scanner
阅读应该更像......
while (in.hasNextLine()) {
String text = in.nextLine();
话虽如此,我实际上放弃Scanner
支持LineNumberReader
,因为它会为您提供更多有用的信息,否则您必须自己做。
例如......
FileReader Search = new FileReader(new File("TestFile"));
LineNumberReader L = new LineNumberReader(Search, x);
String text = null;
while ((text = L.readLine()) != null) {
// Convert the two values to lower case for comparison...
if (text.toLowerCase().contains(input.toLowerCase())) {
System.out.println(L.getLineNumber() + ": " + text);
}
}