在变量、数组和对象中存储数据是暂时的,程序结束后它们则会丢失。为了能够永久地保存程序创建的数据,需要将其保存在磁盘文件中。这样以后就可以在其他程序中使用它们。Java的I/O技术可以将数据保存到文本文件、二进制文件甚至是ZIP压缩文件中。以达到永久性保存数据的要求。掌握I/O处理技术能够提高对数据的处理能力。
1.File类
java.io包中封装了用于输入输出的类。io包中唯一代表磁盘文件本身的File类定义了一些与操作系统无关的方法来操作磁盘文件。通过File实例可以获取文件本身的一些信息,例如文件名、文件长度、文件读写权限等。通过File类的一些方法,还可实现文件的创建、删除、重命名等操作。
可以通过以下3种方法创建一个File对象:
方法声明:new File(String pathName)
参数说明:pathName是包含有文件名称的路径名方法声明:new File(String parent,String child)
参数说明:parent是父路径字符串,如“D://”“D://txt”。child是子路径字符串,如word.txt方法声明:new File(File parent,String child)
参数说明:parent是父抽象路径名。child是子路径名字符串File类提供了很多操作文件的方法,常用的:
通过File类,不仅可以获取指定文件的各属性信息,还可以实现文件的重命名,获取指定目录下的所有文件等。
2.字节输入输出流
流是一组有序的数据序列,根据操作的类型,可将其分为输入流和输出流两种。I/O流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。虽然I/O流经常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等。
程序通过输入流可以读取源中的数据,例
程序通过向输出流中写数据把信息传递到目的地。输出流的目标可以是文件、网络、压缩包和其他数据输出目标,输出模式:
字节流用于处理二进制数据的读取和写入,以字节为单位,InputStream类和OutputStream类是字节流的抽象类,它们定义了数据流读取和写入的基本方法。
①标准输入流
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。定义了操作输入流的各种方法:
②标准输出流
OutputStream类是字节输出流的抽象类,该类定义了所有输出流的操作方法:
③文件输入流
FileInputStream文件字节输入流,可以从指定路径的文件中读取字节数据。该类继承自InputStream类。并实现了读取输入流的各种方法。可以通过以下两种方式,创建FileInputStream实例:
方法声明:new FileInputStream(File file)
参数说明:file是File类型对象方法声明:new FileInputStream(String path)
参数说明:path是文件的绝对路径或相对路径④文件输出流
与FileInputStream类对应,FileOutputStream类实现向文件中写数据。该类继承自OutputStream类,并实现了输出数据的各种方法。创建文件字节输出流常用的构造方法:
方法声明:new FileOutputStream(File file)
参数说明:file是File文件类型对象方法声明:new FileOutputStream(String path)
参数说明:path是指定文件的路径和文件名称⑤缓冲输入流
缓存流可以说是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。有了缓存区,使得在流上执行skip()、mark()和reset()方法都成为可能。缓存区的大小,取决于其所在的操作系统、可用的内存空间以及机器配置。BufferedInputStream对象位于InputStream对象之前。BufferedInputStream类读取文件的过程:
BufferedInputStream类常用的构造方法:
方法声明:new BufferedInputStream(InputStream in)
参数说明:in是输入流对象方法声明:new bufferedInputStream(InputStream ins,int size)
参数说明:ins是底层输入流。size是指定缓冲区的大小⑥缓冲输出流
BufferedOutputStream缓存字节输出流。通过设置这种输出流,应用程序可以将各个字节写入底层输出流中。使用BufferedOutputStream输出信息和OutputStream输出信息完全相同,只不过BufferedOutputStream类有一个flush()方法将缓存区中数据强制输出完。该类构造方法:
方法声明:new BufferedOutputStream(OutputStream in)
参数说明:in是输入流对象方法声明:new BufferedOutputStream(OutputStream out,int size)
参数说明:out是底层输出流。size是缓冲区大小⑦数据输入流
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型。即当读取数值时,不必再关心这个数值应当是多少个字节。该类的构造方法:
方法声明:new DataInputStream(InputStream in)
参数说明:in是输入流对象
DataInputStream类常用的方法:
⑧数据输出流
数据输出流(DataOutputStream)允许应用程序以适当方式将基本Java数据类型写入输出流中,然后,应用程序可以使用数据输入流将数据读入。DataOutputStream类构造方法:
方法声明:new DataOutputStream(OutputStream out)
参数说明:out是输出流对象
DataOutputStream类的常用方法:
DataOutputStream类提供了3种写入字符串的方法,分别为:writeBytes()、writeChars()、writeUTF()。由于Java中的字符是uincode编码,是双字节的。writeBytes只是将字符串中的每一个字符的低字符内容写入目标设备中;而writeChars将字符串中的每一个字符的两个字节的内容都写到目标设备中;writeUTF对字符串按照UTF编码后的字节长度,然后才是每一个字节的UTF编码。
DataInputStream类只提供了一个readUTF()方法返回字符串。这是因为要在一个连续的字节流读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且事先也不知道这个字符串的长度,这样就无法知道读取什么位置才是这个字符串的结束。DataOutputStream类中只有writeUTF()方法向目标设备中写入字符串的长度,所以,只有通过readUTF()方法能准确地读回写入字符串。
3.字符输入输出流
由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象。使用字符输入输出流可以避免这个现象。字节流与字符流的区别是:字节流以字节为单位传送数据,可以是任何类型的数据,例如文本、音频、视频、图片等;而字符流以字符为单位传送数据,只能传送文本类型的数据。
①Reader类
字符流用于处理字符数据的读取和写入。它以字符为单位。Reader类与Writer类是字符的抽象类,它们定义了字符流读取和写入的基本方法,各个子类会依其特点实现或覆盖这些方法。
注:计算机中每个汉字的显示是占用两个字节,而在Java语言中,字符类型的数据也是双字节,所以Java中的字符类型可以容纳汉字信息。
Reader类定义了操作字符输入流的各种方法,该类的常用方法:
②Writer类
Writer类用于解决字符数据的输出流,该类是所有字符输出流的抽象类,子类必须实现的方法仅有write(char[],int off,int len)、flush()和close()。Writer类的常用方法:
③FileReader类
FileReader类继承自类Reader,并实现了读取字符输入流的各种方法。可以从指定路径中读取字符数据。该类提供了实现读取字符输入流的各种方法。该类的构造方法:
方法声明:new FileReader(File file)
参数说明:file是要读入数据的文件对象方法声明:new FileReader(String fileName)
参数说明:fileName表示与系统有关的文件名④FileWriter类
FileWriter类实现了文件字符输出流,该类继承自Writer类。实现了写入字符文件的便捷类,文件字符输出流关联指定路径的文件,数据通过文件字符输出流以字符为单位输出并保存到文件中。
方法声明:new FileWriter(File file)
参数说明:file是要写入数据的文件对象方法声明:new FileWriter(String path)
参数说明:path表示与系统有关的文件名⑤Scanner类
Scanner类实现了使用正则表达式来解析基本类型和字符串的简单文本扫描器。该类位于java.util包中。Scanner使用分隔符模式将其输入分解为标记,该类有多种构造方法:
方法声明:public Scanner(File source)
参数说明:source是要扫描的文件对象方法声明:public Scanner(String source)
参数说明:source是要扫描的字符串方法声明:public Scanner(InputStream source)
参数说明:source是要扫描的输入流Scanner提供了不同的方法可将得到的标记转换为不同类型的值:
⑥PrintWriter类
System.out是PrintStream类的一个实例对象,PrintStream类位于java.io包中,该类提供了一系列的print()和pritln()方法,用于信息的输出。io包中还提供了一个与PrintStream对应的PrintWriter类。PrintWriter即使遇到换行符(’\n’)也不会自动清空缓存区。只在设置了autoflush模式下使用了println()方法后才会自动清空缓存区。
PrintWriter类的构造方法:
方法声明:public PrintWriter(File file)
参数说明:file是作为此writer目标使用的文件方法声明:public PrintWriter(String fileName)
参数说明:fileName是用作此writer目标的文件名称方法声明:public PrintWriter(OutputStream out)
参数说明:out是输出流该类的常用方法:
Windows的文本换行是“\r\n”,而在Linux操作系统下的文本换行是“\n”。如果希望程序生成平台相关的文本换行,而不是在各种平台下都用“\n”作为文本换行,则应该使用PrintWriter的println()方法。该方法可以根据不同的操作系统而生成相应的换行符。
4.StringBuilder类
对于创建成功的字符串对象,它的长度是固定的,内容不能被改变和编译。虽然使用符号“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例。会在内存中创建新的字符串对象。如果重复的对字符串进行修改,将极大地增加系统开销。而J2SE5.0新增了可变的字符序列StringBuilder类,会大大提高频繁做字符串增加的效率。
新创建的StringBuilder对象初始容量是16个字符。可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuilder对象将自动增加长度以容纳被附加的字符。若要使用StringBuilder最后输出字符串结果,可使用toString()方法。
①StringBuilder与StringBuffer
java.lang包中定义了StringBuffer类,该类是线程安全的可变字符序列。一个类似于String的字符串缓冲区。但不能修改。StringBuffer类是线程安全的。可以在必要时对字符串更新方法进行同步。
StringBuffer上主要操作是append()和insert()方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将字符串的字符追加或插入到字符串缓冲区中。
StringBuilder是JDK1.5新增的类,是StringBuffer的一个简易替换,如果字符串缓冲区被单个线程使用时,建议优先采用StringBuilder类。因为在大多数情况下,StringBuilder类要比StringBuffer类运行速度快。StringBuilder与StringBuffer类提供的外部方法是一样的。如果需要同步,则建议使用StringBuffer。
②常用方法
append()方法:
该方法用于向字符串生成器中追加内容,通过该方法的多个重载形式,可实现接受任何类型的数据。例如int、boolean、char、String、double或者另一个字符串生成器等。
方法声明:append(content)
参数说明:content是表示要追加到字符串生成器中的内容。可以是任何类型的数据或者其他对象。
intsert(int offset,arg)方法:
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入int、float、char、boolean等基本数据类型或其他对象。
方法声明:insert(int offset,arg)
参数说明:offset是字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。arg是将插入至字符串生成器的位置。该参数可以是任何的数据类型或其他对象。
delete(int start, int end)方法:
移除此序列的子字符串中的字符。该子字符串从指定的start处开始,一直到索引end - 1处的字符;如果不存在这种字符,则一直到序列尾部;如果start等于end,则不发生任何更改。
方法声明:delete(int start, int end)
参数说明:start是将要删除的字符串的起点位置;end是将删除字符串的终点位置。