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

IO阶段小结

    博客分类:
  • j2se
阅读更多
IO:
	字节流:
		针对的字节数据,包括文本也包括媒体数据,如果是纯文本用字符流处理较为便捷。
		字节流所使用的缓冲区是一个byte[]。
	常用的对象:
		FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream。
	需求:
		copyMp3

		public void copyMp3()
		{
			FileInputStream fis = new FileInputStream("1.mp3");
			BufferedInputStream bufis = new BufferedInputStream(fis);

			FileOutputStream fos = new FileOutputStream("2.mp3");
			BufferedOutputStream bufos = new BufferedOutputStream(fos);

			int by = 0;

			while((by=bufis.read())!=-1)
			{
				bufos.write(by);
				bufos.flush();
			}
			
			bufos.close();
			bufis.close();

		}
		
	模拟BufferedInputStream。原理:其实将一个字节数组进行封装,通过方法将一批数据存入数组中,在通过数组的指针每一次返回数组中一个字节。当数组元素全部取出后,在存入一批新的数据,重复此过程。

	class MyBufferedInputStream
	{
		private InputStream in;
		private byte[] arr = new byte[1024*4];
		private int pos = 0,count = 0;
		MyBufferedInputStream(InputStream in)
		{
			this.in = in ;
		}

		public int myRead()throws IOException
		{
			if(count==0)
			{
				count = in.read(arr);
				if(count<0)
					return -1;
				pos = 0;
				byte b = arr[pos];
				pos++;
				count--;
				return b;//return b&255;
			}
			else if(count>0)
			{
				byte b = arr[pos];
				pos++;
				count--;
				return b;//return b&0xff;
			}
			return -1;
		}
		public void myClose()throws IOException
		{
			in.close();
		}
	}

	当使用自定义的缓冲区时,居然出现的秒杀的情况,为什么会如此呢?
	因为mp3数据最终的二进制表现形式中,很容易出现连续N多1的情况,
	只要出现了连续的8个1,对于一个字节而言十进制体现形式就是-1。
	那么就满足while循环结束条件。程序终止。
	为了避免这种情况,在读到一个字节时,将该字节进行了提升变成int型。
	但是byte-1,变成int 还是-1。为了避免,在进行提升的过程中,保留的源字节的8为数据,并在前以补零方式进行提升。

	这样一个byte -1 变成了int 的255。这就避免了-1的情况。
	如何补的零呢?只要将读到的字节&255或者&0xFF.都可以。这也是read方法不是返回byte而返回int类型的原因。

	通过该过程就可以明确,read方法在对字节或者字符进行提升,而write方法在对提升后的int数据进行强转,
	只写出了最低的8位,或者最低的16位。

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

字符流:
四个:

字节流:
四个。

为了实现字符和字节流之间的转换,出现了转换流。

转换流的由来,
当读到的字节数据都是纯文本的时候,而且文本中出现中文字符,那么在解析该字节数据时就需要指定编码表。
因为可以识别中的编码表不唯一。在使用转换流时,如果未指定编码表,那么默认使用本地码表。

InputStramReader:字节通向字符的桥梁
OutputStreamWriter:字符通向字节的桥梁



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

流操作的基本规律:
1,明确数据源和数据目的。
	明确到底是使用输入流还是输出流。
2,明确要处理的数据是否是纯文本。
	明确到底是使用字符流还是字节流。
当明确体系后,到底该用该体系的哪个对象呢?
根据数据存在的设备而定,
数据源所在设备可以是,硬盘,键盘,内存。
数据目的所在设备可以是,硬盘,控制台,内存。

需求:
获取键盘录入,将录入信息存储到本地文件中。

	源:键盘录入,输入流。
	处理的数据:纯文本,字符输入流。Reader
	该用哪个对象呢?
	键盘录入System.in完成的。那么它是一个标准的字节输入流。InputStream。

	为了操作文本数据方便,将字节流转换成字符流。使用InputStreamReader。
	但是为了提高对字符操作的效率,BufferedReader.

	BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(System.in));

	目的:本地文件(硬盘)输出流。
	处理的数据:纯文本,字符输出流。Writer。
	该用该体系的哪个对象呢?
		可以操作的文件FileWriter对象。
		为了提高写入流的效率。BufferedWriter.
		
	
	public void show()
	{
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bufw = 
			new BufferedWriter(new FileWriter("a.txt"));

		String line = null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
			break;
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		bufw.close();
		bufr.close();

	}
	/*
	如果基本上面的分析,但不使用缓冲区,代码是一个什么样子呢?
	*/
	public static void show()throws IOException
	{
		InputStreamReader isr = new InputStreamReader(System.in);

		FileWriter fw = new FileWriter("a.txt");

		char[] arr = new char[1024];

		int len = 0;

		while((len=isr.read(arr))!=-1)
		{
			System.out.println(len);
			String s = new String(arr,0,len-2);
			if("over".equals(s))
				break;
			fw.write(arr,0,len);
			fw.flush();
		}
		fw.close();
		isr.close();
	}


获取本地文本数据,将数据息存储到本地另一个文件中,按照UTF-8的编码形式。

源:硬盘,输入流。
数据:纯文本,字符输入流,Read。
该用哪个对象呢?
因为是文件FileReader为了提高效率BufferedReader.

目的:本地文件(硬盘)输出流。
	处理的数据:纯文本,字符输出流。Writer。
	该用该体系的哪个对象呢?
		可以操作的文件的对象,但是因为要将字符数据进行编码在进行存储,就需要使用字符向字节过滤的桥梁。OutputStreamWriter.
		就要使用转换流。而转换流要接收的对象都是字节流对象。所以要使用的可以操作的File的FileOutputStream。
		为了提高写入流的效率。BufferedWriter.

	public void show()
	{
		BufferedReader bufr = new BufferedReader(new FileReader("a.txt));

		BufferedWriter bufw = 
			new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8"));
	}


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

异常日志。
printStackTrace(PrintStream );

try
{
	int[] arr = new int[2];
	System.out.println(arr[3]);
}
catch(Exception e)
{
	Date d = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	String time = sdf.format(d);
	
	try 
	{
		PrintStream out = new PrintStream("exception.log");
		e.printStackTrace(out);

		out.close();
	}
	catch(IOException e)
	{
		throw new RuntimeException("日志建立失败");
	}
	
}


 

分享到:
评论

相关推荐

    JAVA IO同步,异步

    在Linux 环境下,默认情况下所有的Socket 都是阻塞的,一个典型的读操作流程大概是这样:当用户进程调用了recvfrom 这个系统调用,kernel 就开始了IO 的第一个阶段:准备数据。对于 network io 来说,很多时候数据在...

    android io.socket.client.zip

    虽然这两个库在运行时可能不是必需的,但在开发和测试阶段对确保 `socket.io-client` 功能的正确性至关重要。 总结起来,`android io.socket.client.zip` 包含的这些组件共同构成了Android平台上使用 `socket.io` ...

    Linux内核访问外设IO资源的方式.pdf

    这里,`s3c2410_map_io`函数会在系统初始化阶段被调用,将`s3c2410_io_desc`数组中的映射信息注册到内核中。`IIS_BASE_VIRT`代表的是IIS寄存器映射后的虚拟地址。 #### 五、总结 通过上述介绍,可以看出Linux内核...

    IO类问题排查总结 (1)1

    本文主要介绍了如何通过读写寄存器来诊断和解决IO问题,主要聚焦于kernel阶段和Uboot阶段的排查方法。 1.1 kernel阶段使用io命令确认寄存器方法: 在kernel阶段,如果遇到IO引脚配置正确但实际信号异常的情况,可能...

    ABB机器人新款控制柜DSQC1030 IO板卡介绍.docx

    新款控制柜DSQC1030 IO板卡作为新一代产品,相比之前常用的DSQC652板卡,在多个方面进行了升级,提高了系统的集成度和扩展性。 ##### 2. 技术特点 - **通信协议**:DSQC1030使用的是EthernetIP协议,这使得它能够...

    IO流程解析与基本原理

    IO请求的处理主要包括以下几个阶段: 1. **请求提交**: 文件系统层通过`submit_bio`函数提交读写请求,并将相应的读写标志添加到`bio`结构中。 2. **请求合法性检查**: 检查`bio`的合法性,确保每个`bio`都包含正确...

    AVR单片机IO口、定时器和按键编程总结

    ### AVR单片机IO口、定时器和按键编程总结 #### 一、定时器2的溢出中断控制灯的闪烁 在本节中,我们主要讨论如何利用AVR单片机中的定时器2来实现LED灯的闪烁。定时器2是AVR单片机中的一个16位定时/计数器,它可以...

    linux下IO口驱动(2)

    总结来说,Linux下的IO口驱动涉及到内核驱动编写、GPIO框架、中断处理等多个方面。通过理解这些概念和技术,开发者可以灵活地控制硬件IO口,实现各种应用场景的需求。在实际操作中,还需结合具体的硬件平台和Linux...

    Java IO复用_动力节点Java学院整理

    总结来说,Java IO复用是提升服务器高并发处理能力的关键技术,通过epoll等高效的IO复用机制,服务器可以更有效地管理大量并发连接,优化资源利用率,从而提高整体的服务质量和吞吐量。在实际开发中,理解并熟练应用...

    javaIO模型1

    总结起来,Java IO模型1涵盖了同步与异步、阻塞与非阻塞的基本概念,以及五种不同的IO处理方式,每种都有其适用场景和优缺点,开发者需要根据具体需求选择合适的IO模型。对于高并发、高效率的网络应用,通常会选择非...

    PCI9054实现IO读写操作 PCI9054实现IO读写操作 PCI9054实现IO读写操作

    PCI9054是一款常用的PCI...总结,PCI9054的I/O读写操作涉及到硬件配置、总线事务、中断处理和软件编程等多个方面。理解和掌握这一过程对于开发涉及PCI设备的应用至关重要,能够帮助开发者有效地控制和优化系统性能。

    杭州盈控 H800 IO硬件安装选型手册.zip

    《杭州盈控 H800 IO硬件安装选型手册》是一款专为工业自动化领域设计的指导性文献,旨在帮助用户正确地选择、安装和配置杭州盈控的H800系列IO(输入/输出)硬件。该手册包含了丰富的技术信息和实用的操作指南,确保...

    C+LINUX+DS+IO

    总结以上知识点,C语言和Linux操作系统是计算机科学与工程领域的基石。掌握它们,对于任何一个想要在IT行业中取得成功的技术人员来说,都是必不可少的基本技能。同时,对数据结构和I/O操作的深入理解和熟练运用,将...

    电子-如何使用普通IO口驱动LCD.pdf

    总结以上信息,使用普通IO口驱动LCD需要我们对LCD的基本工作原理有深入的理解,包括液晶的物理性质以及如何通过改变电压来控制其显示状态。此外,采用多路复用技术以及对I/O口电平的精细控制是实现LCD显示的关键。...

    MSDOS.SYS\COMMAND.SOM\IO.SYS

    总结来说,MSDOS.SYS、COMMAND.SOM和IO.SYS是MS-DOS操作系统的核心组件,它们共同构成了DOS启动和交互的基础。尽管随着时间的推移,Windows系统逐渐转向更先进的NT内核,但这些DOS时代遗留下来的文件在Windows XP中...

    linux内核访问外设IO内存方法

    这个函数主要用在设备初始化阶段,根据设备的物理地址(bus address)返回一个可安全使用的内核虚拟地址(kernel virtual address)。 ioremap的工作原理: 1. ioremap首先检查是否有已存在的映射,如果存在,则...

    实验1 IO口读写实验1

    实验1 IO口读写实验1主要关注的是计算机硬件与外部设备之间的交互,特别是通过I/O端口进行数据的读取和写入。在这个实验中,我们重点学习和掌握两个重要的集成电路:74HC245和74HC373,并使用Proteus软件进行流程图...

    确认MCU的IO口在RESET时的状态

    MCU的IO口在系统初始化时,包括重置阶段,其电平状态可能会对整个系统的功能产生直接影响。这通常涉及到IO口的上拉、下拉电阻配置以及模式设置。 在描述的问题中,MCU的一个输出IO口在重置时呈现微上拉状态。这意味...

Global site tag (gtag.js) - Google Analytics