`
小路青青0113
  • 浏览: 23367 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论
阅读更多
IO体系结构

Java将输入输出抽象为流,与之相关的类都在java.io包中。

流按方向分为输入流InputStream和输出流OutputStream.程序使用输入流对象从数据源读取数据,使用输出流对象向目的地写出数据。

常用的流有:
基础字节流(原始流):
      InputStream,OutputStream(都是抽象类)是java中可以按最小数据单位读取
      的流,即每次读写一个字节,基础流是直接连接到输入源的流。
过滤流(节点流):
      过滤流是用来包装基础流以提供更好的特性,如提供缓冲功能的
      BufferedInputStream和BufferedOutputStream,它并不直接连接到数据源。
基于具体数据类型的流:
      要从流中读取指定数据类型的数据时,用到DataInputStream,DataOutputStream
基于对象读写:
       对象的输入输出流ObjectInput,ObjectOutput.对象流的读取又叫java对象序
       列化技术。

一、
InputStream中的重要方法:
int available() 流中可以读取的有效字节长度(多少个byte)
void close() 流对象使用完后要关闭,就像水龙头,用完要关,否则会占用系统资源
int read() 这个方法调用会返回流中的下一个字节作为一个byte值,如果已经读到末尾
              则返回-1,表示流中数据已经读完。次方法返回虽为int,但读取的是
              一个byte,如果要读取一个int型,那么要用到DataInput对象的
              readInt()方法
int read(byte[] b) 用从流中读到的byte

OutputStream中的重要方法:
void close() 关闭流
void flush() 将输出流有可能还保存在JVM内存中的数据强制输出到目标中
void write(byte[] b) 将byte数组中的内容输出到流中
void write(byte[] b,int off,int len) 将数组中的一部分写到流中
void write(int b) 向流中写入一个byte值!如果要写入一个int型,则要使用
                      DataOutput对象的writeInt()fangfa

读取文件举例:

	/**
	 * 读取文件的方法
	 * @throws IOException 
	 */	
	public String readFile(String path) throws IOException{
		FileInputStream is = new FileInputStream(path);
		
		int length = is.available();
		byte[] array = new byte[length];
		for(int i=0;i<length;i++){
			array[i] = (byte) is.read();
		}
		//把byte类型的数组转换成String类型 
		String str = new String(array);		
		System.out.println("读取文件:"+str);
		is.close();
		return str;
	}


二、
缓冲流是一种过滤流。常用的是BufferedInputStream,BufferedOutputStream

之前的流读写文件是如下过程:
输入文件->操作系统内存->JVM内存->代码变量->JVM内存->操作系统内存->输出文件。
经历这样的一个过程才传输了一个字节,这样就造成了效率低下速度缓慢;
而缓冲流机制是在JVM开辟一定大小的缓冲区(目前8M),当输入缓冲区的数据达到一定值时就一次性输出到文件中。这样很大程度上节省了时间。

使用缓冲流时注意:
缓冲区不满时是不会自动输出到文件中的,需要添加关闭命令,如果文件很大,缓冲区满了则会自动输出并清空缓冲区继续读取!所以为保证完整输出,需要关闭Buffered流。

构造器:
BufferedInputStream(InputStream in)
     使用一个InputStream的输入流对象创建一个默认缓冲区大小(8M)的缓冲输入流对象
BufferedInputStream(InputStream in,int size)指定缓冲区大小

BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out,int size)


/**
 * BufferedInputStream和BufferedOutputStream完成文件的复制
 * @author 客
 *
 */
public class BufferedStream {

	/**
	 * 主方法
	 * @param 
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException{
		BufferedStream bs = new BufferedStream();
		//创建两个路径分别表示被复制文件路径和新文件路径
		String path = "src\\lwq\\java\\File_MyExercise0712\\BufferedStream.java";
		String newPath = "src\\lwq\\java\\File_MyExercise0712\\BufferedStream.java.bak";		
		bs.copyFile(path,newPath);
	}
	/**
	 * 完成复制的方法
	 * @throws IOException 
	 */
	public void copyFile(String path,String newPath) throws IOException{
		FileInputStream is = new FileInputStream(path);
		BufferedInputStream bis = new BufferedInputStream(is);
		
		FileOutputStream os = new FileOutputStream(newPath);
		BufferedOutputStream bos = new BufferedOutputStream(os);
		
		int length = is.available();
		byte[] array = new byte[length];
		
		for(int i=0;i<length;i++){
			array[i] = (byte)bis.read();
		}		
		bos.write(array);
		bos.close();		
	}	
}


三、
串行化又叫做对象序列化,是可以通过流对象保存java对象的一种方法。在java中要事项序列化的对象的类,必须事项java.io.serializable接口,未实现此接口的类将无法使其任何状态序列化或反序列化。序列化接口没有方法或字段,仅用于标识可序列化的语义。

对象类所表示的数据在不断改变,所以他们不会被串行化,如java.io.FileInputStream,
java.io.FileOutputStream和java.lang.Thread等流。

有时候为了保密需要,类不允许自己对象的某个属性被序列化,则可以再属性前加transient关键字,那么该属性在对象的保存时不会生效,读取时也不会得到数据。

对象读写,一般使用java.io.ObjectInputStream类的void writeObject(Object o)方法向流中写入一个对象和java.io.ObjectOutputStream类的Object readObject()读取一个对象。

四、
DataInputStream和DataOutputStream主要用来读写指定的数据类型。


五、画图板文件的保存打开
电脑中存储的不同信息有不同的存储格式。每一种文件格式通常有一种或多种扩展名,但也可以没有扩展名,扩展名对文件本身不会有影响,只是标示打开的优先方式。。

文件由两部分组成:
1、文件头信息:包括存储类型等文件的整体信息;
2、文件内容:具体的。

以画图板为例,头部信息包括图片的存储类型,图片的宽和高,起始位置;
              文件内容记录每一个像素点的颜色值。

在文件保存时首先要对画板图片部分进行截屏操作,并保存图片头信息和内容
/**
 * 截取画板上图片的类
 * @author 客
 *
 */
public class ScreenCapture {

	public int[][] createScreenCapture(JPanel drawPanel) throws AWTException{
		//得到画图面板的高度
		int height = drawPanel.getHeight();
		//得到画图面板的宽度
		int width = drawPanel.getWidth();
		System.out.println("height="+height+"      width="+width);
		
		//获取画图面板在屏幕的位置
		Point point = drawPanel.getLocationOnScreen();
		System.out.println("x="+point.getX()+"  y="+point.getY());
		
		//实例化一个矩形对象
		Rectangle rect = new Rectangle((int)point.getX(),(int)point.getY(),width,height);
		
		//实例化一个机器人类的对象
		Robot robot = new Robot();
		
		//开始截取屏幕上的图片
		BufferedImage image = robot.createScreenCapture(rect);
		
		//实例化一个二维数组对象,用来存储图片每个像素点的值
		int[][] array = new int[width][height];
		
		//遍历图片,将每个像素点的颜色取出,存入到数组中
		for(int i=0;i<array.length;i++){
			for(int j=0;j<array[i].length;j++){
				array[i][j] = image.getRGB(i, j);
			}
		}		
		return array;
	}	
}


在点击保存和打开时,对于截屏时的内容进行写入文件和读取操作。
/**
 * 画图程序的保存和打开操作
 * @author 客
 *
 */
public class OpenSave {

	/**
	 * 文件保存的方法
	 * @param path,传入的保存路径
	 * @param array,将图片内容保存到数组中
	 * @return
	 */
	public boolean save(String path,int[][] array){
		boolean b = false;	
		try {
			FileOutputStream os = new FileOutputStream(path);
			BufferedOutputStream bos = new BufferedOutputStream(os);
			DataOutputStream dos = new DataOutputStream(bos);
			
			/**
			 * 文件的格式:1、文件头:文件类型,图片宽度,图片高度
			 * 		   2、文件内容:每个像素点的颜色值
			 */
			//图片宽度
			dos.writeInt(array.length);
			//图片高度
			dos.writeInt(array[0].length);
			//写文件内容
			for(int i=0;i<array.length;i++){
				for(int j=0;j<array[i].length;j++){
					dos.writeInt(array[i][j]);
				}
			}
			b = true;
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}			
		return b;		
	}
	
	/**
	 * 打开文件的方法
	 * @param path
	 * @return
	 */
	public int[][] open(String path){
		int[][] array = null;		
		try {
			FileInputStream is = new FileInputStream(path);
			BufferedInputStream bis = new BufferedInputStream(is);
			DataInputStream dis = new DataInputStream(bis);
			
			//读图片的宽度,高度
			int width = dis.readInt();
			int height = dis.readInt();
			System.out.println("width="+width+"     height="+height);
			
			array = new int[width][height];			
			//写文件内容
			for(int i=0;i<array.length;i++){
				for(int j=0;j<array[i].length;j++){
					array[i][j] = dis.readInt();
				}
			}			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return array;		
	}	
}




如有不足欢迎指正!



分享到:
评论

相关推荐

    MySQL体系结构及原理(innodb)图文完美解析

    ### MySQL体系结构及原理(innodb)图文完美解析 #### 宏观认识 在深入探讨MySQL的体系结构及其核心组件InnoDB之前,我们先来理解几个基础概念。 1. **MySQL简介** MySQL是一种开源的关系型数据库管理系统(RDBMS)...

    javaIO实例

    Java IO体系结构主要分为字符流和字节流两大类。字符流处理的是Unicode字符,适合处理文本数据,包括InputStreamReader、OutputStreamWriter、Reader和Writer等类。字节流处理的是原始字节,适用于所有类型的数据,...

    java基础之IO流

    Java的IO流体系结构是Java开发中非常重要的组成部分,它不仅涵盖了基本的输入输出操作,还提供了高级的并发处理机制。无论是初学者还是经验丰富的开发者,掌握这些基础知识都将极大地提高编写高效、健壮的Java程序的...

    JAVA IO流技术

    理解并熟练运用Java IO流技术是开发Java应用程序的关键,它能够有效地处理数据的读写操作,无论是简单的文本文件还是复杂的网络通信。在实际编程中,根据需求选择适当的流类型,结合处理流进行优化,可以构建出高效...

    java IO 类层次图

    本文将通过分析一张清晰明了的Java IO类层次图,详细介绍Java IO体系中的主要类及其关系。 #### 二、Java IO 类层次结构详解 ##### 2.1 字节流类层次结构 Java IO中的字节流类主要分为两大类:`InputStream`和`...

    程序框架及简单IO.rar_motorola_单片机框架

    在编写任何程序之前,了解单片机的体系结构至关重要。Motorola单片机通常采用C或汇编语言进行编程。一个典型的程序框架包括初始化阶段、主循环和中断服务函数。 1. 初始化阶段:这是程序运行的第一步,主要用于设置...

    java电话本IO版本

    首先,我们要理解Java IO体系结构,它基于“流”的概念,分为字节流和字符流两大类,又分为输入流和输出流。字节流处理8位的字节数据,如FileInputStream和FileOutputStream;字符流处理16位的Unicode字符,如 ...

    lumenworks.framework.io.dll .net读写CSV

    x32和x64分别代表32位和64位版本的库文件,这表明该库兼容两种体系结构的.NET应用程序。 总之,LumenWorks.Framework.IO.dll是一个强大的.NET库,专注于CSV文件的读写,简化了开发过程,并提供了对各种复杂情况的...

    一种RapidIO和FC的互联通信技术.pdf

    RapidIO是一种基于报文交换的互连体系结构,具有高带宽、低延时、高效率、高可靠性等优点,能够为高性能嵌入式系统计算节点之间通信提供良好的解决方案。FC是一种高带宽、低延迟、扩展性好、传输可靠性高、协议丰富...

    彻底明白java的io系统

    通过实例学习,你可以创建简单的文件读写程序,逐步了解流的层次结构,掌握如何处理异常,以及如何使用缓冲和转换流来优化性能。此外,还可以通过练习网络编程,了解Socket通信中的IO应用。 总的来说,Java的IO系统...

    ChatApp:一个基于客户端的简单聊天应用程序-使用socket.io,Node,Express和许多其他东西的服务器体系结构

    聊天应用一个基于客户端的简单聊天应用程序-使用socket.io,Node,Express和许多其他东西的服务器体系结构。 用户可以加入不同的房间并彼此聊天。 它具有响应式设计和自动滚动功能,使其看上去更加整洁。

    IO卡的源代码

    【标题】"IO卡的源代码"涉及到的是与硬件交互的...理解并分析这样的源代码需要对计算机体系结构、C++编程和硬件接口有深入的了解。通过学习和研究,我们可以更好地理解和定制这类I/O卡驱动程序,以满足特定的应用需求。

    车乐美机器人JS系列IO说明.pdf

    描述中提到的“入门教材,适合广泛应用,对于初学者可以进行体系建立,了解当前时代更新知识”说明了本文件面向的是机器人领域的初学者,旨在帮助他们建立知识体系,了解最新的技术和理论。它强调了文档的应用广泛性...

    Java程序设计及应用开发教程

    8. **IO与NIO**:了解Java的IO流体系,对比传统的IO和非阻塞IO(NIO)的区别和使用场景。 9. **网络编程**:通过Socket编程实现客户端和服务器之间的通信,理解TCP和UDP协议的区别。 10. **数据库连接**:学习JDBC...

    javaIO详细讲解+详细案例

    #### 一、Java IO 流概念及作用 Java IO(Input/Output)流是Java编程语言中的一个重要组成部分,主要用于处理数据的输入与输出。流(Stream)可以理解为一组有序的、有起点和终点的字节集合,它是数据传输的一种...

    Java中IO解读与使用实例-动力节点共17页.pdf

    一、Java IO体系结构 Java的IO体系主要由流(Stream)、缓冲区(Buffer)和转换(Converter)组成。流是数据传输的通道,分为字节流和字符流两大类。字节流处理单个字节的数据,如InputStream和OutputStream;字符流...

    高性能网络应用框架 Netty.zip

    Netty是一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络...体系结构图在线Javadoc:http://netty.io/wiki/all-documents.html  标签:Netty

    基于FPGA实现DSP与RapidIO网络互联

     随着通讯系统的数据处理量日益增大,过去总线形式的体系结构逐渐成为约束处理能力进一步提升的瓶颈。本文首先简单介绍了嵌入式设计中总线结构的演化过程,从而引出新一代点对点串行交换结构RapidIO。  在密集型...

Global site tag (gtag.js) - Google Analytics