首页
学习
活动
专区
圈层
工具
发布

初识字节流+实现缓冲字节流OutputStream的主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回的是Int型而不是

java中的IO流可以分为两种:字符流和字节流 字符流,顾名思义,就是对字符进行操作,只能操作文本文件 字节流,就是对字节进行操作,然而所有文件都是由字节组成的,可以字节流可以操作一切文件...filename.isFile()==false的话,那么会抛出FileNotFoundException 读 read():int read(byte[] array):int 与Reader类一样...下面实现一下缓冲技术 实现BufferedInputStream package mypackage; import java.util.*; import java.io.*; public class...} return index+1; } public void close()throws IOException{input.close();} } 实现...---- 错误的返回了-1 如果扫描到了11111111那么此时将byte->int是-1,如果这样的话,程序就会终止不会进行 为什么read()返回的是Int型而不是byte型呢??

1.8K80

使用nginx image filter实现类OSS对象存储中对图片的实时处理

使用Nginx image_filter实现类似OSS图片处理 在家使用自己的电脑做了一个小应用,可查看照片,按以前的方式,需要在用户上传图片后对进行裁剪压缩,然后给前端一个缩略图地址与原图地址。...这种方式有两个弊端磁盘空间的浪费、缩略图尺寸调整不便捷。是否有其他不使用云OSS存储的情况下自己实现一套类似OSS的图片处理? 后来搜索资料,发现使用nginx的image_filter可以实现。...根据网上其他人的实例使用没有成功。 安装nginx与imageFilter不在复述,自己从网上看文章就可以了。我使用的版本是nginx 1.13.12 直接自带该插件。...自己调整后可以使用,下面贴出完整配置。...500x400 使用以上请求,就可以实现使用nginx image filter实施图片处理。 因是自己的小应用在使用,所以性能与访问速度方面还可以。

3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#中的override和new关键字

    然而C#中必须使用virtual关键字显示声明该函数是虚函数,然后在子类中使用override关键字重写父类方法,这才真正实现了对父类方法的重写,才能实现多态(C++中的多态就是使用虚函数实现的,而且和...正确的结果是: 使用override关键字修饰的方法 这是一个虚方法 为什么使用关键字new修饰的方法,调用的是父类的方法呢? 是不是很奇怪?...为什么使用override关键字的子类方法被调用了,而使用new关键字的子类方法没有被调用。 首先看看override关键字:override方法为从基类继承的成员提供新的实现。...下面来分析我们的程序: c1.fun();因为子类C1使用override关键字重写了父类的方法,基类C和子类C1都具有fun()方法,所以c1.fun()会动态调用C1的fun()方法而不是父类的...如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。

    1.6K20

    有“贝”而“莱” 强势围观 | 使用纯软仿真实现X20对交通灯的控制 025

    JZGKCHINA 工控技术分享平台 尊重原创 勿抄袭 勿私放其他平台 原创投稿 025 使用纯软仿真实现X20对交通灯的控制 周德兴 一、概 述 如果你没有任何硬件,你也可以编写、调试X20软件,实现大量的小型工业对象的控制...我们目前提供6大类西门子PLC,研华PAC控制器,贝加莱X20控制器的仿真。...我们的所有对象的数字量传感器信号寄存器为1~4(4个WORD),每个寄存器包括了16个数字量信号;模拟量传感器为5~21,6400~32000对应信号4~20mA。...而外部IO接口可以实现大量的工业场景模拟。 使用纯软仿真与对象仿真的联合实训模式,使得学习成本降低,随时随地学习,并使得学习更加形象生动。...而数字孪生的仿真,功能强大,为开发、调试、故障追溯、学习培训提供非常好的条件。 END

    1.1K20

    C++程序诗篇的灵动赋形:多态

    被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 值得注意的是: 多态构成条件缺一不可,如果多态产生问题,子类没有对某个方法进行重写,那么子类对象在调用该方法时,就会沿着继承链向上查找...这意味着子类虚表初始状态下包含了基类所有虚函数的地址,保证了子类对象可以调用父类的虚函数,这是因为子类继承了基类的接口,在某些情况下可能会使用到基类定义的虚函数实现 重写虚函数的替换 如果子类对父类中的某个虚函数进行了重写...nullptr 一个类的不同对象共享同一个类的虚表 4.2 多态原理实现 那么回归到多态的实现条件: 必须通过父类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且子类必须对父类的虚函数进行重写...,而不是指针或引用,子类中特有的成员变量和函数将被截断,丢失子类的特性 而使用父类指针或引用指向子类对象时,不会发生切片,能够完整保留子类对象的所有信息,从而可以访问子类重写的虚函数以实现多态 值得注意的是...C:优先使用继承,而不是组合,是面向对象设计的第二原则 D:继承可以使子类能自动继承父类的接口,但在设计模式中认为这是一种破坏了父类的封装性的表现 以下关于纯虚函数的说法,正确的是( ) A:声明纯虚函数的类不能实例化对象

    25010

    【C++】多态

    那要想实现多态,必须满足两个条件 2.2.1 条件1:虚函数的重写 第一个条件: 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 那什么是虚函数的重写呢?...如果子类自己的成员存在资源管理,那只调父类析构的话,就只清理了子类里面父类的部分,那是不是就内存泄漏了啊。 那这里为什么是这样的结果呢? 大家回忆一下delete会做哪些事情?...用多态是不是就可以达到这样的效果啊。 那现在怎么实现多态,是不是把父类的析构变成虚函数,然后子类重写就行了啊。...接口继承和实现继承 普通函数的继承是一种实现继承,派生类继承了基类的成员函数,可以使用该函数,继承的是函数的实现。...这样,无论我们有一只狗还是一只猫,我们都可以使用"动物"类的指针或引用来调用"发出声音"方法,而不需要关心具体是哪种动物。

    41110

    (18) 为什么说继承是把双刃剑 计算机程序的思维逻辑

    使用者只需要关注怎么用,而不需要关注内部是怎么实现的。实现细节可以随时修改,而不影响使用者。函数是封装,类也是封装。通过封装,才能在更高的层次上考虑和解决问题。...子类的addAll方法首先调用了父类的addAll方法,而父类的addAll方法通过add方法添加,由于动态绑定,子类的add方法会执行,子类的add也会做汇总操作。...给类加final修饰符,父类就保留了随意修改这个类实现的自由,使用者也可以放心的使用它,而不用担心一个父类引用的变量,实际指向的却是一个完全不符合预期行为的子类对象。...这样,子类就不需要关注基类是如何实现的了,基类修改实现细节,增加公开方法,也不会影响到子类了。 但,组合的问题是,子类对象不能被当做基类对象,被统一处理了。解决方法是,使用接口。...阅读文档说明,理解可重写方法的实现机制,尤其是方法之间的调用关系。 在基类修改的情况下,阅读其修改说明,相应修改子类。

    1.3K60

    C++笔记-多态(包含虚函数,纯虚函数和虚函数表等)

    这里提到了新名词:虚函数,我先演示一下多态的基本使用,下面再详细讲虚函数。 这里就是实现了多态,我们可以看到虽然func的参数是Person类型的引用,但是结果却调用了子类中的虚函数。...注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用。...上面子类中的BuyTicket就是对父类的重写,这里注意:重写/覆盖的是函数的实现部分,就是括号里面的内容。...第一个就判断这里到底是不是多态:我们可以看到,此时创建了一个子类对象,通过子类对象去调用test函数。这里要注意继承,并不是把父类的函数拷贝到子类,在调用时,先在子类查找,找不到才会去父类去查找。...以上面为例,这就是虚函数的基本使用。可以看出,此时Car中的Drive函数就是纯虚函数,而含有纯虚函数的类无法实例化出对象。 而如果子类没有重写纯虚函数,也会变成抽象类: 同样无法实例化出对象。

    20410

    QueryInterface的本质初探

    QueryInterface接口对COM的重要性不言而喻,该接口的实现有个规则——由QueryInterface返回的IUnknow接口指针必须相同,我的疑问是微软是如何使用C++实现这一COM规则的呢...请读者注意,我只探讨微软使用C++实现的COM,而不是其他公司使用其他语言实现的COM组件,当然无论什么公司使用十分语言,都必须遵循COM给出的规则。...(如:CTestSub 类)实现了基类(如:CBase类)中声明的虚函数,则在(4)-(6)的函数调用中,我们进入的是叶节点类(CTestSub类)实现的func函数,而没有调用其父类CTestA或CTestB...,调用的是子类中实现的函数,这个子类不是其他的子类,而是其地址被赋给了父类指针的子类(这里就是sub对象对应的类);这种现象出现的原因是——子类中维护的虚函数表中有关func函数的地址已经被替换成子类中实现的...讲到这里,大家对QueryInterface为什么会返回相同的IUnkown接口指针有所了解了吧!

    58520

    C++重要知识点小结---2

    在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向的对象类型来调用派生类的函数。...访问控制权限: 私有继承时,基类中不管是公有的,还是保护的或者为私有的,一律在子类中变成私有成员。 保护继承时,基类中公共和保护的成员在子类中变成保护的,而基类中私有的成员在子类中变成私有的。...在继承关系中,基类的private成员不但对应用程序隐藏,甚至对派生类也隐藏。而基类的保护成员则只对应用程序隐藏,而对派生类则毫不隐瞒。...一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事。 保护继承与私有继承类似,继承之后的类相对于基类来说是独立的;保护继承的类对象,在公开场合同样不能使用基类的成员。...,指向Circle或者是Square 一个有意思的问题:为什么析构函数要设置成虚函数 Range *r1 = new Circle(3, 4); 如果析构函数不是虚函数,则r1在释放内存时,则调用提Range

    97270

    C++继承

    前面所讲凡是类型转换都会产生一个临时变量,但这里的基类和派生类的赋值转换是不会产生临时变量,算是一个特殊情况~ 注意这里的r并不是对子类s的引用,而是对经过切片的s进行的取别名,下面的ptr也是同理!...为了保证先调用子类的析构函数,父亲的析构会在子类析构后自动调用。 构造:先父后子 析构:先子后父 为什么析构函数是先子后父呢?...唯一不同的是,不管是构造初始化/拷贝/析构,多了父类那一部分,原则:父类那部分调用父类对应的函数 五、继承与友元 友元关系不能继承,父类的友元不是子类的友元。...优先使用对象组合,而不是类继承 。 继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。...术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。

    40010

    C++重要知识点小结---2

    在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向的对象类型来调用派生类的函数。...访问控制权限: 私有继承时,基类中不管是公有的,还是保护的或者为私有的,一律在子类中变成私有成员。 保护继承时,基类中公共和保护的成员在子类中变成保护的,而基类中私有的成员在子类中变成私有的。...在继承关系中,基类的private成员不但对应用程序隐藏,甚至对派生类也隐藏。而基类的保护成员则只对应用程序隐藏,而对派生类则毫不隐瞒。...一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事。 保护继承与私有继承类似,继承之后的类相对于基类来说是独立的;保护继承的类对象,在公开场合同样不能使用基类的成员。...,指向Circle或者是Square 一个有意思的问题:为什么析构函数要设置成虚函数 Range *r1 = new Circle(3, 4); 如果析构函数不是虚函数,则r1在释放内存时,则调用提Range

    1K70

    【C++】继承

    那对它解引用就相当于拿到一个父类的对象,这个父类对象可以认为是从子类对象中切出来的属于父类的那一部分。 2.4 基类对象不能赋值给派生类对象 我们刚才是把派生类对象赋值给基类,那反过来可以吗?...(在子类成员函数中,可以使用 基类::基类成员 显示访问)。 我们继续,刚才是子类和父类中出现同名的成员变量,那如果是出现同名的成员函数呢?...我们发现这里我们自己初始化继承下来的_name成员但是报错了。 为什么不行呢?那这里要告诉大家的是: 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。...如何实现一个不能被继承的类 那学到这里,大家来思考一个问题,如何去实现一个不能被继承的类? 我们可以将它的构造函数或析构函数设置成私有的。 为什么这样就可以呢?...因为子类的构造和析构必须去调用父类的,而如果我们设置成私有的话,子类继承下来在子类中是不可见的,就没办法调用,那就连构造都构造不了 。

    60310

    C++:继承与派生

    在继承体系中基类和派生类都有独立的作用域。 2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。...派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。 3. 派生类的operator=必须要调用基类的operator=完成基类的复制。...2、如何实现一个不能被继承的类 ? 将基类的构造函数藏在私有作用域里,这样继承的时候子类不可见基类构造函数,就无法创建出子类对象了!...多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 3. 继承和组合 优先使用组合,而不是类继承 public继承是一种is-a的关系。...另一方面,基于对象组合的设计会有更多的对象 (而有较少的类),且系统的行为将依赖于对象间的关系而不是被定义在某个类中。   这导出了我们的面向对象设计的第二个原则:优先使用对象组合,而不是类继承

    49210

    从零开始学C++之继承(一):公有私有保护继承、overloadoverwriteoverride之间的区别

    实现继承,对于私有、保护继承,派生类不继承基类的接口。派生类将不再支持基类的公有接口,它希望能重用基类的实现而已,因而将它称为实现继承。...组合通常是在希望新类内部具有已存在的类的功能时使用,而不是希望已存在类作为它的接口。组合通过嵌入一个对象以实现新类的功能,而新类用户看到的是新定义的接口,而不是来自老类的接口。...(实际上是继承了但不可见),如果在派生类的成员函数中想要调用基类的被隐藏函数,可以使用 “ 基类名::函数名(参数)”的语法形式,如果被隐藏的函数是public的,则在类体外也可以使用“ 派生类对象.基类名...注:经试验,即使是覆盖的情况,也可以使用上面说的原则(不包括最后一种方式)去访问父类的虚函数, 此时的调用就不是多态了。 如果不属于上述的情况,则是一般的继承,则使用一般的访问语法即可。...首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。

    1.5K00

    轻松搞定面试中的“虚”

    (动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?) 6.是否可以在析构函数或者构造函数中调用虚函数? 在构造函数不要调用虚函数。...C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。...但是不是说你不可以那么写程序,你这么写,编译器也不会报错。只是你如果这么写的话编译器不会给你调用子类的实现,而是还是调用基类的实现。  在析构函数中也不要调用虚函数。...在析构的时候会首先调用子类的析构函数,析构掉对象中的子类部分,然后在调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数,这是非常危险的。...动态联编是指在程序执行的时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定,动态联编对函数的选择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编译结果。

    95720

    C++新旅程:三大特性之多态

    被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。...为了方便使用,人们想出用一个调用形式,调用基类和派生类的同名函数,通过指针分别调用这些同名的函数。允许在派生类中重新定义和基类同名的函数,并可以通过基类指针或引用来访问积累和派生类中的同名函数。...注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因 为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用 虚函数重写的两个例外...简单示例 3.2接口继承和实现继承 普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实 现。...所以如果不实现多态,不要把函数定义成虚函数4.虚析构和纯虚析构4.1概念 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构

    38510

    C++【多态】

    -- 2、多态的定义及实现 实现多态需要借助虚表(虚函数表),而构成虚表又需要虚函数,即 virtual 修饰的函数,除此之外还需要使用虚表指针来进行函数定位、调用 2.1、构成多态的两个必要条件 必要条件...缺少条件一:没有虚函数 缺少条件二:不是【父类指针】或【父类引用】进行虚函数调用 显然,缺少其中任意一个条件,都不构成多态 当然还存在两个例外: 除父类外,其他子类中的函数不必使用 virtual...-> 不实现多态,而另一个是 检查是否完成重写 --> 后续实现多态 对父类的虚函数加上 final:无法构成重写 对子类的虚函数加上 override 进行 重写检查 新标准中的小工具,在某些场景下很实用...:子类虚函数继承父类虚函数的接口,进行重写,构成多态 建议:假如不是为了多态,那么最好不要使用 virtual 修饰函数,更不要尝试定义纯虚函数 注意: 若父类中为抽象类,那么子类在继承后,必须对其中的纯虚函数进行重写...2.以下关于纯虚函数的说法,正确的是( ) A:声明纯虚函数的类不能实例化对象 B:声明纯虚函数的类是虚基类 C:子类必须实现基类的纯虚函数 D:纯虚函数必须是空函数 3.关于虚表说法正确的是

    42830

    一口气搞懂《虚函数和纯虚函数》

    不管是虚函数还是纯虚函数,基类都可以为提供他们的实现(implementation),如果有的话子类可以调用基类的这些实现。 子类可自主选择是否要提供一份属于自己的个性化虚函数实现。...虚函数和纯虚函数都能做到这一点,区别是,子类如果不提供虚函数的实现,那就会自动调用基类的缺省方案。而子类如果不提供纯虚函数的实现,则编译将会失败。...基类提供的纯虚函数实现版本,无法通过指向子类对象的基类类型指针或引用来调用,因此不能作为子类相应虚函数的备选方案。下面给出总结。 ?...第三,使用一个基类类型的指针或者引用,来指向子类对象,进而调用经由子类复写了的个性化的虚函数,这是C++实现多态性的一个最经典的场景。...第四,基类提供的纯虚函数的实现版本,并非为了多态性考虑,因为指向子类对象的基类指针和引用无法调用该版本。

    90820
    领券