`
美丽的小岛
  • 浏览: 310814 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

两个角度看JAVA的IO流

    博客分类:
  • java
阅读更多

     这个存在心中的顾虑,在某个时候有一点放宽。本来觉得io流已经掌握了,可是当用起来那时,还是显得没有那么得心应手。古语有云:横看成岭侧成峰。一个问题,从多几个角度去看的话,会觉得明白很多。从一个侧面到另外一个侧面去看。

两个角度:一个角度,decorator设计模式;另一个从传统学习的知识完备性出发(API)。

 

一、Decorator设计模式看IO

     

 decortor

 

 UML图很明显了,下面看一个Cat例子:

对应于上图:

Cat-----Component

public interface Cat {
	void behavior();
}

 

SmallCat----ConcreteComponent

public class SmallCat implements Cat {
	private String name;

	SmallCat() {
	}

	SmallCat(String name) {
		this.name = name;
	}

	public void behavior() {
		// TODO Auto-generated method stub
		System.out.print("I'm small cat! My name is " + name);
	}
}

 

Decorator----Decorator

public interface Decorator extends Cat {
	public void add() ;
}

 

DecoratorDress----ComcreteDecorator1

public class DecoratorDress implements Decorator {
	private Cat cat;

	public DecoratorDress(Cat cat) {
		this.cat = cat;
	}

	public void behavior() {
		cat.behavior();
		add();
	}

	public void add() {
		System.out.print(",dressing");
	}
}

 

DecoratorGlasses-----ComcreteDecorator2

public class DecoratorGlasses implements Decorator {
	private Cat cat;

	DecoratorGlasses(Cat cat) {
		this.cat = cat;
	}

	public void add() {
		System.out.print(",glassing");
	}

	public void behavior() {
		cat.behavior();
		add();
	}
}

 

main函数:

public class TestMain {
        public static void main(String[] args) {
              Cat scat = new SmallCat("xiao hua") ;
              DecoratorDress DressCat = new DecoratorDress(scat);
              DecoratorGlasses GlassesCat = new DecoratorGlasses(dcat) ;
              GlassesCat.behavior();		
	}
}

 

这里造了一个猫,然后,让这个小猫穿上衣服,再让它带上眼镜的。呵呵。。。。

言归正传,看看这个io是一个怎样一回事情,他们是这个关系:

这里有四个东西InputStream,OutputStream,Reader,Writer这个接口就构成了JAVA的IO上层。

四个的结构模式都是一样的,用InputStream来举一个例子:

InputStream----Component

FileInputStream同层之类的数据源等-----ComreteComponent

FilterInputStream过滤器----Decorator

DataInputStream同层之类等----ComreteComponent

这样就构成了。

看一例:昨天写的用JAVA实现的简单聊天,用一个client端的代码.

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client01 {
	public static void main(String[] args) throws Exception {
		DataInputStream dis = null;
		System.out.println("client start..");
		Socket socket = new Socket("127.0.0.1", 8888);
		String str = null;
		while (true) {
			System.out.print("I say:");
			str = new BufferedReader(new InputStreamReader(System.in))
					.readLine();// 读入字符
			if (str.equalsIgnoreCase("88")) {
				break;
			}
			new DataOutputStream(socket.getOutputStream()).writeUTF(str);// 发送数据
			dis = new DataInputStream(socket.getInputStream());// 读入服务器信息
			System.out.println("server say:" + dis.readUTF());// 显示服务器信息
		}
		dis.close();
		socket.close();
	}
}

 这里就会看到很多的流的一个接一个情况。呵呵,写的时候头真的有点而昏。这个还得去配合Server端的。

 

好啦,这个就总结到这里了。

 

 

二 、功能分类看IO

     这个为了记忆,采用了下面这个方法去记忆了,IO流很多内容,但是想用得顺手还得去记得,还得去敲出来,下面这个从另一个角度看看IO,总结出这个树,没有考究过完整性,常用的估计也包括了。

 

|--基础流(从特定的数据源读写数据,目的:建立一个数据源)

        |--File  (文件源)

|--FileReader(FileWriter)

|--FileInputStream(FileInputStream)

|-Memory Array(内存数组源)

|--CharArrayReader(CharArrayWriter)

|--ByteArrayInputStream(ByteArrayOutputStream)

         |--Memory String (字符串源)

                  |--StringReader(StringWriter)

                   |--(对于字符串,字节没有必要有)

         |--Pipe(管道源)

                   |--PipedReader(PipedWrite)

                   |--PipedInputStream(PipedOutputStream)

|--高级流(连接在已经存在的流(节点流或处理流)之上,目的:让程序对数据的处理为程序提供更为强大的读写功能)

         |--Buffering(把数据源读到绶存,用来对数据的缓冲,目的:提高读写效率)

                   |--BufferedReader(BufferedWriter)

                   |--BufferedInputStream(BufferedOutputStream)

         |--Coverting (目的:让数据由字节向字符转换)

                   |--InuputSteamReader(OutputStreamWriter)

                   |--(没有字符流转成字节流的,这个可以用String中的getByte()函数)

         |--Data conversion(对特殊数据字节数处理(数据类型流))

                   |--(数据是与字符平起平坐的,不用经过字符,再去变成数字)

                   |--DataInputStream(DataOutputStream)

         |--Object Serialization

                   |--(解释同数据转换)

                   |--ObjectInputStream(ObjectOutputStream)

|--Printing(实现一个标准的输出,不分数据类型的,没有涉及到输入流的,不会有抛出出的异常)

                   |--PrintWriter()

                   |--PrintStream()

 

 

   好了,这个是我的一点java学习总结,分享交流一下,还存在不足,请各位指教。

 

1
2
分享到:
评论

相关推荐

    java io流 方法

    java io流 流基于流向,数据单位两个指标进行IO包根类构造。站在程序员的角度考虑流向问题,我们编的是程序,程序运行在内存中,进内存输入,出内存为输出。

    Java输入输出流及文件读写详解

    从性能角度来看,字符流往往比字节流更高效,这是因为字符流在内部使用了缓冲机制。 #### 字节流体系结构 在Java中,字节流体系结构包括以下几个核心类: - **InputStream**: 所有字节输入流的父类,提供了基本的...

    Java 全栈知识点问题汇总(4).pdf

    Java全栈知识点问题汇总第四部分主要探讨了Java的IO相关概念,包括IO流的理解、设计模式的应用以及五种IO模型的解析。以下是这些知识点的详细说明: 1. **IO流的理解**: - **字节流与字符流**:字节流处理二进制...

    Java中的输入输出流研究.pdf

    这一组类的跟类有两个:InputStream和OutputStream,分别负责输入和输出。 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件、内存或是网络连接。类似的,当...

    java语言程序设计郑莉PPT课件.pptx

    7. InputStream和OutputStream:InputStream和OutputStream是用来处理8位字节流的抽象基类,程序使用这两个类的子类来读写8位的字节信息。 8. 标准输入输出流对象:标准输入输出流对象是Java语言中的标准输入输出流...

    网络IO的基本概念以及基础原理

    零拷贝是指从操作系统的角度来看,IO操作不需要将数据从一个缓冲区拷贝到另一个缓冲区。这可以提高IO操作的性能。零拷贝是依赖于操作系统的实现的,如果操作系统实现了零拷贝,那么Java程序中可以使用零拷贝。 NIO...

    JAVA期末考试试卷及答案打包

    它包含了两份PDF文件,分别可能是不同的版本或者重复内容,确保了考生可以从多个角度理解和掌握Java知识。 首先,我们来谈谈Java期末考试可能涵盖的知识点。Java的学习通常分为基础语法、面向对象编程、集合框架、...

    Introduction to Programming in Java 英文版

    7. **IO流**:Java的IO流用于读写文件、网络通信等,包括字节流和字符流。书会讲解基本的输入输出操作。 8. **集合框架**:Java集合框架包含各种容器类,如ArrayList、LinkedList、HashSet、HashMap等。这些容器能...

    Java编写的图片上加文字Demo

    在Java中,主要使用`java.awt`和`javax.imageio`这两个包来处理图像和图形。`java.awt`包提供了诸如Graphics2D类,它支持对图像进行复杂的绘制操作,包括添加文本。`javax.imageio`包则用于读取和写入图像文件。 在...

    同步、异步IO

    本文将深入探讨“同步”和“异步”这两种不同的IO处理方式,并结合“源码”和“工具”的角度进行分析,以帮助读者理解这两种方法的工作原理和应用场景。 同步IO和异步IO的主要区别在于如何处理数据传输时的等待时间...

    java实验二2.pdf

    通常Java的文件操作涉及到IO(输入/输出)流,如FileReader,BufferedReader,FileWriter,BufferedWriter等类的使用,虽然这部分内容在提供的文档片段中没有明确显示,但它是Java程序中常用的文件处理技术。...

    java程序设计要点

    以下将从多个角度深入解析Java程序设计的关键要素,包括环境搭建、语法基础、面向对象编程、异常处理、图形用户界面、网络编程以及应用程序与Applet的设计。 #### 1. JDK安装与配置 Java Development Kit (JDK)是...

    java 将图片进行180度旋转

    Java提供了两个图形用户界面(GUI)工具包:AWT(Abstract Window Toolkit)和Swing。它们都包含处理图像的类,如`BufferedImage`和`Graphics2D`。在这个场景下,我们主要会用到`BufferedImage`来存储图片,并使用`...

    JAVA2网络协议内幕

    通过以上知识点的介绍,我们可以看到,Java网络编程不仅仅局限在学习套接字编程和网络协议,还包括了并发处理、IO流的使用以及框架的运用等多个方面。理解这些知识点对于成为一名高级Java程序员是必要的。而对于那些...

    java使用itextpdf、itext-asian对pdf文件加水印

    以下是对这两个库以及如何在Java中实现这一功能的详细解释。 首先,iTextPDF是Java的一个开源库,用于创建、编辑和读取PDF文档。它提供了丰富的API,可以实现PDF文档的各种操作,如添加文本、图像、表格等,以及...

    JAVA语言全书VB版

    从VB的角度学习JAVA语言,重点在于理解和转换两种语言之间的概念差异。VB是基于.NET框架的,而JAVA是跨平台的,它们的语法和内存管理机制有显著区别。例如,JAVA使用垃圾收集器自动管理内存,而VB则依赖于程序员手动...

    用JAVA语言处理AutoCAD图形数据的研究

    为了更具体地展示如何使用JAVA处理AutoCAD DXF文件,下面给出一个简单的示例代码片段: ```java import java.io.BufferedReader; import java.io.FileReader; public class DXFReader { public static void main...

    [计算机项目]基于java的图书馆书库管理系统设计与实现(源代码+项目报告).zip

    首先,从Java技术栈的角度来看,该系统可能采用了Java SE(标准版)作为后端开发基础,利用Java的面向对象特性进行模块化设计,同时可能运用了Java集合框架、多线程、IO流等核心概念。此外,为了实现数据库交互,...

    JAVA核心知识点整理.pdf

    本知识点整理文档从多个角度对Java核心知识点进行了详细的梳理和说明。 首先,文档详细介绍了Java虚拟机(JVM),这是运行Java字节码的虚拟机,也是Java能够实现跨平台特性的关键。文档中提到了JVM内存区域的划分,...

Global site tag (gtag.js) - Google Analytics