day24_IO流 文件切割+编码

来源:互联网 发布:excel表格数据相乘 编辑:程序博客网 时间:2024/06/06 02:04

52-IO流(文件切割)

先说说原理吧


切割的方式有两种,一种是按大小,另一种是按文件个数切

我是不是有一个流读取一个文件,是的,我假设按照大小切,每个文件1M,我读数据,读完以后就写入文件,我写满一1M过后,不写了,写下一个文件,你认为我有几个输出流,一个啊,你白学了,流是不是要关联文件  ,你写完了,是不是这个流就完了,所以啊,你有几个文件就有几个文件输出流

 

53-IO流(文件合并)

 

54-IO流(文件切割合并+配置文件)

 

如果将上面的做成软件的话也,除了做健状性的判断以外,还有下面

上面的文件切割和文件合并时也,我并不知道有多少个碎片,我并不知道原来文件的名字是什么,不知道怎么合并,所以也我们使用配置文件

 

55-IO流(ObjectOutputStream-对象的序列化)


我们先用一个图的形式把这个事说说

比如说是内存name值为张三,李四啊,写入到硬盘啊,这个没有问题啊,然后还有一个age,然后再写就是了吗,可是也这些数据的关系不是很大啊,是不是对象的数据啊,所以也我们就想,能不能把这个对象写到硬盘上也,因为数据都封装在对象内,我把对象写出去是不是很方便


上面的结果怎么是这样也

解释一下吧,

记住上面的你就另翻译了,跟你没有什么关系,对象啊在堆中是有对象的吧,它往这里面写的是下面的这些类名啊,东西,这些东西是全文本吗,不是,这往里面写的是字节,写到这里面来以后吧,你把它保存到硬盘就行了,没有让你用记事本解析,记事本解析挂着码表去解码了,你这写的不是正规文字,一解码是不是全部乱了啊,记住了,我们根本就没有想过把它保存在这里边,让记事本去解析,我们想的仅仅是把堆内存中的对象的生命周期延长,放到硬盘上进行持久化,明白了吧,下回我再要这些数据的时候,我不用再new了,直接从硬盘中读就可以了啊,所以啊,这数据就让你保存用,没有让你去解析吧,解析有特定的方式

所以也扩展名也不用。Txt,用.object


序列化:其实就是进行有序的进行排序

 

56-IO流(ObjectInputStream-对象的反序列化)

57-IO流(序列化接口-Serializable)


就是上面我们做的例子也,使用的是private String name,现在我们把这个改成了public String name来进行测试,反序列化,那个obj.object文件还是原来的private String name的方式,现在我们直接进行反序列化,就会出在下面的异常



大家都知道编译器是不是分版本的啊,显示声明出来的好处不同版本的编译器很有可能会导致同一个类编译完的id号不一样,所以啊会导致那个对象取不出来,为了保证尽量一致,不因为编译的不同算的结果不一致,所以也显示声明出来,现在如果我们再进行测试就没有问题了

 

有些对象是需要序列化的,服务器它就会对你的对象进行临时本地存储它怕服务器崩了以后,你的会话都被消失了,所以也它保存在了硬盘上,你重新启动服务器,就重新恢复你的会话,恢复那个对象,你当时的数据都在,服务器想要往硬盘上写,没有这个id号是不是很麻烦啊

 

58-IO流(关键字-transient).

静态的数据,是放在静态区的,没有放在堆内存中,所以被保存在obj.object文件中去,

Transient(短暂的意思),就是在序列化的时候写不到硬盘上去而已

/**

     * transient:非静态数据不想被序列化可以使用这个关键字修饰。

     */

 

 

59-IO流(RandomAccessFile-写入)



609是不是四个字节,它把这个最低字节写进去了,最低字节还是97吧,所以也这年龄就出事了,我们应该把这个数的源字节数写进去,所以也这时候就不能用write了,使用write的话也就只写最低四个字节,我们使用writeInt.就可以保证源字节数,就是四个字节,但是还是不能保存到硬盘的数据是609

 

到这儿我们还没有涉及到随机性的问题也,只是演示了write方法我能直接写基本类型的数据,并且能保持基本数据类型值源字节数啊

 

60-IO流(RandomAccessFile-读取&随机读取)

就因为这个seek方法,我想把指针放在哪儿都行,是不是意味着我们可以随时的读取这文件的信息,而且是想从哪儿读就从哪儿读,这个就叫做随机访问文件



61-IO流(RandomAccessFile-随机写入&细节)

 

这个能随机读取,这要是一个数组的话也,我们如果把指针要是直接随便放在哪儿,写数据是不是可以啊,可以,我不读吗,随机写吗

随机访问文件也一般数据都要有规律,没有规律想随机是不是很难啊,你这一随机,随哪儿去了都不知道,然后你再怎么取你都不知道,要有规律,那中国人的字要多得去了,我们怎么来保存也,我用16个8位,来保存是不是可以了啊,然后其他的我补空格吗,年龄我用四个字节,用20个8位来存储这样的信息吗,

你说就操作文本文件啊,不是下面举例说明

假设这是一个文本文件,我要往这里面写数据,正常来讲是不是写一段,再写一段,再写一段,我用一个流从头写到喂是不是都会啊,我想分段同时往这里面写数据,就是使用多线程,同时写


有哥们开发一个手机视频,断点续传,使用的就是randomAccessFile,

 

62-IO流(管道流-PipedStream)

以前吧,输入流和输出流他们之间是没有关系的,是不是要通过中转啊,现在了使用了管道流过后也,就能把他们接上

使用管道流一定要结合多线程技术来完成,因为read方法是阻塞的,很容易造成死锁

 

什么时候使用管道流也

这个流吧,就一个特点,就是说如果你想指定哪块来的数据,然后我读取那块数据,你可以把这两个流接上,使用管道流来完成这件事,我必须只读这个流里面的数据,可不可以啊

 

63-IO流(操作基本类型数据的流对象-DataStream)

 

你看这个DataStream里面的方法也,,这些方法我们是不是都学过啊,这些方法RandomAccessFile和objectOutputStream都具备,我们为什么用它呢,这些对象虽然有共同的方法但是各个重点的功能是不一样的,我们强调的是它的特有功能ObjectOutputStream是专门用来序列化对象用的,RandomAccessFile是用于随机访问文件的,他们都有特定的场景,如果你仅仅只想操作其基本数据类型用流,用的就是DataOutputStream和DataInputStream,用的时候多吗,比如我们要写一个数据到硬盘上,这个数据是一个基本数据类型,使用DataOutputStream就行,而用普通的就不行,普通的的写一个int,是不是只写最低的那8个字节,如果你想把一个整数,原封不动的写进去的话也,就必须用writeInt

 

下面演示writeUTF,

 


ByteArrayInputStream和ByteArrayOutputStream这两个专门用于操作源是内存,目的还是内存的流,之前我们学过的file是操作硬盘的,System.in和System.out操作的是内存

 

接下来讲讲这两组流的特点

 

操作字符数组和操作字符串的都是用于操作内存的

 

65-IO流(编码表)



66-IO流(简单编码解码)

编码解码体现在哪儿也,最早也是在io里面的转换流里面会涉及编码和解码,现在我们不用流来体现,无非就是文字和二进制之间的一个转换

 

67-IO流(编码解码问题_1)



68-IO流(编码解码问题_2)



69-IO流(联通问题)

String str = "联通";

        /*

        11000001

        10101010

        11001101

        10101000

        */

 

       

        byte[] buf = str.getBytes("gbk");

       

        for(byte b :buf){

            System.out.println(Integer.toBinaryString(b&255));

        }


70-IO流(练习-按字节截取字符串)

我们说说gbk与gb2312的一个区别,gb2312中文两字节表示全都是负数,也就是打头的是1,没想到gbk为了融合更多的文字,有的中文第一个字节是负数,第二个是正数 ,不是两个都是负数

 

我们演示utf-8是使用的一个中文对应三个负数


0 0
原创粉丝点击