IO输入输出
2011年04月26日
io输入与输出
一File类
File类是Io包中唯一代表磁盘文件本身信息的类,而不是文件中的内容,File类定义了一些与平台无关的方法来操纵文件,例如,创建、删除文件和重命名文件等等
Java中的目录被当做一种特殊的文件使用,list方法可以返回目录中的所有字目录和文件名
二、RandomAccessFile类
RandomAccessFile类提供了众多的文件访问方法,支持随机访问方式。随机方法就是可以访问文件中任意位置的数据。在随机(相对顺序而言)读写等长记录格式的文件时有很大的优势等成的意识就是文件每一行的长度一样
两种构造方法:
new RandomAccessFile(f,"rw");//以读写方式打开文件
new RandomAccessFile(f,"r");//以只读方式打开文件
三、节点流
1.理解流的概率
流是字节序列的抽象概念,文件是数据的静态存储形式,而流失指数据传输时的形态。流分为两个大类:节点流类和过滤流类(也叫处理流类)。
2.InputStream类
程序可以从中连续读取字节的对象叫做输入流,在java中,用InputStream类来描述所有输入流的抽象概念类中的方法
int read()
如果已经到达末尾流而没有可用的字节,则返回值-1,在输入数据可用检测到流末尾或者抛出异常前,此方法一直堵塞
read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
int read(byte[] b,int off,int len)将输入流中最多len个数据字节读入byte数组
long skip(long n)跳过河丢弃此输入流中数据的n个字节
int available(返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程
void mark(int readlimit)在此输入流中标记当前的位置
void吗reset()将此流重新定位到最后一次对此输入流调用mark方法时的位置。
boolean markSupported()测试此输入流是否支持mark和reset方法
void close()关闭输入流释放空间
3.OutputStream类
类的方法:
void write(int b) 将指定的字节写入此输出流。
void flush()刷新此输出流并强制写出所有缓冲的输出字节
void write(byte[] b)将b.length个字节从指定的byte数组写入此输出流
void write(byte[] b,int off,int len)将指定byte数组中从偏移量off开始的len个字节写入此输出流
void close()关闭此输出流并释放与此流有关的所有系统资源
4.FileInputStream与FileOutputStream类
FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象通过它们的构造函数来指定文件路径和文件名
创建FileInputStream实例对象时,指定的文件应当是存在和可读的。创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中的原来内容将被覆盖清除。对同一个磁盘文件创建FileInputStream对象的两种方式:
(1)FileInputStream inOne=new FileInputStream("hello.txt");
(2)File f=new File("hello.txt");
FileInputStream inTwo=new FileInputStream(f);
创建FileOutputStream实例对象时,可以指定还不存在的文件名,不能指定一个已被其他程序打开了的文件
5.Reader与Writer类
Reader和Writer是所有字符流类的抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据
6.PipedInputStream与PipedOutputStream类
PipedInputStream类与PipedOutputStream类用于在应用程序中的创建管道通信
7.ByteArrayInputStream与ByteArrayOutputStream类
ByteArrayInputStream和ByteArrayInputStream,用于以io流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能
ByteArrayInputStream的两个构造函数:
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf,int offset,int length)
ByteArrayOutputStream的两个构造函数
ByteArrayOutputStream()
ByteArrayOutputStream(int)
StringReader类和StringWrite类来以字符Io流的方式处理字符串。
8.重视io程序代码的复用
System.in链接到键盘,是InputStream类型的实例对象。System.out链接到显示器,是PrintStream类的实例对象。
不管各种底层物理设备用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表示输入流的结束。
技巧:要 编程从键盘上连续读取一大段数据时,应尽量将读取数据的过程放在函数中完成,使用-1来作为键盘输入的结束点。在该函数中编写的程序代码不应该直接使用System.in读取数据,而是用一个InputStream类型的形式参数对象来读取数据,然后将System.in作为实参传递给InputStream类型的形式参数来调用该函数。
四、字符编码
计算机里面只有数字,惊声尖叫软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外
字符a对应数字97,字符b对应字符98等,这种字符与数字对应的编码规则被称为ASCII(美国标准信息交换码)。ASCII的最高bit位都为0,也就是说这些数字都在0到127之间
1.Unicode编码
IOS(国际标准化组织)将全世界所有的符号进行了统一编码,称之为Unicode编码。“中”这个符号,在全世界的任何角落始终对应的都是一个十六进制的数字4e2d。如果所有的计算机系统都是用Unicode编码,在中国大陆的本地化系统中显示的“中”这个符号,发送到伊拉克的本地化系统中,显示的仍然是“中”这个符号。Unicode编码的字符串都占用两个字节,对于ASCII码所表示的字符,只是简单的在ASCII码原来占用的一个字节前面,增加一个所有bits为0的字节。Unicode只占用两个字节,在全世界范围内所有表示的字符个数不会超过2的16次方(65536),实际上,Unicode编码中还保留了两千多个数值没有用于字符编码。
在相当长的一段时期内,本地化字符编码将与Unicode编码空共存。java中的字符是用的都是Unicode编码,java在通过Unicode保证跨平台特性的前提下也支持本地平台字符集。
2.UTF-8编码
ASCII码字符保持原样,仍然只占用一个字节,对于其它国家的字符,UTF-8使用两个或三个字节来表示。使用UTF-8编码的文件,通常都要用EF BB BF作为文件开头的三个字节数据。
UTF-8的优点:
不出现内容为0X00字节便于应用程序检测数据在传输工程中是否发生了错误直接处理使用ASCII码的英文文档
UTF-8的缺点。某些字符需要使用三个字节
3.UTF-16编码
UTF-16编码在Unicode基础上进行了一些细节上的扩充,增加了对Unicode编码没有包括的那些字符的表示方式。UTF-16对Unicode的扩充并没有影响到Unicode编码所有包括的那些字符,只是增加了对Unicode编码没有包括的那些字符的表示方式,一个使用Unicode编码的字符就是UTf-16格式的。Unicode编码将0XD800-0XDFFF区间的数值保留出来,UTF-16扩充的字符,占用四个字节,前面两个字节的数值为0XD800-0XD8FF之间,后面两个字节的数值为0XDC00-0XDFFF之间。在不同体系结构的计算机系统中,UTF-16编码的Unicode字符在内存中的字节存储顺序是不同的。对于0X1234这样的双字节数据,使用Little-Endiam和Big-Endian两种方式来在内存中
存储的格式。
如果文件已0XFE 0XFF这两个字节开头,则表明文本的其余部分是Big Endian的 UTF-16编码;如果文件以0XFF 0XFE这两个字节开头,则声明文本的其余部。分是Little-Endiam的UTF-16编码。
四、过滤流与包装类
1.包装类的概念与作用
通过FileOutputStream对象将一个浮点小数写入到文件中,感觉有点困难,能否通过FileOutStream对象或字节将一个整数写入到文件呢?
需要先将浮点小数转成字节数组,然后通过字节数组写入到输出流。
假如有个DataOutputStrem类提供了往各种输出流对象中写入各种类型的数据(当然包括浮点小数)的方法。你现在所要的工作就是:传递一个FileOutputStream输出流对象给DataOutputStream实例对象和调用DataOutputStream实例对象的用于写入浮点小数的方法。
DataOutputStream并没有对应到任何具体的流设备,一定要给它传递一个对应具体流设备的输出流对象,完成类似DataOutputStream功能的类就是一个包装类,也叫过滤流类或处理流类。
DataOutputStream包装类的构造函数语法publicDataOutStream(OutputStream out)
2.BufferedInputStream与BufferedOuputStream类
缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:
-允许java程序一次不只操作一个字节,这样提高程序的性能。
-由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为可能。
BufferedInputStream和BufferedOutputStream是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。想想这种缓冲区与底层系统提供的缓冲区的区别。
BufferedInputStream的两个构造函数:
-BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,即输入流In,一边将来使用
-BufferedInputStream(InputStream in,ing size) 创建具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in以便将来使用。BufferedOutputStream类的两个构造函数
-BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
-BufferedOutputStream(OutputStream out,ing size)创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
??BufferedRead和BufferedWriter类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的
newLine方法可以向字符流中写入不同操作系统下的换行符。
3.DataInputStream与DataOutputStream类
DataOutputStream类提供了三个写入字符串的方法:
-public final void writeBytes(String s)
-public final void writeChars(String s)
-public final void writeUTF(String str)
??为什么DataInputStream类中有一个readUTF方法,而没有“readBytes”和
“readChars”方法呢?
4.PrintStream类
PrintStream类提供了一系列的print和println方法,可以将基本数据类型的数据格式化成字符串输出。
PrintStream的3个构造函数:
-PrintStream(OutputStream out)
-PrintStream(OutputStream out,boolean autoflush)
-PrintStream(OutputStream out,boolean autoflush ,String encoding)
与PrintStream对应的PrintWriter类,即使遇到了文本换行标识符(\n),PrintWriter类也不会自动清空缓冲区。只有当遇到println方法或者设置清空时才清空??PrintWriter的println方法能根据操作系统的不同而生成相应的文本执行标识符。
2011年04月26日
io输入与输出
一File类
File类是Io包中唯一代表磁盘文件本身信息的类,而不是文件中的内容,File类定义了一些与平台无关的方法来操纵文件,例如,创建、删除文件和重命名文件等等
Java中的目录被当做一种特殊的文件使用,list方法可以返回目录中的所有字目录和文件名
二、RandomAccessFile类
RandomAccessFile类提供了众多的文件访问方法,支持随机访问方式。随机方法就是可以访问文件中任意位置的数据。在随机(相对顺序而言)读写等长记录格式的文件时有很大的优势等成的意识就是文件每一行的长度一样
两种构造方法:
new RandomAccessFile(f,"rw");//以读写方式打开文件
new RandomAccessFile(f,"r");//以只读方式打开文件
三、节点流
1.理解流的概率
流是字节序列的抽象概念,文件是数据的静态存储形式,而流失指数据传输时的形态。流分为两个大类:节点流类和过滤流类(也叫处理流类)。
2.InputStream类
程序可以从中连续读取字节的对象叫做输入流,在java中,用InputStream类来描述所有输入流的抽象概念类中的方法
int read()
如果已经到达末尾流而没有可用的字节,则返回值-1,在输入数据可用检测到流末尾或者抛出异常前,此方法一直堵塞
read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
int read(byte[] b,int off,int len)将输入流中最多len个数据字节读入byte数组
long skip(long n)跳过河丢弃此输入流中数据的n个字节
int available(返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程
void mark(int readlimit)在此输入流中标记当前的位置
void吗reset()将此流重新定位到最后一次对此输入流调用mark方法时的位置。
boolean markSupported()测试此输入流是否支持mark和reset方法
void close()关闭输入流释放空间
3.OutputStream类
类的方法:
void write(int b) 将指定的字节写入此输出流。
void flush()刷新此输出流并强制写出所有缓冲的输出字节
void write(byte[] b)将b.length个字节从指定的byte数组写入此输出流
void write(byte[] b,int off,int len)将指定byte数组中从偏移量off开始的len个字节写入此输出流
void close()关闭此输出流并释放与此流有关的所有系统资源
4.FileInputStream与FileOutputStream类
FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象通过它们的构造函数来指定文件路径和文件名
创建FileInputStream实例对象时,指定的文件应当是存在和可读的。创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中的原来内容将被覆盖清除。对同一个磁盘文件创建FileInputStream对象的两种方式:
(1)FileInputStream inOne=new FileInputStream("hello.txt");
(2)File f=new File("hello.txt");
FileInputStream inTwo=new FileInputStream(f);
创建FileOutputStream实例对象时,可以指定还不存在的文件名,不能指定一个已被其他程序打开了的文件
5.Reader与Writer类
Reader和Writer是所有字符流类的抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据
6.PipedInputStream与PipedOutputStream类
PipedInputStream类与PipedOutputStream类用于在应用程序中的创建管道通信
7.ByteArrayInputStream与ByteArrayOutputStream类
ByteArrayInputStream和ByteArrayInputStream,用于以io流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能
ByteArrayInputStream的两个构造函数:
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf,int offset,int length)
ByteArrayOutputStream的两个构造函数
ByteArrayOutputStream()
ByteArrayOutputStream(int)
StringReader类和StringWrite类来以字符Io流的方式处理字符串。
8.重视io程序代码的复用
System.in链接到键盘,是InputStream类型的实例对象。System.out链接到显示器,是PrintStream类的实例对象。
不管各种底层物理设备用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表示输入流的结束。
技巧:要 编程从键盘上连续读取一大段数据时,应尽量将读取数据的过程放在函数中完成,使用-1来作为键盘输入的结束点。在该函数中编写的程序代码不应该直接使用System.in读取数据,而是用一个InputStream类型的形式参数对象来读取数据,然后将System.in作为实参传递给InputStream类型的形式参数来调用该函数。
四、字符编码
计算机里面只有数字,惊声尖叫软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外
字符a对应数字97,字符b对应字符98等,这种字符与数字对应的编码规则被称为ASCII(美国标准信息交换码)。ASCII的最高bit位都为0,也就是说这些数字都在0到127之间
1.Unicode编码
IOS(国际标准化组织)将全世界所有的符号进行了统一编码,称之为Unicode编码。“中”这个符号,在全世界的任何角落始终对应的都是一个十六进制的数字4e2d。如果所有的计算机系统都是用Unicode编码,在中国大陆的本地化系统中显示的“中”这个符号,发送到伊拉克的本地化系统中,显示的仍然是“中”这个符号。Unicode编码的字符串都占用两个字节,对于ASCII码所表示的字符,只是简单的在ASCII码原来占用的一个字节前面,增加一个所有bits为0的字节。Unicode只占用两个字节,在全世界范围内所有表示的字符个数不会超过2的16次方(65536),实际上,Unicode编码中还保留了两千多个数值没有用于字符编码。
在相当长的一段时期内,本地化字符编码将与Unicode编码空共存。java中的字符是用的都是Unicode编码,java在通过Unicode保证跨平台特性的前提下也支持本地平台字符集。
2.UTF-8编码
ASCII码字符保持原样,仍然只占用一个字节,对于其它国家的字符,UTF-8使用两个或三个字节来表示。使用UTF-8编码的文件,通常都要用EF BB BF作为文件开头的三个字节数据。
UTF-8的优点:
不出现内容为0X00字节便于应用程序检测数据在传输工程中是否发生了错误直接处理使用ASCII码的英文文档
UTF-8的缺点。某些字符需要使用三个字节
3.UTF-16编码
UTF-16编码在Unicode基础上进行了一些细节上的扩充,增加了对Unicode编码没有包括的那些字符的表示方式。UTF-16对Unicode的扩充并没有影响到Unicode编码所有包括的那些字符,只是增加了对Unicode编码没有包括的那些字符的表示方式,一个使用Unicode编码的字符就是UTf-16格式的。Unicode编码将0XD800-0XDFFF区间的数值保留出来,UTF-16扩充的字符,占用四个字节,前面两个字节的数值为0XD800-0XD8FF之间,后面两个字节的数值为0XDC00-0XDFFF之间。在不同体系结构的计算机系统中,UTF-16编码的Unicode字符在内存中的字节存储顺序是不同的。对于0X1234这样的双字节数据,使用Little-Endiam和Big-Endian两种方式来在内存中
存储的格式。
如果文件已0XFE 0XFF这两个字节开头,则表明文本的其余部分是Big Endian的 UTF-16编码;如果文件以0XFF 0XFE这两个字节开头,则声明文本的其余部。分是Little-Endiam的UTF-16编码。
四、过滤流与包装类
1.包装类的概念与作用
通过FileOutputStream对象将一个浮点小数写入到文件中,感觉有点困难,能否通过FileOutStream对象或字节将一个整数写入到文件呢?
需要先将浮点小数转成字节数组,然后通过字节数组写入到输出流。
假如有个DataOutputStrem类提供了往各种输出流对象中写入各种类型的数据(当然包括浮点小数)的方法。你现在所要的工作就是:传递一个FileOutputStream输出流对象给DataOutputStream实例对象和调用DataOutputStream实例对象的用于写入浮点小数的方法。
DataOutputStream并没有对应到任何具体的流设备,一定要给它传递一个对应具体流设备的输出流对象,完成类似DataOutputStream功能的类就是一个包装类,也叫过滤流类或处理流类。
DataOutputStream包装类的构造函数语法publicDataOutStream(OutputStream out)
2.BufferedInputStream与BufferedOuputStream类
缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:
-允许java程序一次不只操作一个字节,这样提高程序的性能。
-由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为可能。
BufferedInputStream和BufferedOutputStream是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。想想这种缓冲区与底层系统提供的缓冲区的区别。
BufferedInputStream的两个构造函数:
-BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,即输入流In,一边将来使用
-BufferedInputStream(InputStream in,ing size) 创建具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in以便将来使用。BufferedOutputStream类的两个构造函数
-BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
-BufferedOutputStream(OutputStream out,ing size)创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
??BufferedRead和BufferedWriter类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的
newLine方法可以向字符流中写入不同操作系统下的换行符。
3.DataInputStream与DataOutputStream类
DataOutputStream类提供了三个写入字符串的方法:
-public final void writeBytes(String s)
-public final void writeChars(String s)
-public final void writeUTF(String str)
??为什么DataInputStream类中有一个readUTF方法,而没有“readBytes”和
“readChars”方法呢?
4.PrintStream类
PrintStream类提供了一系列的print和println方法,可以将基本数据类型的数据格式化成字符串输出。
PrintStream的3个构造函数:
-PrintStream(OutputStream out)
-PrintStream(OutputStream out,boolean autoflush)
-PrintStream(OutputStream out,boolean autoflush ,String encoding)
与PrintStream对应的PrintWriter类,即使遇到了文本换行标识符(\n),PrintWriter类也不会自动清空缓冲区。只有当遇到println方法或者设置清空时才清空??PrintWriter的println方法能根据操作系统的不同而生成相应的文本执行标识符。