游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

基本功超全面IO流教程,小白也能看懂

  Java领域的io模块是一个非常庞大的知识体系,在大家求职面试的过程中通常也是被问到比较多的一个模块,今天我特意整理了一份关于IO知识体系相关的干货和大家分享,希望各位读者们喜欢。如何理解io流
  io可以理解为是input和output的两个缩写,分别代表了数据的输入和输出。io流则是描述了将数据从内存和数据源之间拷贝的一个过程。
  输入:数据从数据源加载到内存。
  输出:数据从内存写回到数据源。
  这里我所说的数据源是一个比较泛的名称,它可以是指txt,图片,SQL,mp4等格式的文件。
  Java的io流分类字符流和字节流
  在java语言的IO体系内部主要划分为了两大类别,字节流和字符流。
  字节流
  该类流每次读取数据的时候都会以字节作为基本单位进行数据的读取,通常都会有InputStream和OutputStream相关字眼。例如读取数据的时候每次如同下图所示,每次都按照字节进行加载。
  字符流
  该类流通常都会以字符的形式去读取数据信息,其读取的效率通常要比字节流更高效。相关的类通常都会带有Reader或者Writer相关字眼。
  ps:上图中的24bit是相关汉字在UTF8编码下转换为二进制的形式
  思考:字符流和字节流在使用场景方面有什么不同点
  字符流通常比较适合用于读取一些文本数据,例如txt格式类型的文本,这类资源通常都是以字符类型数据进行存储,所以使用字符流要比字节流更加高效。而对于一些二进制数据,例如图片,mp4这类资源比较适合用字节流的方式进行加载。
  再往深入思考下,我们的字符流和字节流既然都要涉及到数据信息的读取和写入,那么就一定会涉及到输入和数据,所以在基于字节流和字符流的基础上又扩展出了以下四种类别:字节输入流字节输出流字符输入流字符输出流
  除了我们所说的输入和输出之外,流还会涉及到各种类型的数据源,和不同类型的数据源打交道就需要使用不同类型的io流,这里我整理了一份表格,大家请看:
  分类字节输入流字节输出流字符输入流字符输出流抽象接口InputStreamOutputStreamReaderWriter访问文件FileInputStreamFileOutputStreamFileReaderFileWriter访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter访问字符串
  StringReaderStringWriter节点流和处理流
  随着使用的增加,开始有程序员希望对已有的这些io流做一些优化改善,于是便出现了节点流和处理流这么些概念。
  节点流:直接对特定的数据源执行读写操作。
  处理流:对一个已经存在的流做一些二次封装操作,其功能更加比原先更加强大。
  下边我对常见的节点流和处理流也给大家做了一份表格进行整理
  分类字节输入流字节输出流字符输入流字符输出流类型抽象接口InputStreamOutputStreamReaderWriter节点流访问文件FileInputStreamFileOutputStreamFileReaderFileWriter节点流访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter节点流访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter节点流访问字符串
  StringReaderStringWriter节点流缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter处理流打印流
  PrintStream
  PrintWriter处理流对象流ObjectInputStreamObjectOutputStream
  处理流转换流
  InputStreamReaderOutputStreamWriter处理流
  下边我们对每种流都进行详细的介绍。常用节点流介绍FileInputStream和FileOutputStream
  通常FileInputStream流会用于以字节的方式去读取文件信息,常用代码Demo如下:publicstaticvoidreadFile(){FileInputStreamfileInputStreamnull;try{fileInputStreamnewFileInputStream(newFile(UserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofiletext。txt));byte〔〕readDatanewbyte〔10〕;intbufferSize0;如果读取正常,会返回实际读取的字节数while((bufferSizefileInputStream。read(readData))!1){System。out。print(newString(readData,0,bufferSize));}System。out。println();}catch(Exceptione){e。printStackTrace();}finally{关闭文件流,释放资源try{这个异常只要保证的确执行了close操作即可fileInputStream。close();}catch(IOExceptione){e。printStackTrace();}}}
  使用注意点:流需要进行关闭操作使用read函数的时候,当文件读取正常时候会返回实际的字节数
  FileOutputStream是文件的字节输出流,常见使用案例demo如下:publicstaticvoidwriteFileVersion1(){StringfilePathUserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofiletext2。txt;FileOutputStreamfileOutputStreamnull;try{如果通过newFileOutputStream(filePath)的方式执行写入,实际上数据是会覆盖原先的内容,所以根据构造函数的第二参数来实现追加的效果fileOutputStreamnewFileOutputStream(filePath,true);fileOutputStream。write(inputsth。getBytes());fileOutputStream。write(inputsth2。getBytes());}catch(Exceptione){e。printStackTrace();}finally{try{fileOutputStream。close();}catch(IOExceptione){e。printStackTrace();}}}注意在FileOutputStream的构造函数中,可以通过定义第二个append参数去设置写入的模式(覆盖模式还是追加模式)。使用字符输入流的时候,即使没有走到close函数,数据也会被持久化写入到磁盘。
  思考:使用上方这段代码去读取文本信息的时候是否会出现乱码情况?
  其实是会存在问题的。为了和大家解释具体原因,我做了这么一个测试。
  首先在一份指定的txt文件中用UTF8编码写入10个中文字符(一共占用30个字节)
  而我们的程序中每次都是以10个字节为基础加载数据,所以有部分的汉字可能读取到了13的内容就中断了,从而导致出现乱码。
  思考:如何解决这种情况?增大每次读取的字节数组大小
  这种思路,不够灵活,而且如果文件信息量非常庞大的话,每次读取的字节数组也会有上限。(数组的体积最大值为2311)。如果需要做每次读取一部分数据并且进行一些业务过滤操作的话,这种方式并不灵活。每次读取的字节数是编码占用字节数的倍数
  例如我们使用了UTF8编码,那么每次读字节的时候就使用3的成倍数去读内容,如9,12,21。但是这类读取也是会存在问题,假设是一份携带有英文字符的文本就会出现读取内容缺失的情况。使用字符流的方式读取
  这种方式可以很好地解决上边我们所说的几类问题,例如使用FileReader流。FileReader和FileWriter
  FileReader相关案例代码:publicstaticvoidreadFile(){FileReaderfileReadernull;try{fileReadernewFileReader(UserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofiletext。txt);char〔〕charsnewchar〔3〕;intreadLen0;while((readLenfileReader。read(chars))!1){System。out。println(newString(chars,0,readLen));}}catch(Exceptione){e。printStackTrace();}finally{try{fileReader。close();}catch(IOExceptione){e。printStackTrace();}}}
  FileReader字符流支持每次读取文件的时候按照char为基本单位进行读取,这款io流非常适合用于读取一些小的文本内容。同样的,FileReader的read函数在调用完之后会返回读取到的文本内容长度,如果长度为1,则表示读取到的内容已经结束。
  说完了FileReader,我们再来聊聊FileWriter。FileWriter是一款基于字符为基本单位的输出流,可以用于往文本文件内部写入一定的数据。下边是它的案例代码:记得追加模式和closeflushpublicstaticvoidwriteFileVersion1(){FileWriterfileWriternull;try{默认是覆盖模式fileWriternewFileWriter(UserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofiletext3。txt);fileWriternewFileWriter(UserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofiletext3。txt,true);fileWriter。write(thisistest);}catch(Exceptione){e。printStackTrace();}finally{try{底层使用了sun。nio。cs。StreamEncoder。writeBytes,底层其实是使用了Nio的bytebuffer做数据实际刷盘操作所以其实底层还是使用了byte作为基本单位来进行操作fileWriter。close();flush也会写入数据,但是没有执行close操作fileWriter。flush();}catch(IOExceptione){e。printStackTrace();}}}
  需要注意点:使用完毕后如果不执行close操作或者flush操作则并不会将实际的内容持久化输出到磁盘当中。这一点和FileOutputStream很不一样。在使用FileWriter的构造函数中,有一个append的布尔类型变量,用于声明当前的数据写入之后是否会覆盖原先的内容。
  具体源代码如下:
  使用流结束之后记得要手动调用close函数,执行关闭行为操作。PipedInputStream和PipedOutputStream
  管道流通常会被我们用在不同的线程之间进行消息通讯中使用。
  例如下边这段代码,定义了一个子线程,该线程会往PipedOutputStream中写入数据,然后main线程会去PipedInputStream中读取子线程写入的数据。out底层是用了一个字节缓冲数组buffer接收数据传输,当这个字节缓冲数组满了之后通过使用notifyAll唤醒in内部读数据的线程所以这里面的底层原理还是离不开sync和notifyallparamargspublicstaticvoidmain(String〔〕args){try(PipedOutputStreamoutnewPipedOutputStream()){PipedInputStreaminnewPipedInputStream(out);newThread((){try{Thread。sleep(2000);StringitemnewString();for(inti0;i1000;i){itemitem1;}out。write(item。getBytes(StandardCharsets。UTF8));out。close();}catch(IOExceptionInterruptedExceptione){e。printStackTrace();}})。start();intreceive0;System。out。println(try);byte〔〕tempnewbyte〔1024〕;等待子线程往pipedOutputStream内部写入数据while((receivein。read(temp))!1){StringoutStrnewString(temp,0,receive);System。out。println(outStr);}}catch(Exceptione){e。printStackTrace();}}常用处理流介绍BufferedInputStream和BufferedOutputStream
  这类流在传统的字节流基础上做了一层包装,单纯的字节节点流每次处理数据读取或者写入的时候都是直接对磁盘进行字节为单位的io操作,所以性能方面会有一定的缺陷。缓冲字节流的出现就是通过引入一个缓冲Buffer的来优化这种多次读写操作导致的io性能不足的设计。
  缓冲字节处理流的内部存在一个叫做buffer的缓冲区,每次写入数据的时候都会往缓冲区中写入数据,当缓冲区积攒了足够多的数据后再一次性写回到数据源中。这种设计思路相比原先的一次写一次io要高效更多。
  思考:BufferedInputStream和BufferedOutputStream如何使用呢?
  可以参见下边这段实际代码:基于字节为单位实现文件拷贝效果publicstaticvoidfileCopyByByte(StringsourceFile,StringdestPath)throwsIOException{BufferedInputStreambufferedInputStreamnewBufferedInputStream(newFileInputStream(sourceFile));BufferedOutputStreambufferedOutputStreamnewBufferedOutputStream(newFileOutputStream(destPath));byte〔〕tempBytenewbyte〔1024〕;inttempByteLen0;while((tempByteLenbufferedInputStream。read(tempByte))!1){bufferedOutputStream。write(tempByte,0,tempByteLen);}bufferedOutputStream。close();bufferedInputStream。close();}
  注意点:BufferedInputStream和BufferedOutputStream内部采用了修饰器模式,通过构造函数注入一个java。io。InputStreamjava。io。OutputStream对象,从而达到可以注入多种字节输入输出流。当关闭流的时候只需要关闭外界包装的字节缓冲流即可,它的close操作会触发对应的字节流内部的close函数。使用缓冲处理流的时候要记得调用close或者flush操作才能将实际数据真正写入到磁盘当中。PrintStream和PrintWriter
  这两个流分别是基于字节和字符的输出打印流,下边是这款io流的使用demo:
  PrintStreampublicstaticvoidmain(String〔〕args)throwsIOException{重新设置流输出的位置,底层是一个native方法System。setOut(newPrintStream(UserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofileout。log));PrintStreamoutSystem。out;out。println(johnhello);底层也可以使用字节数组out。write(test。getBytes());out。close();}
  PrintWriterpublicstaticvoidmain(String〔〕args)throwsFileNotFoundException{重新设置流输出的位置,底层是一个native方法控制PrintWriteroutnewPrintWriter(UserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofileout。log);out。println(johnhello);底层也可以使用字节数组out。write(test);out。close();}
  其实在我们日常开发中经常会接触到PrintStream这款标准输出字节流,例如我们刚入门阶段所接触的helloworld案例,底层就是基于PrintStream去做的:System。out。printf(helloworld);
  另外关于系统输出和系统输入部分,我在这里列出了一段代码,大家可以尝试运行看看它们分别是哪些流负责管控的。publicstaticvoidmain(String〔〕args){inputStream对象inputstream是标准输入,会从键盘那边寻找输入内容实现类是:java。io。BufferedInputStreamSystem。out。println(System。in。getClass());outputStream对象outputStream是标准输出,会从显示器中获取输出数据实现类是:java。io。PrintStreamSystem。out。println(System。out。getClass());}InputStreamReader和OutputStreamWriter
  这两类IO是属于转换流方面的代表,最常使用于不同编码格式直接的流读取场景中。例如当我们的一份文件采用了GBK编码,然后读取的程序采用的默认编码为UTF8,那么就会导致读取出来的数据是乱码的格式。为了解决这种问题,人们设计了转换流来应对,这方面的案例代码如下所示:
  按照指定编码格式写入和读取数据publicstaticvoidmain(String〔〕args)throwsIOException{这份文件默认是采用了gbk编码StringfilePathUserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofilefile1。txt;系统默认编码格式是utf8,这里需要手动设置为gbk编码OutputStreamWriteroswnewOutputStreamWriter(newFileOutputStream(filePath),gbk);osw。write(测试语句);osw。close();System。out。println();InputStreamReaderisrnewInputStreamReader(newFileInputStream(filePath),gbk);char〔〕charsnewchar〔1024〕;intlenisr。read(chars);System。out。println(newString(chars,0,len));isr。close();}ObjectInputStream和ObjectOutputStream
  对象输入和对象输出流是我们在工作中经常会使用到的一款IO流,先来介绍下它的设计背景。
  思考:如果我们从IO输入流中读取到100这个数据的时候,如何判断这项数据的类型是属于数字还是字符串类型呢?
  为了能让开发者在读取数据源的时候同时了解更多数据的属性,人们设计出了对象输入输出流。使用对象输入流输出流的时候,可以按照不同的格式对数据源进行读取或者写入。下边来看一份实操的案例代码:将一个对象持久化写入到一份文件中publicstaticvoidwriteObjDemo()throwsIOException{StringdestPathUserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofileobj1。dat;对象输出流ObjectOutputStreamoosnewObjectOutputStream(newFileOutputStream(destPath));oos。writeInt(100);intInteger类型(实现序列化)oos。writeBoolean(true);boolBoolean类型(实现序列化)oos。writeDouble(1。1);doubleDouble类型(实现序列化)oos。writeChar(a);charCharater类型(实现序列化)oos。writeUTF(测试语句);String类型(实现序列化)oos。writeObject(newDog(101,name1));自定义对象(实现序列化)oos。close();}将文件中的数据读取出来,转换为一个对象publicstaticvoidreadObj()throwsIOException,ClassNotFoundException{StringdestPathUserslinhaoIdeaProjectsarchitectframeworkarchitectframeworkiofileobj1。dat;ObjectInputStreamoisnewObjectInputStream(newFileInputStream(destPath));System。out。println(ois。readInt());System。out。println(ois。readBoolean());System。out。println(ois。readDouble());System。out。println(ois。readChar());System。out。println(ois。readUTF());Dogdog(Dog)ois。readObject();System。out。println(dog);ois。close();}
  从代码中可以看出ObjectInputStream和ObjectOutputStream所提供的Api接口还是比较好理解的,但是在实际使用这两类IO流的时候需要注意以下几点:读写顺序要一致
  如果是按照int,string,int的顺序进行序列化,那么反序列化的步骤也需要按照int,string,int的顺序来执行被序列化的对象必须要求实现serializable接口
  这块是一种规范的约定,开发者们准守即可。被序列化的对象建议添加serialVersionUid关键字
  这样可以在序列化的时候不会将转换对象识别为一个新的类,而是当成是原有对象的一个升级版本。对象内部参与序列化的字段要求皆可序列化
  我们平时在定义属性中常用了基本类型例如int,long,double,其实在底层都被进行了装箱的操作,变成了可序列化的Integer,Long,Double类。如果被序列化对象中包含了一个自定义的对象,那么这个自定义的对象也一定要支持可序列化。序列化具备可继承特性
  如果某个父类已经实现了序列化接口,那么它的子类也默认实现了序列化
  思考:如果没有设置serialVersionUid关键字,在进行序列化的过程中可能会遇到什么问题
  假设我们原先的对象A中有id,name两个字段,该对象在被序列化之后存储到temp文件中。
  此时对A对象进行了升级变成了A1对象,字段变为了id,name,age,此时将temp文件夹中存储的内容重新反序列化到A1对象上,就会出现报错异常,例如下边所示:Exceptioninthreadmainjava。io。InvalidClassException:org。idea。architect。framework。io。节点流。Dog;localclassincompatible:streamclassdescserialVersionUID198678371,localclassserialVersionUID4180152316968275835atjava。io。ObjectStreamClass。initNonProxy(ObjectStreamClass。java:699)atjava。io。ObjectInputStream。readNonProxyDesc(ObjectInputStream。java:1885)atjava。io。ObjectInputStream。readClassDesc(ObjectInputStream。java:1751)atjava。io。ObjectInputStream。readOrdinaryObject(ObjectInputStream。java:2042)atjava。io。ObjectInputStream。readObject0(ObjectInputStream。java:1573)atjava。io。ObjectInputStream。readObject(ObjectInputStream。java:431)atorg。idea。architect。framework。io。节点流。ObjectInputStreamDemo。readObj(ObjectInputStreamDemo。java:19)atorg。idea。architect。framework。io。节点流。ObjectInputStreamDemo。main(ObjectInputStreamDemo。java:25)
  如果一个对象在进行序列化操作的时候没有声明serialVersionUid关键字,在jdk底层会自动根据字段属性给它生成一个serialVersionUid关键字,这也就意味着当原先对象的字段发生变动的时候,这个serialVersionUid字段值也会变动。
  这里报错的内容就是因为序列化和反序列化过程中会通过判断serialVersionUid来识别是否是对同一种类型的对象操作,如果原先对象的字段属性发生了变动则会导致serialVersionUid值发生变化从而抛出异常。

张家界永定妇幼带给孕妈妈们艾的时光蒿的享受活动现场。红网时刻新闻4月13日讯(通讯员李勇)人间四月天,艾草飘香,食过艾糍,方知春之味。为了丰富准妈妈们的孕期生活,安抚孕期浮躁心情,从而促进胎儿神经系统的发育。4月……沐雨,乘风,翱翔撑着雨伞,慢慢地走在湿漉漉的小路上,耳边是雨滴敲打着伞面的声音,就像一首为爱而疯狂的交响曲,互诉着衷肠。脚边是挂满水珠的青草,随着风轻轻的摇摆着身躯,连带着水珠不停的晃动,就像……春天养背,人活百岁!5个最简单有效的养背方法,跟着做年轻10我们常说春天养肝很重要,但补阳气祛湿同样不可忽视。这主要还是因为,经过一个冬天,我们体内、脏腑积累的寒湿、浊气,在春天是排出的好时机。而要祛除这些,还得需要体内阳气的配合……传奇世界老玩家最后的希望说起传奇世界,对它是又爱又恨,爱它是承载了为数不多仅有的自由快乐时光,恨它是无脑的改版破坏游戏平衡。爱玩作为一个十年老玩家,今天说下自己的希望。我希望哪怕消耗点卡也……巴菲特二季度亏了3000亿腾讯二季度整体利润下滑,巴菲特二季度亏了3000亿,软银孙正义二季度亏了1600亿,现在的中国与全世界一体,我们这边很难,国际市场也不会很好,大家面临的情况都差不多,他们这么有……孩子的童年和我们的童年有哪些不一样?我来说一说我的童年和现在孩子们的童年对比1、我记得我小时候上学前班和小学,就第一天上学时妈妈骑车把你送学校带我们认认路,以后我们就自己背书包,和几个邻居朋友连走带跑的一起……记者西班牙人足校有一名从中国来学球的6岁小孩,叫Alex虎扑02月19日讯据记者林德诺的消息,在西班牙人足校里,有一名中国来学球的6岁小孩子。林德诺写道:才发现西人足校也有从中国来学球的小孩。Alex,才6岁,但每周能稳定有3……烧茄子用什么调味料最出味?烧茄子是个完整的烹饪概念,关联食材选择、前期处理、配菜和调料、火候和时间等每道工序,选择调味料只是其中的一个环节。每个环节都做好了,调味料才会发挥最佳作用。(家里做这盘茄……熬夜的几大好处你知道吗?56点:醒了也要再多睡会,实在睡不着可以闭目养神或者躺在床上按摩腹部,揉搓双手,有助于保证白天充足的精力。6:30:做伸展运动,比如瑜伽、太极拳等都是非常不错的选择。78……100大行业全景图谱1051页多个行业详细介绍100行业全景图谱核心作用:《100大行业全景图谱》用途广泛,企业管理者用:跨行业思路打法洞见,启迪创新商业新思维;产业投资机构用:产业格局通盘透视,精准产业布局与项目池……1000以内的哪些白酒适合送礼?有人说:酒不是万能的,但是有些场合,没有酒又万万不能。生活中即使不喝酒的人,讨厌酒的人,在请客吃饭时,你可以不准备烟,但是你绝对不可以不准备酒。曾经看到一句话:在能够改变……林允儿时装秀,看脸还能打十年,腿却是象腿,造型师出来挨打还有什么比明明人很好看却被造型拖累更让颜狗心痛的呢?最近林允儿出席miumiu大秀,留着清纯刘海的她颜值依旧很能打,比较神奇的时候05年她出现在《U》mv里的模样是这样的……
古早美味糯米饭糍!一口童年回忆满满现在都市街头,各类时尚茶饮和糖水甜品最为流行。而在练塘的乡野田间,其实有一种灶头上的美味小吃同样风靡已久,它既有奶茶饮料里珍珠、小芋圆、云朵麻薯一般糯叽叽的口感,还带有迷人的稻……吴玉新副教授毫米级颗粒在湍流场中的传热及着火特性【能源人都在看,点击右上角加关注】创新点通过四风扇对冲的电热实验装置,构建了各向同性湍流流场,可通过改变风扇转速及热功率调节湍流强度及环境温度。基于该实验装置研究了……疯狂马斯克,与苹果开战?如果苹果不改变,我将造出更好的手机马斯克由于在电动汽车,太空探索,太阳能,人工智能等领域,取得了非凡的成就,被众人所知。近期更是斥巨资收购了推特,成为大家讨论的焦点。但是马斯克收购推特后,苹果却威胁要从应用商店……世界本来就是混沌一片突然想到二分法是没有那么正确的。世界本来就是混沌一片,人们为了生活的方便,分出了阴阳南北东西、分出了邪恶正义,分出了无数的对立。想一想庄子的寓言:南帝和北帝见中央之……入门就歇,是肾虚?中医分不清阴阳,越补越虚关于肾虚会造成能力的下降也讲了有很多,肾,大家也都不是很陌生,是阴阳之本也是我们的生命之源,肾中藏有的精气,能够促进我们机体的生长!但是在临床中发现,很多人一说不行,可能很多人……又一世界级大赛将在顺义举办!奖金总额高达100000000元本报讯(记者李楠)总奖金1亿元!北青社区报记者刚刚从顺义区两区建设第十三次新闻发布会上获悉,本月底,H1COOL峰会将在位于顺义区的新国展举办,历时3天,场馆面积约2。6万平方……samba简单安装与配置准备工作防火墙samba服务需要用到的端口是139和445,因此开放这两个端口。若想简单了解防火墙配置,推荐阅读如何开启防火墙(Firewalld)?firewal……?错位的家庭关系正把孩子推入游戏旋涡视觉中国供图面对一个沉迷游戏无法自拔的孩子,是怪游戏,还是怪孩子?答案或许都不是。2019年,中国青少年研究中心少年儿童研究所所长孙宏艳曾带着团队做过一项调研……你的朋友圈小老虎领养了吗,原来微信还可以这么玩儿?今天,好多微信好友都发来截图炫耀,说是微信升级后,不但可以发个性红包封面,还可以领取一只小老虎!看着呆呆萌萌的小老虎头像,还真是怪可爱的!还在等什么?动手吧,你也领养一只……深夜浏览不良网站,删除历史记录有用吗?其实你已经被盯上本文编辑今日头条作者维权骑士签约用户:小俊技术分享独家原创制作未经授权严禁转载,发现抄袭者将进行全网维权投诉分享生活小妙招,享受科技新生活!大家好,欢迎来到今天的知……羊了个羊第二关玩到闭眼都过不去,骗局来了?怎么防范?近日,微信小程序游戏《羊了个羊》走红网络。不但登上了社交平台热搜榜一,还因参与玩家过多,游戏程序一度出现崩坏的情况,《羊了个羊》创始人的母校甚至为其制作展牌宣传。第一关闭眼过,……CBA再现3强争霸!广东后程发力,浙江稳如泰山,辽宁存在致命CBA本赛季进行得如火如荼,目前进行到第19轮,浙江队、广东队、辽宁队分列前三名,自从第二阶段以来,这3支球队排名很稳定,尤其是广东队,上升势头正盛,已经取得了一波10连胜,按……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网