我正在尝试用java读取文件。在该文件中,给出了一些我要打印的字符串。但我的代码只打印偶数行和跳过奇数行。
我在stackoverflow中搜索了它,但是之前没有找到解决方案。
我的代码如下......
//main class
import java.io.IOException;
public class takingInputFrpmFile {
public static void main(String[] args) throws IOException {
String filePath = "F:/Path/in.txt";
try
{
readFile rF = new readFile(filePath);
String[] receivedArray = rF.Read();
for(int i=0;i<receivedArray.length;i++)
System.out.println(receivedArray[i]);
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}
// class called from main class
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class readFile {
private String path;
public readFile(String path)
{
this.path=path;
}
public String[] Read() throws IOException
{
FileReader fR = new FileReader(path);
BufferedReader bR = new BufferedReader(fR);
String[] textData = new String[110];
String check;
int i=0;
while((check = bR.readLine()) != null)
{
textData[i] = bR.readLine();
i++;
}
bR.close();
return textData;
}
}
该文件包含以下行......
这是我的代码的输出....
我的代码出了什么问题?我应该改变什么?如何摆脱最后空值的打印?请帮助...提前致谢...
答案 0 :(得分:5)
您首先阅读该行并检查它是否为空,然后您读取另一行。
while((check = bR.readLine()) != null)
{
textData[i] = check; //Changed this to check
i++;
}
那个会起作用。
您目前正在声明大小为110的字符串数组。您的文件真的是110行吗?你可能应该使用list。
public List<String> Read() throws IOException
{
FileReader fR = new FileReader(path);
BufferedReader bR = new BufferedReader(fR);
List<String> textData = new ArrayList<>();
String check;
while((check = bR.readLine()) != null)
{
textData.add(check);
}
bR.close();
return textData;
}
如果你真的想要返回字符串数组,你可以使用:
return textData.toArray(new String[textData.size()]);
答案 1 :(得分:2)
好像你做了2个读取语句。尝试类似:
while((check = bR.readLine()) != null)
{
textData[i] = check;
i++;
}
答案 2 :(得分:2)
您正在阅读文件行两次,一次是
check = bR.readLine()
和其他时候
textData[i] = bR.readLine();
(每个bR.readLine()读一行) 尝试更改类似
的循环while ((textData[i] = bR.readLine()) != null) {
i++;
}
要删除空值,可以使用List而不是使用固定大小(110)数组。
我建议使用以下代码:
//main class
import java.io.IOException;
import java.util.List;
public class Prueba {
public static void main(String[] args) throws IOException {
String filePath = "E:/Temp/in.txt";
try {
ReadFile rF = new ReadFile(filePath);
List<String> receivedArray = rF.read();
for (String currentLine : receivedArray) {
System.out.println(currentLine);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
//class called from main class
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ReadFile {
private final String path;
public ReadFile(String path) {
this.path = path;
}
public List<String> read() throws IOException {
// Create an empty List to protect against NPE
List<String> textData = new ArrayList<String>();
FileReader fR = null;
BufferedReader bR = null;
try {
fR = new FileReader(path);
bR = new BufferedReader(fR);
String line;
while ((line = bR.readLine()) != null) {
textData.add(line);
}
} catch (IOException e) {
throw e;
} finally {
// Close all the open resources
bR.close();
fR.close();
}
return textData;
}
}
无论如何,正如Mukit Chowdhury建议的那样,请尊重代码约定,以使您的代码更具可读性(您可以使用Google&#34; Java代码约定&#34;或使用well stablished ones)
答案 3 :(得分:1)
你的线指针递增两次,
while((check = bR.readLine()) != null){
textData[i] = bR.readLine();
i++;
}
在while循环中将bR.readLine()
替换为check
。
while((check = bR.readLine()) != null){
textData[i] = check ;
i++;
}
答案 4 :(得分:1)
您拨打readline
两次。你的循环应该是
for(; (check = br.readline()) != null; textdata[i++] = check);
或者那种效果
答案 5 :(得分:1)
从您的代码示例中 这里
while((check = bR.readLine()) != null) {
textData[i] = bR.readLine();
i++;
}
替换为
while((check = bR.readLine()) != null) {
textData[i] = check ;
i++;
}
答案 6 :(得分:1)
在Java 8中,使用try {
List<String> lines = Files.readAllLines(Paths.get("/path/to/file"));
} catch (IOException e) {
// handle error
}
包中的实用程序类可以轻松地将文件中的所有行读取到{{1}}:
{{1}}
实际上不再需要使用外部库或重新发明轮子来执行这样的常见任务:)