ObjectOutputStream的writeObject方法使用Java的默认字符编码。在Java中,默认字符编码是UTF-8。
编码转换流 字节流:针对二进制文件 字符流:针对文本文件,读写容易出现乱码的现象,在读写时,最好指定编码集为UTF-8 1 概述 编码转换流(InputStreamReader/OutputStreamWriter...)主要进行编码的转换,用来解决字符流读写乱码的问题 2 工具API学习 OutputStreamWriter : OutputStreamWriter(OutputStream out)把传入的字节流转成字符流...,并将读取到的信息打印在控制台 //read方法的返回值类型是int,打印的是编码 //UTF-8-28023 gbk-23092 iso-8859-1-230 //System.out.println...(in.read()); //拓展:将刚刚读到的数据,以中文的格式展示在控制台 char[] ch = new char[8192]; //Reader中的方法:read(char[] cbuf)将字符读入数组...,返回读取到的字符的个数 int len = in.read(ch);//len保存的是读取到的字符的个数 //此处是String的构造函数,利用ch数组中的数据,构建一个字符串,并打印到控制台 System.out.println
每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH)。这对于英文而言,是没有问题的,一般只什么用到前128个(00H–7FH,最高位为0)。...使用不同的编码方式,相同的字符会有不同的二进制表示。...,如果用十六机制编辑器打开文件可以看到64 65 6D 6F,我们并没有在代码中指定编码方式,实际上,在我们没有指定时使用的是操作系统的默认字符编码方式来对我们要写入的字符进行编码。...此处为了避免中文乱码的,将字节流指定编码转换为字符流,然后再用 getBytes(“UTF-8”) 方法获取相应编码的字节,实现字节流输出。...那么为什么以上的结果却通过序列化和反序列化把List中的元素保留下来了呢 在ArrayList中定义了来个方法: writeObject()和readObject() 结论是: 在序列化过程中,如果被序列化的类中定义了
字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。...先去查指定的编码表,将查到的字符返回。字节流可以处理所有类型数据,如:图片, MP3 ,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。...序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream...)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态...序列化API java.io.ObjectOutputStream代表对象输出流,它的 writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中
简介 我们在程序中除了使用常用的字符串进行数据传递之外,使用最多的还是JAVA对象。在JDK中,对象如果需要在网络中传输,必须实现Serializable接口,表示这个对象是可以被序列化的。...今天带大家来看看netty中提供的对象编码器。 什么是序列化 序列化就是将java对象按照一定的顺序组织起来,用于在网络上传输或者写入存储中。...注意,writeObject和readObject都是private void的方法。他们的调用是通过反射来实现的。...使用真正的加密 上面的例子, 我们只是对age字段进行了加密,如果我们想对整个对象进行加密有没有什么好的处理办法呢?...这是因为我们需要一个通用的对象编码和解码器,如果使用ObjectOutputStream和ObjectInputStream,因为不同对象的结构是不一样的,所以我们在读取对象的时候需要知道读取数据的对象类型才能进行完美的转换
:可使用指定的 charset 将要写入流中的字符编码成字节。...构造方法: OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。...使用步骤: 1.创建ObjectOutputStream对象,构造方法中传递字节输出流 2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中 3.释放资源...对象 4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化 5.创建一个反序列化ObjectInputStream对象 6.使用ObjectInputStream...//4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化 oos.writeObject(list); //5
需求:在控制台输入一句话,然后原样输出 标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。...提供了更强大的 print() println() 打印方法用于打印各种数据类型。...=null ) { 12 ps.println(line); 13 } 14 } PrintStream 打印的所有字符都使用平台的默认字符编码将字节转换为字符。....serializable.Student at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject...(ObjectOutputStream.java:348) at cn.sxt05.serializable.Test01.main(Test01.java:22) Serializable接口没有方法或字段
1.字符流 1.1为什么会出现字符流【理解】 字符流的介绍 由于字节流操作中文不是特别的方便,所以Java就提供字符流 字符流 = 字节流 + 编码表 中文的字节存储方式 用字节流复制文本文件时...汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数 1.2编码表【理解】 什么是字符集 是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等 l计算机要准确的存储和识别各种字符集符号...它使用一至四个字节为每个字符编码 编码规则: 128个US-ASCII字符,只需一个字节编码 拉丁文等字符,需要二个字节编码 大部分常用字(含中文),使用三个字节编码 其他极少使用的Unicode...辅助字符,使用四字节编码 1.3字符串中的编码解码问题【应用】 相关方法 方法名 说明 byte[] getBytes() 使用平台的默认字符集将该 String编码为一系列字节 byte[] getBytes...的ObjectOutputStream 序列化对象的方法 方法名 说明 void writeObject(Object obj) 将指定的对象写入ObjectOutputStream 示例代码 学生类
接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。...这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。...2)序列前的对象与序列化后的对象是什么关系?是("=="还是equal?是浅复制还是深复制?) 答案:深复制,反序列化还原后的对象地址与原来的的地址不同。...在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被修改后重新部署了,那么在这种情况下, 用老软件来读取新文件格式虽然不是什么难事,但是有可能丢失一些信息...●域的名字(name)。 ●方法的名字(Save)。 ●已实现的接口(Serializable)。 改动上述任意一项内容(无论是增加或删除),都会引起编码值变化,从而引起类似的异常警报。
什么是序列化和反序列化,为什么需要序列化? Java中Serializable的序列化是怎么实现的? Android中Parcelable的序列化是怎么实现的? 有哪些使用场景,实现方式怎么选?...objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject("Hello...0005 是stream header的版本号 //74 是字符串类型的标识,如果字符串长度小于0xFFFF,写入0x74,否则写入0x7C //000C 是字符串的长度,我们写入的是“Hello world...,而且Java还提供了writeObject和readObject二个方法,Serializable在序列化时,如果检测到我们的类重写了writeObject方法,就执行该方法来替代默认的序列化调用。...JDK中有很多这样的类,比如ArrayList,HashMap,都是重写 了writeObject方法。
使用场景:所有可在网络上传输的对象都必须是可序列化的,比如RMI(remote method invoke,即远程方法调用),传入的参数或返回的对象都是可序列化的,否则会出错;所有需要保存到磁盘的java...Serializable java.io.ObjectOutputStream代表对象输出流 它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中...使用transient虽然简单,但将此属性完全隔离在了序列化之外。java提供了可选的自定义序列化。可以进行控制序列化的方式,或者对序列化数据进行编码加密等。...如果writeObject使用某种规则序列化,则相应的readObject需要相反的规则反序列化,以便能正确反序列化出对象。这里展示对名字进行反转加密。...通常建议对于final修饰的类重写readResolve方法没有问题;否则,重写readResolve使用private修饰。
本文介绍了Java序列化的基本概念,序列化和反序列化的使用方法,以及实现原理等,比较全面地总结序列化相关知识点,并且使用具体例子来加以佐证。...而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。...writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。...那么随机生成的序列化 ID 有什么作用呢,有些时候,通过改变序列化 ID 可以用来限制某些用户的使用。 4、序列化并不保存静态变量。
而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。...(该接口并没有方法和字段,为什么只有实现了该接口的类的对象才能被序列化呢?) 当试图对一个对象进行序列化的时候,如果遇到不支持 Serializable 接口的对象。...writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。...那么随机生成的序列化 ID 有什么作用呢,有些时候,通过改变序列化 ID 可以用来限制某些用户的使用。 4、序列化并不保存静态变量。
序列化的步骤通常是首先创建一个ObjectOutputStream输出流,然后调用ObjectOutputStream对象的writeObject方法,按照一定格式(上面提到的)输出可序列化对象。...writeObject0方法的代码中,会主要使用到bout对象的方法setBlockDataMode关闭Data Block模式; Data Block模式: 在JDK 1.2中,有必要修改和JDK 1.1...false (因为在ObjectOutputStream的public构造方法中已经初始化了enableOverride = false;) 然后才是进入了关键方法writeObject0进一步序列化...),然后写入字符串的长度和内容; 现在我们重点来看看writeOrdinaryObject方法。...,跟进去: writeClassDesc方法主要用于判断当前的类描述符使用什么方式写入,如果传入的类描述信息是一个null引用,那么会调用writeNull方法,如果没有使用unshared方式,并且可以在
而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。...(该接口并没有方法和字段,为什么只有实现了该接口的类的对象才能被序列化呢?) 当试图对一个对象进行序列化的时候,如果遇到不支持 Serializable 接口的对象。...writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。...那么随机生成的序列化 ID 有什么作用呢,有些时候,通过改变序列化 ID 可以用来限制某些用户的使用。4、序列化并不保存静态变量。
ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。...); out.writeObject("序列化日期是:"); //序列化一个字符串到文件 out.writeObject(new Date()); //序列化一个当前日期对象到文件 UserInfo...无论是使用transient关键字,还是使用writeObject()和readObject()方法,其实都是基于Serializable接口的序列化。...这也就是为什么输出结果中所有字段的值均为空。...解决 在序列化过程中,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化,如果没有这样的方法,则默认调用是ObjectOutputStream
Properties类 表示一个持久的属性集; 特点: HashTable的子类,Map集合中的方法都可以使用; 该集合没有泛型,键值都是字符串; 持久的属性集; 特有方法: Object setProperty...reader):按简单的面向行的格式从输入字符流中读取属性列表(键和元素对); void store(OutputStream out, String comments):以适合使用 load(InputStream...):以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符; 序列化流与反序列化流 特点:用于操作对象,可以将对象写入到文件中,也可以从文件中读取对象...; ObjectOutputStream:对象的序列化 void writeObject(Object obj):将指定的对象写入 ObjectOutputStream; ObjectOutputStream...= 42L; //对类的序列号进行了绑定 如果你不想让资源类中某一个变量序列化; 可使用以下方法: transient:阻止成员变量序列化; static:无法进行序列化; 如图位置: io流往期
为什么要有字符流? Java中字符是采用Unicode标准,Unicode 编码中,一个英文为一个字节,一个中文为两个字节。 而在UTF-8编码中,一个中文字符是3个字节。...例如下面图中,“云深不知处”5个中文对应的是15个字节:-28-70-111-26-73-79-28-72-115-25-97-91-27-92-124 那么问题来了,如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题...:字节流中包含字符流 * * 按照功能分类: * 节点流:所有的流都又叫做节点流 * 过滤流:给流增强功能的 * * 使用流步骤: * 1、...oos = new ObjectOutputStream(fos); // oos.writeObject(stu); // //关闭流 // oos.close(); // fos.close...oos = new ObjectOutputStream(fos); oos.writeObject(slist); oos.close(); fos.close(); System.out.println
一般情况下使用最多的是字节,字节相当于人民币的元一样,虽然不是最低的,但却是最常用的。 一串字符在内存中一般是以ascii编码形式存在,不同编码占用子节长度不同 一个ascii码的占用一个字节。...utf-8 是我们国内常用的是针对unicode码的一种可变编码方式。 ascii unicode 字节序 当一串数据太大的时候,一个字节放不下,就需要使用多个字节。...JDK类库中序列化和反序列化API java.io.ObjectOutputStream: 表示对象输出流; 它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化...: ObjectOutputStream调用User对象的writeObject(ObjectOutputStream out)的方法进行序列化。...现在可以打开计算器,明白什么是序列与反序列化了。
领取专属 10元无门槛券
手把手带您无忧上云