Java输入流与输出流
一、IO体系架构
二、File类
我们要操作文件,试问,我们是不是先把这个文件进行封装成一个对象,因为Java是面向对象的一门语言,只有把文件封装成对象,我们才能对文件有进一步的操作。那么这个File对象有哪些行为(操作)呢?
- public boolean exists( ) 判断文件或目录是否存在
- public String getName( ) 返回文件名或目录名
- public String getPath( ) 返回文件或目录的路径
- public void delete( ); 删除文件
- public boolean mkdir( ); 创建目录
注意,这只是对文件做一步处理,封装成对象,程序才能操作!
三、字节流
OutputStream与InputStream 类是抽象类,因此并不能实例化,是以字节为单位进行数据传输,因此,OutputStream与inputStream能操作很多类型的文件,比如:视频、音频、文件等。其实,OutputStream与InputStream 就是讲内存与硬盘之间打开一个管道,数据通过这个管道进行传输,进行读写数据。
1、InputStream
是将数据从硬盘读入程序(内存)。其子类为FileInputStream,通过这个子类进行读取数据。
道理就像从井里抽水的过程,其中水池相当于内存,InputStream有个行为是read()方法,当启动这个方法时,就像启动了发动机,进行抽水,而FilePutStream就像管道,将井与水池建立连接,建立连接时,是不是要明确从哪里抽水,故new FilePutStream(“路径”)。
2、OutputStream
是将程序(内存)中的数据写入硬盘。其子类为FileOutputStream,通过这个子类进行写取数据。
同上道理,只不过,这次水井相当于内存。OutputStream有个行为是Writer()方法,当启动这个方法时,就像启动了发动机,进行抽水,而FileOutputStream就像管道,将井与水池建立连接,建立连接时,是不是要明确将水抽到哪里去,故new FileOutputStream(“路径\文件”)。如果有同名文件,自动覆盖。不存在时自动建立。
抽水完毕后,水管里面是不是还存留的有水,这时我们可以启动OutputStream的另外一个行为flush()方法,进行冲水,把剩余的管子里面的水冲净。
三、字节流示例
public static void main(String[] args) {
try {
File file = new File("C:\\Users\\HP\\Desktop\\helloWord.txt");
if (file.exists()){
InputStream in = new FileInputStream(file);
OutputStream out = new FileOutputStream("C:\\Users\\HP\\Desktop\\helloWord111.txt");
byte[] buffer = new byte[1024]; //建立一个缓冲区
int len = 0;
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
out.flush();
out.close();
in.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
四、字符流
字符流以字符为单位传送数据,只能传送文本类型的数据。
1、FileReader
读取指定磁盘文件内容的实例
FileReader fr = new FileReader(“文件路径”);
char[] data = new char[23]; //定义char数组
int length = 0;
while((length = fr.read(data))>0){ //循环读取文件中的数据
String str = new String(data,0,length); //根据读取文件的内容创建String 对象
System.out.println(str); //输出读取内容
}
fr.close();
2、FileWriter
文件字符输出流继承了Writer类,提供了向文件输出的各种方法,数据通过文件字符输出流以字符为单位输出并保存到文件中。
public static void main(String[] args) {
File file = new File("D://word2.txt"); //创建指定文件
try {
if(! file.exists()){
file.createNewFile(); //如果指定文件不存在,新建文件
}
FileReader fr = new FileReader("D://word.txt");
FileWriter fw = new FileWriter(file); //创建FileWriter对象
char[] data = new char[23];
int length = 0;
while((length = fr.read(data)) != -1){ //如果没有读到文件末尾
fw.write(data ); //向文件写入数据
}
fr.close(); //关闭流
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}