您的位置:首页 > 编程语言 > Java开发

Java 高级—— IO 基础

2016-01-26 20:52 363 查看
一、File 类

先看一下File 类的定义

public class File extends Object implements Serizliable Comparable<File>

从定义看,File类是Object的直接子类,同时它继承了Comparable接口可以进行数组的排序。

File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等,以下是文件操作常用的函数。



File类的操作:

1、创建文件,注意File.separator可以解决跨操作系统的问题。

下面的例子是一创建一个文件,如果该文件存在则删除,否则创建该文件。

package cn.com.qiang.FiloDemo;

import java.io.File;
import java.io.IOException;

public class FileDemo2 {
public static void main(String[] args) {
File file = new File("D:\\test.txt");
if(file.exists()){
file.delete();
}else{
try{
file.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
}
}
}


2、文件的类型函数

file.isFile(); //判断是不是文件

file.isDirectory();//判断是不是目录

3、列出目录的内容

pulbic String[] list();//列出所有文件名和目录名

public File[] listFiles();//列出所有文件和目录

二、IO 流

与 C 一样,Java 也有流这个概念,下面先回忆一下什么是流

1、什么是流

流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。

一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。

流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。

实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。

形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。

2、流的分类

1)、Java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream),其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流的原理也类似。

2)、Java的常用输入、输出流

java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字节流。

•Java的字节流

InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。

•Java的字符流

Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。

结合开始所说的输入/输出流 ,出现了个一小框架。

字节流 字符流

输入流 InputStream Reader

输出流 OutputStream Writer



下面分别对这两种流进行介绍

JAVA字节流





•FileInputStream和FileOutputStream

这两个类属于结点流,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。如:

FileInputStream infile = new FileInputStream("myfile.dat");

FileOutputStream outfile = new FileOutputStream("results.dat");

要注意的是,构造FileInputStream, 对应的文件必须存在并且是可读的,而构造FileOutputStream时,如输出文件已存在,则必须是可覆盖的。

•BufferedInputStream和BufferedOutputStream

它们是过滤器流,其作用是提高输入输出的效率。

•DataInputStream和DataOutputStream

这两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流,它们允许程序按与机器无关的风格读写Java数据。所以比较适合于网络上的数据传输。这两个流也是过滤器流,常以其它流如InputStream或OutputStream作为它们的输入或输出。

下面举个例子,实现文件的复制功能:

package cn.com.farsight.writedemo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

public class InputStremdemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\feiq.rar");
FileOutputStream fos = new FileOutputStream("C:\\feiq.rar");

BufferedInputStream bfis = new BufferedInputStream(fis);
BufferedOutputStream bfos = new BufferedOutputStream(fos);

System.out.println(new Date());
int i = 0;
//		byte [] buf = new byte[128];
while((i = bfis.read())!=-1){
bfos.write(i);
}

fis.close();
fos.close();
bfis.close();
bfos.close();

System.out.println(new Date());
}
}

执行结果如下:

Tue Jan 26 20:24:50 CST 2016
Tue Jan 26 20:24:50 CST 2016

文件只有600多K,速度还是挺快的。

Java的字符流

字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符串和字符,对应的字符流按输入和输出分别称为readerwriter





•InputStreamReader和OutputStreamWriter

在构造这两个类对应的流时,它们会自动进行转换,将平台缺省的编码集编码的字节转换为Unicode字符。对英语环境,其缺省的编码集一般为ISO8859-1。

•BufferedReader和BufferedWriter

这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。

FileReader 和FileWriter

1、FileWriter类

构造方法:

FileWriter fw = new FileWriter(String fileName);//创建字符输出流类对象和已存在的文件相关联。文件不存在的话,并创建。

如:FileWriter fw = new FileWriter("C:\\demo.txt");

主要方法: void write(String str) // 写入字符串。当执行完此方法后,字符数据还并没有写入到目的文件中去。此时字符数据会保存在缓冲区中。

此时在使用刷新方法就可以使数据保存到目的文件中去。

void flush() // 刷新该流中的缓冲。将缓冲区中的字符数据保存到目的文件中去。

void close() // 关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后,再写入或者刷新的话,会抛IOException异常。

2、FileReader类

构造方法

FileReader fr = new FileReader(String fileName);//使用带有指定文件的String参数的构造方法。创建该输入流对象。并关联源文件。

主要方法

int read(char []cbuf);//将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。

void close(); //关闭此流对象。释放与之关联的所有资源。

下面是个例子

package cn.com.qiang.FiloDemo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;

public class FiloDemo3 {

public static void main(String[] args){

File fin,fout;
BufferedReader bf = null;
PrintWriter pw = null;
try{
fin = new File("D:\\面向对象面向过程.txt"); //注意文件与程序都要在同一个文件夹下。zzc.txt为要被复制的文件。
fout = new File("D:\\copy面向对象面向过程.txt"); //如果没有会自动创建。
bf = new BufferedReader(new FileReader(fin));
pw = new PrintWriter(fout); //PrintWriter为打印流,也可以使用BufferedWriter.
String line = bf.readLine();

while(line!=null){
pw.println(line);
line = bf.readLine();
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//关闭 文件。
if(bf!=null){
bf.close();
bf = null;
}
if(pw!=null){
pw.close();
pw = null;
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}


附:字节流和字符流的区别(重点)

字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: