c#覆盖streamreader,但我可以关闭并重新打开吗?

时间:2015-11-06 14:28:38

标签: c# cvs streamreader

我将一些读取代码的cv合并到一个单独的类中,我想要让它覆盖streamreader。但是,我想保留我添加的类私有值(分隔符,记录计数等),并能够关闭并重新打开该文件。

我需要能够快速传递以确定各种事物,例如分隔符,数据中是否存在嵌入的换行符,实际记录数,字段数等等。

显然我不能使用(streamreader sr = new streamreadder(filename)),因为这会破坏最后的对象,但是我可以关闭文件并重新打开它吗?我可以做cvsstreamclass sr = new cvsstreamclass(filename),然后是sr.close()和sr.open()吗?我知道streamreader seek有问题,所以我可能不应该只使用它。

或者我是否认为这一切都错了,我应该将streamreader对象传递给一个处理解析的类吗?

不过,我并没有考虑转换到开源cvs类或其他库。我已经编写了很多这样的代码,但它确实有效。无需暗示。

2 个答案:

答案 0 :(得分:1)

CSV解析器不是 StreamReader。这两者没有关系,也不应该存在继承关系。

您的CsvReader班级应该有StreamReader个成员。您可以根据需要设置和操作该成员。例如,您可以随时关闭现有的阅读器并创建一个新阅读器。

答案 1 :(得分:1)

我建议您实际将StreamReader存储在您的阅读器类中。除非您以StreamReader的形式将其公开给其他代码,否则继承StreamReader是没有意义的。我会做这样的事情:

public class CSVReader
{
    private StreamReader reader;
    private string fileName;

    //Your other properties and fields here

    public CSVSReader(string filename)
    {
        this.fileName = fileName;
        InitReader();
    }

    public void CloseFile()
    {
        if (reader != null)
        {
            reader.Close();
            reader = null;
        }
    }

    public void OpenFile()
    {
        CloseFile();
        reader = new StreamReader(File.OpenRead(fileName));
    }

    //Your other methods here
}

显然,我没有使用任何try-catch块来打开文件,但这只是为了便于阅读。

您也可以从IDisposable继承,让您的课程在using ()区域内使用。