Java-正在读取的文件返回null
您好,我正在将一个文件加载到我的程序中并分配每个值(存储在一个数组的新行上),我似乎无法发现为什么每个索引中包含文件内容的数组都为空Java-正在读取的文件返回null,java,arrays,bufferedreader,Java,Arrays,Bufferedreader,您好,我正在将一个文件加载到我的程序中并分配每个值(存储在一个数组的新行上),我似乎无法发现为什么每个索引中包含文件内容的数组都为空 private void readAndProcessWords() { try { FileReader _fr = new FileReader(FILEPATH); BufferedReader textReader = new BufferedReader(_fr); int numLine
private void readAndProcessWords() {
try {
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
int numLines = getNumLines(textReader);
String[] words = new String[numLines];
for(int i=0;i<numLines;i++){
words[i] = textReader.readLine();
System.out.println(words[i]);
}
//clears memory reserved for this buffered reader
textReader.close();
} catch(IOException e) {
System.out.println(e);
}
}
private int getNumLines(BufferedReader textReader) throws IOException{
String line;
int numLines =0;
while((line = textReader.readLine()) != null){
numLines++;
}
return numLines;
}
}
最简单的解决方案是重新创建
读取器
,问题是调用getNumLines()
会将BufferedReader中的位置移动到文件末尾
BufferedReader textReader = new BufferedReader(_fr);
int numLines = getNumLines(textReader); // <-- textReader is at EOF after this.
textReader.close();
textReader = new BufferedReader(_fr);
BufferedReader textReader=新的BufferedReader(_-fr);
int numLines=getNumLines(文本阅读器);// 最简单的解决方案是重新创建读取器
,问题是调用getNumLines()
会将BufferedReader中的位置移动到文件末尾
BufferedReader textReader = new BufferedReader(_fr);
int numLines = getNumLines(textReader); // <-- textReader is at EOF after this.
textReader.close();
textReader = new BufferedReader(_fr);
BufferedReader textReader=新的BufferedReader(_-fr);
int numLines=getNumLines(文本阅读器);// 不要通过两次读取文件来获取行数(这很慢,很烦人,如果文件在两次调用之间更改,则无法工作),而是将行读取到一个大小可变的列表中:
private void readAndProcessWords() {
try {
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
List<String> words = new ArrayList<>();
String line;
while ((line = textReader.readLine()) != null) {
words.add(line);
}
textReader.close();
for (String word : words) {
System.out.println(word);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void readAndProcessWords(){
试一试{
FileReader _fr=新的FileReader(FILEPATH);
BufferedReader textReader=新的BufferedReader(_fr);
List words=new ArrayList();
弦线;
而((line=textReader.readLine())!=null){
添加(行);
}
textReader.close();
for(字符串字:字){
System.out.println(word);
}
}捕获(IOE异常){
抛出新的运行时异常(e);
}
}
好消息:这个功能,所以你不需要重写它
private void readAndProcessWords() {
try {
List<String> words = Files.readAllLines(Paths.get(FILEPATH));
for (String word : words) {
System.out.println(word);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void readAndProcessWords(){
试一试{
List words=Files.readAllLines(path.get(FILEPATH));
for(字符串字:字){
System.out.println(word);
}
}捕获(IOE异常){
抛出新的运行时异常(e);
}
}
不要通过两次读取文件来获取行数(这很慢,很烦人,如果文件在两次调用之间发生更改,则无法工作),而是将行读取到一个可变大小的列表中:
private void readAndProcessWords() {
try {
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
List<String> words = new ArrayList<>();
String line;
while ((line = textReader.readLine()) != null) {
words.add(line);
}
textReader.close();
for (String word : words) {
System.out.println(word);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void readAndProcessWords(){
试一试{
FileReader _fr=新的FileReader(FILEPATH);
BufferedReader textReader=新的BufferedReader(_fr);
List words=new ArrayList();
弦线;
而((line=textReader.readLine())!=null){
添加(行);
}
textReader.close();
for(字符串字:字){
System.out.println(word);
}
}捕获(IOE异常){
抛出新的运行时异常(e);
}
}
好消息:这个功能,所以你不需要重写它
private void readAndProcessWords() {
try {
List<String> words = Files.readAllLines(Paths.get(FILEPATH));
for (String word : words) {
System.out.println(word);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void readAndProcessWords(){
试一试{
List words=Files.readAllLines(path.get(FILEPATH));
for(字符串字:字){
System.out.println(word);
}
}捕获(IOE异常){
抛出新的运行时异常(e);
}
}
由于缓冲读取器是一个对象,您将其作为对getNumLines()
的引用传递,而不是作为副本传递,因此当您在发送给getNumLines()
的同一缓冲读取器上运行readLine()
时,最终会得到一个空值,因为您已经运行了.readLine()
运行getNumLines()
后,使用新的缓冲读取器关闭并重新打开文档
我还记得java中有一个用于缓冲读取器的Mark()
和Recall()
方法,也可以作为一种解决方法
我想是的
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
textReader.Mark();
int numLines = getNumLines(textReader);
textReader.Recall();
String[] words = new String[numLines];
for(int i=0;i<numLines;i++)
{
words[i] = textReader.readLine();
System.out.println(words[i]);
}
//clears memory reserved for this buffered reader
textReader.close();
FileReader\u fr=新的FileReader(FILEPATH);
BufferedReader textReader=新的BufferedReader(_fr);
text reader.Mark();
int numLines=getNumLines(文本阅读器);
textReader.Recall();
String[]words=新字符串[numLines];
对于(int i=0;i由于缓冲读取器是一个对象,您将其作为对getNumLines()
的引用传递,而不是作为副本传递,因此当您在发送给getNumLines()
的同一缓冲读取器上.readLine()
时,您将得到一个空值,因为您已经运行了.readLine()
运行getNumLines()
后,使用新的缓冲读取器关闭并重新打开文档
我还记得java中有一个用于缓冲读取器的Mark()
和Recall()
方法,也可以作为一种解决方法
我想是的
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
textReader.Mark();
int numLines = getNumLines(textReader);
textReader.Recall();
String[] words = new String[numLines];
for(int i=0;i<numLines;i++)
{
words[i] = textReader.readLine();
System.out.println(words[i]);
}
//clears memory reserved for this buffered reader
textReader.close();
FileReader\u fr=新的FileReader(FILEPATH);
BufferedReader textReader=新的BufferedReader(_fr);
text reader.Mark();
int numLines=getNumLines(文本阅读器);
textReader.Recall();
String[]words=新字符串[numLines];
对于(int i=0;我将遇到堆栈溢出,请回答寻求调试帮助的.问题(“此代码为什么不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现该问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅。使用调试器跟踪执行。当((line=textReader.readLine())!=null时,您认为如何{ <代码> >?我将声明您已经用GETNUMELIN()消耗了您的文件,因此在开始解析行时,您已处于文件末尾。请考虑使用类似于此的番石榴和代码:最终URL资源= Realth.GETRESULL(“路径/to/file .txt”);最后的列表行= Realth.Read Load(资源,字符集,Debug);欢迎使用Stack Overflow,请回答。寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现该问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅。使用调试器跟踪执行。当((line=textReader.readLine())!=null时,您认为如何{
是吗?我想说的是,您已经用getNu使用了您的文件