Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FileReader中的read()方法如何在文件中移动?_Java_File_Io - Fatal编程技术网

Java FileReader中的read()方法如何在文件中移动?

Java FileReader中的read()方法如何在文件中移动?,java,file,io,Java,File,Io,所以我写了一个程序,读取一个特定的文件,并返回每个字符的使用频率。这是通过使用单链接列表(不是java LinkedList,但非常类似)实现的。我想知道的是为什么会这样: while(txtFile.read() != -1){ Character letter = (char) txtFile.read(); freqBag.add(Character.toLowerCase(letter)); } int c; w

所以我写了一个程序,读取一个特定的文件,并返回每个字符的使用频率。这是通过使用单链接列表(不是java LinkedList,但非常类似)实现的。我想知道的是为什么会这样:

 while(txtFile.read() != -1){
             Character letter = (char) txtFile.read();
             freqBag.add(Character.toLowerCase(letter));
        }
 int c;
 while((c = txtFile.read()) != -1){
             Character letter = (char) c;
             freqBag.add(Character.toLowerCase(letter));
        }
不起作用(它不会返回给定字符的正确频率),原因如下:

 while(txtFile.read() != -1){
             Character letter = (char) txtFile.read();
             freqBag.add(Character.toLowerCase(letter));
        }
 int c;
 while((c = txtFile.read()) != -1){
             Character letter = (char) c;
             freqBag.add(Character.toLowerCase(letter));
        }

工作。我写了第一个,一个朋友帮我修复了它。

首先,你需要记住,当你调用read方法时,你已经从文件中读取了一个字节,所以如果你在while语句中读取,你会丢失一个字节


第二件事是,对我来说(考虑到运算符优先级),这两段代码的作用完全相同,因此问题可能出现在代码的其他部分。

它不起作用,因为您正在丢弃字符。每个read()函数返回下一个字节(作为有符号整数),因此代码将删除每个偶数字符(0、2、4…)

您朋友的代码也不应该工作:

int c;           // variable outside the loop
while((c = txtFile.read()) != -1){  // Read a character into c, compare to -1
    Character letter = (char) txtFile.read();  // Read another character
    freqBag.add(Character.toLowerCase(letter));  // Store this letter
}
正确的方法是只读取一次:

int c;
while((c = txtFile.read()) != -1) {
    freqBag.add(Character.toLowerCase((char)c));
}

我怀疑您可能是打字错误,或者您使用了不同的文件,但没有意识到信件仍在丢失。

两者都不起作用。它们都只处理偶数字符。哦,是的,这是一个打字错误。当字符字母=(char)c;,它就起作用了;。谢谢你的解释!