首页 > 代码库 > java IO
java IO
1. 流是数据序列的抽象概念。 (文件是数据静态存储形式,而流是指数据传输时的形态。文件是一系列数据组成的集合,而流提供了一种从IO设备写入、读取数据的方式,文件只是流所能操作的设备之一,还有网络流,内存流等)。
2. JAVA中的gc只会回收java对象,并不会将计算机产生的相关资源进行回收,所以仍然需要调用close()方法。
3. 一般在和外设进行输入输出时都会使用内存缓冲区。(但有时后会程序崩溃因为内存缓冲区还没有来的及将内存刷新到文件,并没有还原程序崩溃前的状态)(这两个抽象输入输出流都没有与具体的流设备进行对应,只是将所有流设备共有的行为进行了概括。)
4. 字节流和字符流的区别:
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
1. ByteArrayInputStream与ByteArrayOutputStream类:用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或内存映像文件的功能。
ByteArrayInputStream(byte[] buf);使用字节数组作为数据源,以后程序可以像输入流一样读取字节数据中的数据。通过调用toByteArray可以把内存流中的数据当做字节数组返回。
public class TestByteArray { public static void main(String[] args) throws Exception { //字节输入输出流的限制 InputStream in = new ByteArrayInputStream("hello world".getBytes()); ByteArrayOutputStream out = new ByteArrayOutputStream(); convert(in, out); byte[] buff=out.toByteArray(); System.out.println(new String(buff)); in.close(); out.close(); //2. 从键盘读取,显示到显示屏上 convert(System.in, System.out); } //利用字节输出输出流将接收的数据转化为大写 public static void convert(InputStream in,OutputStream out)throws Exception{ int tmp=-1; while((tmp=in.read())!=-1){ //将tmp转化为大写 char upCh = Character.toUpperCase((char)tmp); out.write(upCh); } }}
重视IO程序代码的复用:(要编写从键盘连续读取一大段数据时,应尽量将读取数据的过程放在函数中完成,使用-1作为键盘输入的结束终点。在该函数中编写的程序代码不应直接使用System.in读取数据,而是一个InputStream类的形式参数对象来读取数据,然后将System.in作为实参传递给InputStream类型的形式参数来调用该函数)
System.in连接到键盘,是InputStream类型的实力对象。System.out连接到显示器,是PrintStream类的实例对象。
不管各种底层物理设备采用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表示输入流的结束。(文件,网络,键盘(Ctrl+D))
2. 字符编码:
计算机里只有数字,计算机软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外。ASCII码的最高位都是0,也就是说这些数字是在0-127之间。中国大陆:两个字节GB2312 —增强版—》GBK,在中国大陆使用的计算机系统上,GBK和GB2312就被称为该系统的本地字符集。在一个国家的本地化系统中出现的一个字符,通过电子邮件传送到另外一个国家的本地化系统中,看到的就不是那个原始的字符,而是另外那个国家的一个字符或乱码。
Unicode编码:ISO将全世界所有的符号进行了统一编码,称之为Unicode编码。Unicode编码的字符都占用两个字节,在全世界范围内所表示的字符个数不会超过2的16次方。在相当长一段时间内本地字符编码将与Unicode编码共存(难以一统天下)Java中的字符使用的都是Unicode编码,Java在通过Unicode保证跨平台特性的前提下,也支持本地平台字符集。 (---涉及到本地字符和Unicode的转化--)
java IO