java IO总结

IO流:数据传输的总称,即数据在两设备间的传输称为流

字节流与字符流区别

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
***优先使用字节流,字符在内存中才会形成

InputStream 输入字节流 抽象类,所有输入字节流的父类
FileInputStream 使用

// TODO Auto-generated method stub
		FileInputStream input=null;
		try {
			input=new FileInputStream("IOTestFile.txt");
			int value=0;		
			while((value=input.read())!=-1){//value为字符的ASCII码值
				System.out.print((char)value);
			}			 
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
				try {
					if(input!=null){
					input.close();
					} 
					}catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

OutputStream 输出字节流

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。

https://www.cnblogs.com/QQ846300233/p/6046388.html

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程
2、序列化的使用场景

这个使用场景应该算是最重要的一环了,因为我们学习序列化就是为了使用他,现在把他们归纳一下:

(1)永久性保存对象,保存对象的字节序列到本地文件或者数据库中; 、

(2)通过序列化以字节流的形式使对象在网络中进行传递和接收;

(3)通过序列化在进程间传递对象;
3、序列化有什么好处呢?

其实好处是根据使用场景来的;

(1)实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上

(2)利用序列化实现远程通信,即在网络上传送对象的字节序列。
在这里插入图片描述
Java序列化的特殊情况
   1:静态变量和transient关键字修饰的变量不能被序列化;

    2:反序列化时要按照序列化的顺序重构对象:如先序列化A后序列化B,则反序列化时也要先获取A后获取B,否则报错。

    3:序列化ID的作用:虚拟机是否允许对象反序列化,不仅取决于该对象所属类路径和功能代码是否与虚拟机加载的类一致,而是主要取决于对象所属类与虚拟机加载的该类的序列化 ID 是否一致。

    4:自定义序列化方法的应用场景:对某些敏感数据进行加密操作后再序列化;反序列化对加密数据进行解密操作。

    5:重复序列化:同一个对象重复序列化时,不会把对象内容再次序列化,而是新增一个引用指向第一次序列化时的对象而已。

其他序列化手段
   1:把对象包装成JSON格式进行序列化

    2:用XML格式序列化

    3:采用第三方插件(如:ProtoBuf)进行序列化
//任何数据
String msg
byte[] data=msg.getBytes()//字符串转字节数组  编码
new FileOutputStream(new File(filePath)).write(data,0,data.length);


//针对文本
byte[] data=msg.toCharArray()//字符串转字符数组
new FileWriter(new File(filePath)).write(data,0,data.length)
new FileWriter(new File(filePath)).write(msg,0,msg.length)//flush

writer.append(str1).append(str2)//flush


//java访问内存  字节数组流  文件变为内存,因此不用释放资源,由JVM处理

byte[] src="hello world".getBytes();//源
inputStream input=null;
input=ByteArrayInputStream(src);//使用字节数组流将源与程序连接
byte[] flush=new byte[5];//缓冲容器
int len=-1;
while((len=input.read(flush))!=-1){//将字节数组读到缓冲容器中
   string str=new string(flush,0,len);
}

//output=ByteArrayOutputStream
ByteArrayOutputStream output= new ByteArrayOutputStream();//不关联源
byte[] data=msg.getBytes();
output.write(data,0,data.length);
output.flush();
dest=output.toByteArray();//获取数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值