黑马程序员 IO流(一)。

本文详细阐述了字符流和字节流的区别,并提供了在不同场景下选择使用字符流还是字节流的指导原则。此外,文章还介绍了流的一般操作规律、转换流的概念以及对象序列化的应用,旨在帮助开发者更好地理解和运用这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- android培训java培训、期待与您交流! ----------

字符流和字节

.字符流和字节流的区别

二者仅仅是操作单位不一样。

InputStream和Reader是所有输入流的基类,OutStream和Writer是所有输出流的基类,他们都是抽象类,本身不能创建实例,但是他们是所有输入流的模板。

一般来说处理字符或字符串时使用字符流,处理字节或二进制对象时应使用字节流;

 字节流

字节流主要是操作byte(字节)的类型数据:

字节输出流:OutputStream

字节输入流:InputStream

字符流

Java中的字符是Unicode编码,是双字节的,1个字符 等于 2个字节;

使用字节来处理字符文本就不太方便了,此时可以考虑使用字符流;

字符流主要是操作char的类型数据:

字符输出流:Writer

字符输入流:Reader

 字节流和字符流的区别

 字节流和字符流在使用上的代码结构都是非常类似的,但是其内部本身也是有区别的,因为在进行字符流操作的时候会使用到缓冲区(内存中),而字节流操作的时候是不会使用到缓冲区的。

在输出的时候,OutputStream类即使最后没有关闭内容也可以输出。但是如果是Writer的话,则如果不关闭,最后一条内容是无法输出的,因为所有的内容都是保存在了缓冲区之中,每当调用了close()方法就意味着清空缓冲区了。那么可以证明字符流确实使用了缓冲区

.流的一般操作规律

抓住4个明确:

1:明确源和目的。

        源:输入流。InputStream  Reader

        目的:输出流。OutputStream  Writer。

2:操作的数据是否是纯文本。

        是:字符流。

        不是:字节流

3:当体系明确后,在明确要使用哪个具体的对象。

        通过设备来进行区分:

        源设备:内存,硬盘。键盘

        目的设备:内存,硬盘,控制台

/*
通过缓冲区复制一个.java文件。

*/
import java.io.*;

class  CopyTextByBuf
{
	public static void main(String[] args) 
	{
		BufferedReader bufr = null;
		BufferedWriter bufw = null;

		try
		{
			bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
			bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));

			String line = null;

			while((line=bufr.readLine())!=null)
			{
				bufw.write(line);
				bufw.newLine();
				bufw.flush();

			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("读写失败");
		}
		finally
		{
			try
			{
				if(bufr!=null)
					bufr.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("读取关闭失败");
			}
			try
			{
				if(bufw!=null)
					bufw.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("写入关闭失败");
			}
		}
	}
}

转换流:

字节流-->字符流转换:

OutputStreamWriter:把字节输出流对象转成字符输出流对象

InputStreamReader:把字节输入流对象转成字符输入流对象

FileWriterFileReader分别是OutputStreamWriterInputStreamReader的直接子类,而不是WriterReader的直接子类,区别于FileInputStream InputStream


class EncodeStream  
 	{  
 	         public static void main(String[] args) throws IOException  
 	         {  
 	                            //writeText();  
 	                            readText();  // 用GBK编码,UTF—8解码,肯定会出现乱码
 	         }  
 	   
 	         public static void readText()throws IOException  
 	         {  
 	                   InputStreamReader isr = new InputStreamReader(newFileInputStream("utf.txt"),"gbk");  
 	   
 	                   char[] buf = new char[10];  
 	                   int len = isr.read(buf);  
 	   
 	                   String str = new String(buf,0,len);  
 	   
 	                   System.out.println(str);  
 	   
 	                   isr.close();  
 	         }  
 	         public static void writeText()throws IOException  
 	         {  
 	                   OutputStreamWriter osw = new OutputStreamWriter(newFileOutputStream("utf.txt"),"UTF-8");  
 	   
 	                   osw.write("你好");  
 	   
 	                   osw.close();  
 	         }  
 	   
 	}

对象序列化

ObjectInputStreamObjectOutputStream

class ObjectStreamDemo 
{
	public static void main(String[] args) throws Exception
	{
		//writeObj();
		readObj();
	}
	public static void readObj()throws Exception
	{
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));

		Person p = (Person)ois.readObject();

		System.out.println(p);
		ois.close();
	}

	public static void writeObj()throws IOException
	{
		ObjectOutputStream oos = 
			new ObjectOutputStream(new FileOutputStream("obj.txt"));

		oos.writeObject(new Person("lisi0",399,"kr"));

		oos.close();
	}
}

调用ObjectOutputStream的writeObject方法时,对象需要实现Serializable接口,把一个类或者对象保存到文件必须用ObjectOutStream,这个javaBean需要实现些约来则啵接口。意义:序列化到本地存储,持久化存储,File是文件文件之间互写,ObjectOutputStream是对象和文件之间互写。


------- android培训java培训、期待与您交流! ----------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值