`
哈达f
  • 浏览: 119640 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

IO字符流阶段总结

    博客分类:
  • j2se
 
阅读更多
IO:
用于设备上的数据处理。

IO的分类:
	字符流,字节流。
	在早期时,只有字节流,后期为了方便处理不同的文字出现了字符流。
	因为编码的原因,而出现字符流。

	所有IO体系中的对象通常都以自己所属的父类名作为子类名的后缀名。

	IO体系顶层类:
	四个抽象基类:
	字节流:
	InputStream OutputStream。
	字符流:
	Reader Writer。

	使用了字符流中的子类对象。因为要操作的是硬盘的文件。
	所以使用了FileReader,FileWriter.

	需求:
	在硬盘上建立一个文件,并往文件中写入内容。
	1,建立字符写入流对象。
		建立了流对象,调用了window资源,在指定位置创建了demo.txt文件。先建立了数据存储的目的。
		但是因为传递参数的原因,有可能出现IO异常。

		如果指定目录下已有该文件会出现覆盖操作。
		如果需求是在原有文件中进行数据的续写。要在构造时,传入另一个参数true。new FileWriter("demo.txt",true);
	FileWriter fw = new FileWriter("demo.txt");

	2,调用流对象写入方法,将数据写入到流中。
	fw.write("abcdec");//fw.write("abcd".toCharArray());

	3,对流中的数据进行刷新,将数据刷到目的当中。
	fw.flush();
	可以进行频繁写入,并刷新。。。。
	4,关闭资源,会刷新它先。
	fw.close();
	

	public void show()
	{
		FileWriter  fw = null;
		try
		{
			fw = new FileWriter("c:/demo.txt");
			fw.write("abced");
		}
		catch(IOException e)
		{
			System.out.println(e.toString());
		}
		finally
		{
			/*
			if(fw!=null)
				try 
				{
					fw.close();
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
			*/
			closeAll(fw,null);
		}
	}
	

	需求:
	读取硬盘上的数据,并将其打印在控制台上。
	//1,建立字符读取流对象。先用流对象与要读取的文件相关联。必须要保证该是存在的,否则会发生FileNotFoundException。
	FileReader fr = new FileReader("demo.txt");

	//2,定于一个临时容器,因为读到的都是字符数据,所以建立一个字符数组。
	该数组的长度如何定义呢?以计算机的基本单位或者其整数倍作为长度
	char[] arr = new char[1024];

	//3,使用读取流对象的read(arr)方法,将读取到每一个字符数据存入到数组中。
	该方法会读到的字符个数。其实就是往数组里面装的元素的个数。
		int num = 0;

		while((num=fr.read(arr))!=-1)
		{
			System.out.println(new String(arr,0,num));
		}

	//4,关闭资源。
	fr.close();

	注意:读取流还有一个read()方法,该方法是没有参数的,一次读一个字符,并将读到的字符返回。
	int ch = 0;
	while((ch=fr.read())!=-1)
	{
		System.out.println((char)ch);
	}



	需求:
	copy文本文件

	public void show()
	{
		FileReader fr = null;
		FileWriter fw = null;

		try
		{
			fr = new FileReader("demo.txt");
			fw = new FileWriter("copydemo.txt");

			char[] arr = new char[1024];
			int num = 0;

			while((num=fr.read(arr))!=-1)
			{
				fw.write(arr,0,num);
			}
		}
		catch(Exception e)
		{
			ystem.out.println(e.toString());
		}
		finally
		{
			closeAll(fw,fr);
		}

	}
	public void closeAll(Writer w,Reader r)
	{
		if(w!=null)
			try 
			{
				w.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		if(r!=null)
			try 
			{
				r.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
	}


-----------------------------------------

为了提高了对流的操作效率,出现了缓冲技术,提高了流的操作效率。
该缓冲技术也被封装成了对象。
对于字符流:
BufferedWriter:
	newLine();跨平台的换行符。
BufferedReader
	readLine():一次获取一行数据。不包括回车符。

缓冲技术,是为了提高流的效率,所以缓冲对象在初始化的时必须要有流。
使用缓冲技术一定要使用flush();

	需求:通过缓冲技术对文本数据进行copy.
	public void show()
	{
		FileReader fr = new FileReader("demo.txt");
		BufferedReader bufr = new BufferedReader(fr);

		FileWriter fw = new FileWriter("bufdemo.txt");
		BufferedWriter bufw = new BufferedWriter(fw);

		String line = null;

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

		bufw.close();
		bufr.close();

		//closeAll(bufw,bufr);
	}


缓冲技术的出现对流的读取和写入都进行了增强。
其实就是将一个数组封装在缓冲对象中。

这里就用到了一种设计模式:装饰设计模式。
该模式可以对类中的功能进行增强,优化了继承。

通过继承一样可以完成对类功能的增强,为了还要装饰呢?

Writer
	|--FileWriter
		|--BufferFileWriter
	|--MediaWriter
		|--BufferMediaWriter
	|--DateWriter
		|--BufferDateWriter

为了增强子类的操作效率。想到了缓冲技术。通过继承的方法,在子类中建立带缓冲技术的功能。

但是在设计方式中,发现该体系变的比较臃肿,而且功能都在重复。
那么,进一步优化该设计。
可不可以将缓冲技术进行抽取,单独进行描述。
想要对这些子类进行增强时,只要将每一个子类作为参数传递给缓冲类的构造函数即可。

Writer
	|--FileWriter
	|--MediaWriter
	|--DateWriter
	|--Buffer

class Buffer
{
	Buffer(FileWriter w)
	{}
	Buffer(MediaWriter w)
	{}
	Buffer(DateWriter w)
	{}	
}
发现这样设计不具备扩展性。
因为传递的都是Writer的子类,只要建立父类引用即可,多态。

class  Buffer extends Writer
{
	Buffer(Writer w)
	{}
}


---------------------------------------

readLine():原理:其实还是用底层read方法,只不过将每一次读到的字符进行临时存储,	
	  当读到回车符,将临时存储的数据一次性返回。

class MyBufferedReader 
{
	private Reader  r;
	MyBufferedReader(Reader r)
	{
		this.r = r;
	}
	public String myReadLine()throws IOException
	{
		StringBuilder sb = new StringBuilder();

		int ch = 0;
		while((ch=r.read())!=-1)
		{
			if(ch=='\r')
				continue;
			if(ch=='\n')
				return sb.toString();
			else
				sb.append((char)ch);
		}
		if(sb.length()!=0)
			return sb.toString();
		return null;
	}
	public void myClose()throws IOException
	{
		r.close();
	}
}


-----
带行号
class MyLineNumberReader extends MyBufferedReader
{	
	private int myNumber;
	MyLineNumberReader(Reader r)
	{
		super(r);
	}
	public void setMyNumber(int myNumber)
	{
		this.myNumber = myNumber;
	}
	public int getMyNumber()
	{
		return myNumber;
	}

	public String myReadLine()throws IOException 
	{
		myNumber++;
		return super.myReadLine();
	}
}


 

分享到:
评论

相关推荐

    android io.socket.client.zip

    总结起来,`android io.socket.client.zip` 包含的这些组件共同构成了Android平台上使用 `socket.io` 进行即时通讯的基础。`socket.io-client.jar` 提供了与服务器通信的API,依赖的库如 `fastjson`、`okhttp` 和 `...

    Java第二阶段学习总结

    IO流(Input/Output Stream)是Java进行输入输出操作的基础,分为字节流和字符流两类。字节流处理单个字节的数据,如FileInputStream和FileOutputStream,而字符流处理Unicode字符,如BufferedReader和PrintWriter。...

    王道JavaSE阶段测试

    5. **IO流**:字节流与字符流,缓冲流,对象序列化,文件操作,输入输出流的关闭。 6. **多线程**:线程的创建方式(继承Thread类和实现Runnable接口),线程同步(synchronized关键字,wait(),notify(),...

    java面试总结.doc

    IO流是Java中处理输入输出的重要机制,分为字节流和字符流两大类。字节流主要处理字节数据,如图片、视频、音频等非文本信息,包括InputStream和OutputStream作为基类,以及它们的子类如FileInputStream和...

    搜索引擎上搜索字符与汉字的转换

    为了更深入地理解这一过程,你可以通过学习Java的IO流和字符编码相关知识,以及熟悉HTTP协议中的请求参数传递方式。此外,对于网络开发者来说,掌握字符编码原理有助于解决跨平台、跨浏览器的文本显示问题,避免出现...

    Java实验五输入输出流

    通过实际操作,掌握Java提供的各种字节流类和字符流类的功能与使用方法,具体包括: - 文件与流的基本概念。 - Java流的层次结构。 - 字节流类与字符流类的功能和使用方法。 #### 二、实验内容分析 ##### 1. 文本...

    java学习路线总结.doc

    - **IO流**:学习IO流的概念,区分字节流和字符流,掌握文件流、转换流、缓冲流和对象流的使用。 - **流的组合**:使用不同的流实现文件内容的拷贝,了解RandomAccessFile和Properties类的用途。 **第七阶段:多...

    JAVA2学习资料--第二部分ppt教程

    掌握FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等基本流的使用,以及流的分类(字符流与字节流)、转换流和对象流的操作,可以让你更好地进行文件操作和网络通信。 五、多线程 Java提供了...

    蜗牛学院-第一阶段java开发班笔记.zip

    10. **输入输出流**:基础的文件读写操作,以及IO流的分类和使用。 11. **接口与内部类**:接口的定义、实现,以及内部类(成员内部类、局部内部类、匿名内部类)的使用场景。 12. **文件与目录操作**:在Java中...

    JavaSE知识点总结(个人整理).docx

    IO 体系包括字节流和字符流两种,字节流用于文件的读写操作,字符流用于文本文件的读写操作。 六、多态的好处和弊端 多态可以提高程序的可维护性和扩展性,因为多态可以使得父类的引用可以指向子类对象,从而可以...

    java中高级面试题十大总结

    - Java的IO流分为字节流和字符流,还有输入流和输出流,以及缓冲流、转换流等。 - NIO(New IO)引入了通道(Channel)和缓冲区(Buffer),支持非阻塞I/O,提高了效率。 7. **反射与注解** - 反射API允许程序在...

    北大青鸟S1第一本书知识总结.rar

    Java的IO流用于数据的读写,包括文件操作、字符流和字节流,以及缓冲流和对象序列化。 11. **集合框架**: 学习ArrayList、LinkedList、HashSet、HashMap等集合类的使用,以及泛型和迭代器的概念。 12. **枚举与...

    Java全阶段综合笔试面试题(含答案).docx

    - 字符流和字节流。 - `Reader`、`Writer`、`InputStream`、`OutputStream`。 45. **NIO的原理以及NIO和BIO的区别** - **NIO**(New I/O): 基于通道(Channel)和缓冲区(Buffer)的模型。 - **BIO**(Blocking I/O):...

    北大青鸟S2考试机试题目

    6. **IO流**:Java的IO流用于数据输入输出,分为字节流和字符流两类,包含许多类和接口。考生需掌握流的读写操作,以及缓冲区的概念,了解FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等常用...

    黑马程序员入学Java精华总结

    ### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...

    JAVA面 试 题 目 总结文档

    - 字节流和字符流的区别,以及InputStream、OutputStream、Reader、Writer的使用。 - 文件操作:File类的常见方法,以及RandomAccessFile的使用。 - 缓冲流:BufferedInputStream、BufferedOutputStream、...

    java面试资料总结

    - **IO流**:字节流与字符流,缓冲流,对象序列化。 - **网络编程**:TCP/UDP协议,Socket编程。 - **设计模式**:常见的23种设计模式及其应用场景。 - **数据库相关**:SQL语句,JDBC操作,事务处理。 这些...

    Java学习大纲.pdf

    5. IO与NIO:掌握文件操作、字节流、字符流、对象流的使用,以及NIO(非阻塞I/O)的优势和应用。 阶段项目:企业办公辅助系统,实现即时通讯功能,包括人员管理、聊天、文件传输等功能。通过此项目,学生将能够编写...

    2013年java开发最常见的笔试面试题大总结

    1. 流的分类:掌握字节流和字符流,以及输入流和输出流的概念。 2. 文件操作:了解File类的常用方法,以及FileInputStream和FileOutputStream的使用。 3. 转换流:理解BufferedReader和BufferedWriter的作用,以及...

    java知识体系总结

    - **流**:数据传输的通道,分为字节流和字符流,包括输入流和输出流。 - **缓冲区**:NIO引入了缓冲区,提高数据读写效率。 - **文件操作**:创建、删除、读取和写入文件。 6. **多线程** - **线程**:程序中...

Global site tag (gtag.js) - Google Analytics