FileReader读取文本文件时出错

时间:2012-04-14 16:58:38

标签: java file-io io

我正在尝试将数组字符串存储在文本文件中并读取它。但我无法让它发挥作用。我收到了NullPointerError。

Exception in thread "main" java.lang.NullPointerException
   at java.io.FileInputStream.<init>(Unknown Source)
   at java.io.FileReader.<init>(Unknown Source)
   at in.isuru.justconverter.FileDbTool.readFile(FileDbTool.java:41)
   at in.isuru.justconverter.Test.main(Test.java:10)

这是两个班级。

package in.isuru.justconverter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JOptionPane;

public class FileDbTool {

File dataFile;
ArrayList<String> filePath;

public void checkFile(){
    dataFile = new File("db.txt");
    if(dataFile.exists()){
        readFile();
    }else{
        try {
            dataFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "Coudn't Create New File!");
            System.exit(1);
        }
    }
}

public void readFile(){

    int len;
    try{
        char[] chr = new char[4096];
        StringBuffer buffer = new StringBuffer();
        FileReader reader = new FileReader(dataFile);
        try {
            while ((len = reader.read(chr)) > 0) {
                buffer.append(chr, 0, len);
            }
          }finally {
             reader.close();
          }
        System.out.println(buffer.toString());
        StringTokenizer st = new StringTokenizer(buffer.toString(), ",");
        while (st.hasMoreTokens()) {
            String value = st.nextToken();
            filePath = null;
            filePath = new ArrayList<String>();
            filePath.add(value);
        }

    }catch(IOException e){
        JOptionPane.showMessageDialog(null, "Read Error");
    }
}

public String[] getFilePathArray(){
    readFile();
    return filePath.toArray(new String[filePath.size()]);
}

public File[] getFiles(){
    String[] paths = getFilePathArray();
    ArrayList<File> files = new ArrayList<File>();
    for(int i = 0; i < paths.length; i++){

        File file = new File(paths[i]);
        files.add(file);
    }

    return files.toArray(new File[files.size()]);
}

public void eraseFile(){
    dataFile.delete();
}

public void writeFile(String[] stuff){
    try{
        BufferedWriter out = new BufferedWriter(new FileWriter(dataFile, true));
        out.append(stuff + ",");
    }catch(IOException e){

    }
}

public void writeToDb(String[] array){
    writeFile(array);
}

}

主要课程

package in.isuru.justconverter;

公共课测试{

/**
 * @param args
 */
public static void main(String[] args) {
    FileDbTool app = new FileDbTool();
    app.checkFile();

}

}

这是挥杆计划的一部分。我正在尝试将文本文件用作小型数据库。

2 个答案:

答案 0 :(得分:0)

第41行是这样的:

FileReader reader = new FileReader(dataFile);

所以我打赌dataFile在这里是空的。

但是,您似乎在调用此方法之前初始化它,否则将在checkFile内抛出异常。

你确定没有先调用readFile直接在某个地方直接呼叫checkFile吗?在任何情况下,这种模式都不是推荐的方法,因为您要求类的用户按特定顺序调用方法。

答案 1 :(得分:0)

从堆栈跟踪中,您似乎直接从main而不是checkfile()调用readfile()。因此,dataFile为null,因为它没有被checkfile初始化。堆栈跟踪和给定代码也不匹配。当使用null参数调用FileReader构造函数时,它将在到达FileInputstream构造函数时抛出NullPointerException。 以下是来自jdk source的代码:

    public FileInputStream(File file) throws FileNotFoundException {
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
    security.checkRead(name);
}
    if (name == null) {
        throw new NullPointerException();
    }
fd = new FileDescriptor();
    fd.incrementAndGetUseCount();
open(name);
}