黑马程序员_15_IO流

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 
IO 流:
IO流用来处理设备之间的数据传输。
Java对数据的操作时通过流的方式。
java用于操作流的对象都在IO包中。
流按操作数据类型分为两种:字符流,字节流。
流按流向分为:输入流,输出流。

IO体系:
InputStream  OutputStream 
Read             Write 
流缓冲区:
BufferInputStream BufferOutputStream 
BufferRead           BufferWrite 

使用FileWrite创建一个文件,以及异常的处理。
class FileWriterDemo
{
	public static void main(String[] args)
	{
		FileWriter fw=null;
		try
		{
			fw=new FileWriter("a.txt");
			fw.write("a");
			fw.fulsh();
		}
		catch (IOException e)
		{
			System.out.println(e.toString);
		}
		finally
		{
			if(fw!=null)

			{
				try
				{
					 fw.close();
				}
				catch (IOException e)
				{
					System.out.println(e.toString);
				}
			}
		}
		
	}
}

文本文件的续写:使用FileWriter的一个构造方法创建对象:FileWrite(String name,boolean append);append为true时续写。

文本文件的读取方式:
方式一:一次读取一个,read()的返回值为int,当读到文件末尾时,返回-1;
class FileReaderDemo
{
	public static void main(String[] args) throws Exception
	{
		FileReader fr=new FileReader("a.txt");
		
		while (true)
		{
			int ch=fr.read();
			if (ch==-1)
				break;
			System.out.println((char)ch);
		}
		fr.close();
	}
}

方式二:read(char[] cbuf,cbuf),将读取的数据存入一个char数组,返回读取的长度。
class FileReaderDemo
{
	public static void main(String[] args) throws Exception
	{
		FileReader fr=new FileReader("a.txt");
		char[] cbuf=new char[1024];
		int len=0;		
		while ((len=fr.read(ch))!=-1)
		{
			
			System.out.println(new String(ch,0,len);
		}
		fr.close();
	}
}

拷贝文本文件:
流程:1.FileReader读取文件,存入char[] 。
  2.FileWriter写入新文件,把char[]中的数据写入文件,读一次,取一次
class FileReaderDemo
{
	public static void main(String[] args) throws Exception
	{
		FileReader fr=new FileReader("a.txt");
		FileWriter fw=new FileWriter("a_copy.txt");
		
		char[] cbuf=new char[1024];
		int len=0;		
		while ((len=fr.read(ch))!=-1)
		{
			fw.write(cbuf,0,len);
		}
		fr.close();
		fw.close();
	}
}
缓冲字写符流BufferedWriter:
为了提高字符写入流效率,加入了缓冲技术。操作方法是把被流对象作为参数传递给缓冲区的构造函数。
例: BufferedWriter buf=new BufferedWriter(new FileWrite("buf.txt"));
BufferWriter的特有方法:newline(),开始新的一行。

缓冲字读符流BufferedReader:
从字符输入流读取文本,缓冲各个字符,从而实现字符,数组,和行的高效读取。
特有方法:readLine(),读取一行,返回读取的字符串,不包含任何终止符,读到文件末尾处返回null。

通过缓冲区复制文本文件:
class FileCopyDemo
{
	public static void main(String[] args) throws Exception
	{
		BufferedReader buffr=new BufferedReader(new FileReader("a.txt"));
		BufferedWriter buffw=new BufferedWriter(new FileWriter("a_copy.txt"));
		
		String line=null;
		int len=0;		
		while ((line=bufr.readLine(ch))!=null)
		{
			bufw.write(line);
		}
		fr.close();
		fw.close();
	}
}
readLine的方法原理:无论是读一行,或者是读取多个字符,其实最终都是在硬盘上一个一个读取。所以最终使用的还是read方法一次读一个的方法。
根据这个原理自定义一个缓冲区:
class MyBufferedReader
{
	private FileReader fr=null;
	public MyBufferedReader(FileReader fr)//把流文件传进来
	{
		 this.fr=fr;
	}
	public String myReadLine() throws IOException  //抛出异常,让调用者处理
	{

		 //使用StringBuilder缓存读取的数据,当读到\r\n时,返回StringBuilder.
		 StringBuilder sb=new StringBuilder();
		 int ch=0;
		 while((ch = fr.read())!=-1)
		{
			if(ch=='\r')
				continue;
			if(ch=='\n')
				return sb.toString();
			sb.append((char)ch);	
		 }
		 return null;
	}
	public void myClose()//调用流的方法创建自己的关闭流方法
	{
		fr.close();
	}
}
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接受被装饰的对象,并基于已有的功能,并提供加强功能。
装饰 和继承的区别:
装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常都属于同一个体系中。 
自定义一个装饰类
class MyBufferedReader extends Reader //继承Reader
{
	private Reader fr=null;
	public MyBufferedReader(Reader fr)
	{
		 this.fr=fr;
	}
	public String myReadLine() throws IOException
	{
		 StringBuilder sb=new StringBuilder();
		 int ch=0;
		 while((ch = fr.read())!=-1)
		{
			if(ch=='\r')
				continue;
			if(ch=='\n')
				return sb.toString();
			sb.append((char)ch);	
		 }
		 return null;
	}

	//覆盖父类中的抽象方法
	public int read(char[] cbuf, int off, int len) throws IOException
	{
		return fr.read(cbuf,  off,  len) ;//使用传入对象来实现该方法
	}

	//覆盖父类中的抽象方法
	public void close() throws IOException
	{
		fr.close();
	}
}

LineNumberReader是一个装饰类,继承自BufferedReader
有两个独有的方法。
serLineNumber(int i) 设置当前行号。
getLineNumber()       获取当前行号。
自定义一个LineNumberReader
class MyLineNumberReader extends BufferedReader
{
	
	private int lineNum;
	public MyLineNumberReader(Reader fr)
	{
		 super(r);
	}
	public String myReadLine() throws IOException
	{
		 lineNum++;
		 return super.readLine();	 
	}
	public void setLineNumber(int lineNumber)
	{
		this.lineNum=lineNum;
	}
	public int getLineNumber()
	{
		return lineNum;
	}
	
}

字节流:
想要操作图片等数据,就要用到字节流。基本操作与字符流差不多。
字节流缓冲区没有readLine();



------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的疫情居家办公系统。该系统旨在为居家办公的员工提供一个高效、便捷的工作环境,同时帮助企业更好地管理远程工作流程。项目包含了完整的数据库设计、前后端代码实现以及详细的文档说明,非常适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 系统的核心功能包括用户管理、任务分配、进度跟踪、文件共享和在线沟通等。用户管理模块允许管理员创建和管理用户账户,分配不同的权限。任务分配模块使项目经理能够轻松地分配任务给团队成员,并设置截止日期。进度跟踪模块允许员工实时更新他们的工作状态,确保项目按计划进行。文件共享模块提供了一个安全的平台,让团队成员可以共享和协作处理文档。在线沟通模块则支持即时消息和视频会议,以增强团队之间的沟通效率。 技术栈方面,后端采用了Spring框架来管理业务逻辑,SpringMVC用于构建Web应用程序,MyBatis作为ORM框架简化数据库操作。前端则使用Vue.js来实现动态用户界面,搭配Vue Router进行页面导航,以及Vuex进行状态管理。数据库选用MySQL,确保数据的安全性和可靠性。 该项目不仅提供了一个完整的技术实现示例,还为开发者留下了扩展和改进的空间,可以根据实际需求添加新功能或优化现有功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值