?
目的:
?
在变量、数组和对象中存储数据是暂时的,程序结束后它们就会丢失。
?
为了能够永久地保存程序创建的数据,需要将其保存在磁盘文件中,这样以后就可以在其他程序中使用它们。
Java的I/O技术可以将数据保存到文本文件、二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求。
掌握I/O处理技术能够提高对数据的处理能力。
?
了解Java中的流概念
了解Java中输入/输出流的分类
掌握文件输入/输出的使用方法
掌握ZIP压缩输入/输出流的应用
?
12.1流概述
?
? 流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。
?
I/O提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。
?
虽然I/O流经常与磁盘文件存取有关,但是程序的源和目的也可以是键盘、鼠标、内存或显示器窗口等。
?
12.2 输入/输出流
?
java.io包
输入流类:
? ? ? ?抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;
输出流类:
? ? ? ?抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。
?
12.2.1输入流
java.lang.Object
java.io.InputStream
?
?
Java中的字符是Unicode编码,是双字节的。
InputStream是用来处理字节的,在处理字符文本时不是很方便。
Java为字符文本的输入提供了专门一套单独的类Reader,但是Reader类
并不是InputStream类的替换者,只是在处理字符串时简化了编程。
?
?
Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。
?
?
12.2.2输出流
OutputStream类是字节输入流的抽象类,此抽象类表示输出字节流的所有类的超类。
OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常。
?
Writer 类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。
?
?
12.2.3 案例
显示指定类型的文件
?
?
?
12.3 File类
?
File类是io包中唯一代表磁盘文件本身的对象。
可以通过调用File类中的方法,实现创建、删除、重命名文件等。
?
File类的对象主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等。
?
数据流可以将数据写入到文件中,而文件也是数据流最常用的数据媒体。
?
12.3.1文件的创建于删除
?
构造方法
1.File(String pathname)?
? ? ? ? ? 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
?
语法格式:
new File(String pathname)
?
pathname: 是指路径名称(包含文件名)
?
File file = new File("d:/1.txt");
?
2.File(String parent, String child)?
? ? ? ? ? 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
?
该构造方法根据定义的父路径和子路径字符串(包含文件名)创建一个新的File对象。
new File(String parent,String child) ?
parent:父路径字符串?
child: ? 子路径字符串
?
?
3.File(File parent, String child)?
? ? ? ? ? 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
?
该构造方法根据parent抽象路径名和child路径名字符串创建一个新File实例。
?
new File(File f,String child)
f:父路径对象
child:子路径字符串
?
注意:
? ? ? ?对于windows平台,包含盘符的路径名前缀由驱动器号和一个“:”组成。
如果是绝对路径名,还可能后跟"\\"。
?
12.3.1.1代码案例
package day25;
?
import java.io.File;
import java.io.IOException;
?
public class FileTest {
public static void main(String[] args) {
?
/*File(File?parent, String?child)?
*根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例
*在项目中创建FileTest类,在主方法中判断文件夹是否存在..txt文件,
*如果文件存在将其删除,不存在则创建该文件 */
File file = new File("E:/zhuhw_study","test.txt");
if(file.exists()) {
file.delete();
System.out.print("文件已被删除");
}else{
try {
file.createNewFile();
System.out.print("文件已被创建");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
?
}
}
}
?
运行结果:
文件已被创建
?
12.3.2获取文件信息
?
?
代码案例:
package day25;
?
import java.io.File;
import java.io.IOException;
?
public class FileTest {
public static void main(String[] args) {
?
/*获取文件夹下的..txt文件的文件名、文件长度、并判断该文件是否是隐藏文件。*/
? ?File f2 = new File("E:/zhuhw_study","test2.txt");
? ?System.out.println("文件的文件名: ?"+f2.getName());
? ?System.out.println("文件的长度: "+f2.length());
? ?System.out.println("文件是否是隐藏文件: "+f2.isHidden());
}
}
运行结果:
文件的文件名: ?test2.txt
文件的长度: 0
文件是否是隐藏文件: false
?
12.4文件输出/输出流
?
12.4.1基本概念
如果将数据永久保存,可使用文件输入/输出流与指定的文件建立连接,将需要的数据永久保存到文件中。
java.lang.Object
?java.io.InputStream
? ? java.io.FileInputStream
?
java.lang.Object
? ?java.io.OutputStream
? ? ?java.io.FileOutputStream
?
都是用来操作磁盘文件的。
?
12.4.1代码案例
?
使用FileOutputStream类向文件work写入信息,然后通过FileInputStream类将work文件中的数据读取到控制台上。
?
?package day25;
?
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
?
public class FileTest {
public static void main(String[] args){
/*使用FileOutputStream类向文件word写入信息,
然后通过FileInputStream类将文件中的数据读取到控制台上。*/
File file = new File("G:/asiainfo","test_zhuhw");
try {
FileOutputStream fio = new FileOutputStream(file);
byte b[] = "你好呀,我是瓦询...".getBytes();
fio.write(b);
fio.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
?
try {
FileInputStream fii = new FileInputStream(file);
byte byt[] = new byte[1024];
/*
* 从此输入流中将 byte.length 个字节的数据读入一个 byte 数组中。
* public int read(byte[] b)
* b - 存储读取数据的缓冲区。
* 返回:读入缓冲区的字节总数,如果因为已经到达流末尾
* 而没有更多的数据,则返回 -1 */
int len = fii.read(byt);
/*public String(byte[] bytes,
? ? ? ? ? ? ?int offset,
? ? ? ? ? ? ?int length)
通过使用平台的默认字符集解码指定的 byte 子数组,
构造一个新的 String。新 String 的长度是字符集的函数,
因此可能不等于该子数组的长度。
参数:
bytes - 要解码为字符的 byte
offset - 要解码的第一个 byte 的索引
length - 要解码的 byte 数?
? ? ? ? ? ?*/
String s = new String(byt,0,len);
System.out.print("文件中的信息是: "+s);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
?
?
}
}
运行结果:
文件中的信息是: 你好呀,我是瓦询...
?
?
一个被打开的流有可能会用尽系统资源,这取决于平台的和实现。
如果没有将打开的流关闭,当另一个程序试图打开另一个流时,这些资源可能会得不到。
?
?
?
12.4.2 FileReader 和 FileWriter
?
另一个资料看到的,好理解
掌握流的基本概念
掌握Java中各种常用输出输入流的基本用法
能够熟练地编写应用程序解决文件的读写问题
?
8.1流的基本概念
“流”可以被理解为管道。
管道:两个端口,一端与数据源(当输入数据时)或数据宿(当输出数据时)相连,另一端与程序相连。
在两端口,“管道”在读写数据时能够应付数据源和数据宿的多样性,消化掉因数据源/宿的多样性带来的数据读/写的复杂性;
而在与程序相连的端口,“管道”提供了输入输出的统一操作接口。
?
对管道的统一而简单的操作,这样就大大降低了输入输出的复杂性。
?
有了流,程序和外界的数据交换都可通过流实现。
?
分类:
? ? ? ?根据流中的数据传输的方向,将流分为输入流和输出流。
? ? ? 根据“管道”里流动的数据类型,将分为字符流(Character Streams)和字节流(Byte Streams)
?
提示:
? ? ? ?在java的底层操作中,所有的输入输出都是以字节形式进行的。
?
8.2 字节流
java中的字节流是以字节(byte)为基本处理单位,用于对二进制数据进行读写操作。
对应输入字节流会和输出字节流的两个顶层的抽象类,分别是InputStream和OutputStream。
?
?
8.3字符流
java的字符流是以16位的Unicode码表示的字符为基本处理单位。
对应输入字符流和输出字符流的两个顶层的抽象类,分别是Reader和Writer。
?
?
8.4 File类
文件是许多程序的基本数据源和数据宿,是保存永久数据和共享信息的媒体。
在Java中,目录页被当作文件,可以用list方法列出目录中的文件名。
?
?
8.5 System.in 和System.out对象
?
可以在程序中直接使用而不用重新定义自己的流对象,因为它们都是静态成员。
?
8.6 FileInputStream类和FileOutputStream类
?
通常所使用的文件中,有很多文件是二进制文件,它们以字节作为数据处理的单位。
?
8.7FileReader类和FileWriter类
因为大多数程序涉及文件读写,,所以FileReader类是一个经常用到的类,可以在一个指定文件上实例化一个文件输入流,
利用流提供的方法从文件中读取一个字符或者一组数组。
最重要的方法是read。
?
由FileWriter类可以实例化一个文件输出流,并提供向文件中写入一个字符或者一组数据的方法。
?
8.8过滤流
原文:http://yuzhouxiner.iteye.com/blog/2259243