为什么文件中的行不是用java打印的

时间:2015-02-16 11:53:20

标签: java file

我正在尝试用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;
    }
}

该文件包含以下行......

enter image description here

这是我的代码的输出....

enter image description here

我的代码出了什么问题?我应该改变什么?如何摆脱最后空值的打印?请帮助...提前致谢...

7 个答案:

答案 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}}

实际上不再需要使用外部库或重新发明轮子来执行这样的常见任务:)