当前位置:C++技术网 > 资讯 > FilePool 重复文件读取器

FilePool 重复文件读取器

更新时间:2016-05-27 11:30:13浏览次数:1+次

初衷:

因为程序间用文件做通讯,所以通常把配置的读取到文件里面去了,而到代码的某一个点才需要一个或者几个属性,所以在很多循环里面做了打开关闭文件操作,十分低效。


不足:

1、不能特化指针

2、文件池里面没有做释放,也就是运行长时间以后,会占用比较多的内存,如有需要可以自己扩展写释放程序。


意义:

1、实用性是有的,我加入程序以后,速度快了三秒,大家都知道读取文件其实是很快的,但是程序逻辑之多,设计的人没有做好,导致内嵌循环又嵌循环,一个未处理数据走一个流程要打开关闭300多次文件,十分慢。

2、模板接口也是第一次做,发现特例化可以做成接口形式,所以学到了不少东西,哈哈。

3、共享出来是学习用的,大家如果有什么文件类型需要加到库里面,请留言


git项目路径如下(可以打开网址下载):

https://coding.net/u/ooklasd/p/FileReader/git

关于怎么使用请看这里《windows git的安装与使用》

找个文件夹 右键clone就可以下载到了


以下是效果图:


以下是代码结构




以下是使用方法:

        std::string fileName = "test.txt";
	auto txtfileSys = FS::FilePool<std::string>::getInstance();
	auto& txtfileData = txtfileSys->read(fileName);
	std::cout<<txtfileData<<std::endl;

	fileName = "test.xml";

	auto xmlfileSys = FS::FilePool<TinyXml::TiXmlDocument>::getInstance();
	auto& xmlfileData = xmlfileSys->read(fileName);
	if(!xmlfileData.Error())
	std::cout<<"xml文件:"
	<<xmlfileData.RootElement()->ValueStr()
	<<std::endl;

	std::cout<<"二进制文件:";
	fileName = "test.txt";
	auto binfiles = FS::FilePool<FS::Bin>::getInstance();
	auto& binfileData = binfiles->read(fileName);
	if(binfileData.data)
	{
		std::cout.write(binfileData.data,binfileData.lenght);
		std::cout<<std::endl;
	}



以下是特例化示例:


   //所有需要读取的文件类型都要进行特化
	//若特化版为指针则为非法
	//默认支持以下文件
	//1、string流(非二进制流)
	//2、tingxml
	//3、二进制流
	template<typename T>
	class FileInterFace
	{
		virtual ~FileInterFace(){};
	public:

		//判断是否能读取该文件
		virtual bool CanRead() const = 0;

		//判断是否需要重新读取
		virtual bool IsReLoad()const = 0;

		//读取文件
		virtual void Load()= 0;

		//获取数据
		virtual const T& GetData() const= 0;
	};


    //===================================================
    //    读取普通文件特化版
    //===================================================
    typedef FileInterFace<std::string> NormalFile;
    template<>
    class  FileInterFace<std::string>
    {
    public:
        FileInterFace(const std::string& filePath);
        const std::string& GetData()const{return _data;};
        bool IsReLoad()const;
        void Load();

    private:
        long long _lastWriteTime; 
        std::string _filePath;
        std::string _data;
        int count;
    };