无法从抽象类中读取文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从抽象类中读取文件相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个其他线程将继承的基本文件插件。但我被困在文件存在的位置,可以从普通线程读取,但当我尝试从抽象的基本文件中读取该文件时,它说文件未找到。这是我的基类: -

    package com.evol.fp;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;

    public abstract class BaseFilePlugin extends Thread implements BaseFileReader{

        String filename = "";
        File file = null;
        boolean fileStarted = false;
        boolean fileEnded = false;

        public BaseFilePlugin() {
            file = new File(filename);
        }

        public void readFile() {
            BufferedReader br = null;
            System.out.println("Base call: " + filename);
            try {

                System.out.println("inbside ");
                br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                if(br.readLine().trim().isEmpty()) {
                    endFile();
                    return;
                } else {
                    startFile(filename);
                    String record;
                    while((record = br.readLine().trim()) != null) {
                        parseRecord(record);
                    }
                    endFile();
                }
            } catch(Exception ioe) {
                ioe.printStackTrace();
            } finally {
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

        public abstract void parseRecord(String record);

        public void startFile(String filename) {
            this.fileStarted = true;
            this.fileEnded = false;
        }

        public void endFile() {
            file.delete();
            this.fileEnded = true;
            this.fileStarted = false;
        }

        public void run() {
            while(true) {
                System.out.println("Inside run, fileName: " + filename);
                System.out.println("Filestarted: " + fileStarted + ", file exists: " + file.exists());
                if(!fileStarted) {
                    readFile();
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

        /**
         * @return the filename
         */
        public String getFilename() {
            return filename;
        }

        /**
         * @param filename the filename to set
         */
        public void setFilename(String filename) {
            this.filename = filename;
        }

    }

我知道多线程,但从来没有使用基类来解析文件中的记录,如果有人告诉我什么是最好的问题。我知道该文件肯定存在。这是我的孩子班: -

    package com.evol.fp;

    public class FileReaderThread extends BaseFilePlugin {

        public FileReaderThread() {
            super.setFilename("E:\soham\soham.txt");
        }
        @Override
        public void parseRecord(String record) {
            System.out.println(record);
        }
    }

但它没有使用简单的主要方法调用孩子的parseRecord方法: -

package com.evol.fp;

public class StartProcess {

public static void main(String[] args) {
    FileReaderThread thd = new FileReaderThread();
    thd.start();
}

}
答案

我认为这是因为在super.setFile("E:\soham\soham.txt");中设置文件名之前首先调用父构造函数(BaseFilePlugin.class)

如果您可以删除父构造函数并将setFileName替换为setFile,其中file是iniatilize .e.g

//    public BaseFilePlugin() {
//        file = new File(filename);
//    }
....
....
/**
     * @return the file
     */
    public String getFile() {
        return file
    }

    /**
     * @param file the file to set
     */
    public void setFile(String file) {
        file = new File(file);
    }

在你的子类中

public FileReaderThread() {
  super.setFile("E:\soham\soham.txt");
}
另一答案

BaseFilePlugin的构造函数从最初的file创建了一个空字符串的String filename = "";

客户端调用更新setFilename(...)filename。但是,file在首次创建对象时仍然是相同的实例(使用空字符串作为文件名)。

我建议将文件名作为构造函数的一部分传递,以便正确初始化file

    public BaseFilePlugin(String filename) {
        this.filename = filename;
        file = new File(filename);
    }

可选地,如果实例只能读取1个文件,那么将这些类属性设为final,并删除setFilename()方法。

以上是关于无法从抽象类中读取文件的主要内容,如果未能解决你的问题,请参考以下文章

我无法从 android 的片段中读取活动中的数据库信息

从 .NET Core 2 中的类中读取 appsettings.json

从片段类中的对话框添加项目到recyclerview。

流操作

HDFS读文件过程分析:读取文件的Block数据

无法从字符串类中读取字符串