一、什么是流?
在java中, 将一组数据的有序序列称为流。流分为输入流和输出流。一般以Java程序为基准,进入程序中的数据序列称为输入流;从程序中离开的数据序列称为输出流。或者说,程序从输入流读取数据,向输出流写入数据
二、流的分类
1、抽象父类
1.InputStream类
1)int read()throws IOException:从输入流中读一个字节,形成一个0~255的整数返回。它是一个抽象方法,必须在具体的子类中被实现。
2)int read(byte b[]):从输入流中读多个字节到数组b中。当数组满时或输入流中不再有数据时返回。返回实际读取的字节数。
3)int read(byte b[],int off,int len):从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取的字节数。
4)public void close() throws IOException:关闭此输入流并释放与流关联的所有系统资源
其中前三个方法若返回-1,则表示流结束
2.OutputStream类
1)void write(int b):将指定的字节写入此输出流。要写入的字节是参数b的8个低位,b的24个高位将被忽略,即写入范围为0~255它是一个抽象方法,必须在具体的子类中被实现。
2)void write(byte[]b):将b.length个字节从指定的byte数组写入此输出流。
3)void write(byte[]b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入输出流。(往输出流依次写出字节组b中的从索引off开始的len个字节)
4)public void flush()throws IOException:刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示将这些字节立即写入他们的预期目标。
5)public void close() throws IOException:关闭此输出流并释放与流关联的所有系统资源
3.Reader类
1)int read():从输入流中读一个字符,java采用Unicode编码为每个字符分配2字节的存储空间,故read()方法将返回读取的2字节字符数据的Unicode编码,即以int型返回。如果已达末尾,则返回-1。它是一个抽象方法,必须在具体的子类中被实现。
2)int read(char[]cbuf}):从输入流中最多读取cbuf.length个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数。如果已达末尾,则返回-1
3)int read(char[]cbuf,int off,int len):读入len个字符,存入cbuf[off]开始的字符数组元素中。 如果已达末尾,则返回-1。
4)public void close() throws IOException:关闭此输入流并释放与流关联的所有系统资源。
4.Writer类
1)void write(int c):将单个指定字符输出到指定的输出流。
2)void write(char[]cbuf):将字符数组cbuf的数据输出到指定的输出流。
3)void write(char[]cbuf,int off,int len):将字符数组cbuf从off位置开始的len个字符输出到指定流。
4)void write(String str):将str字符串的字符输出到指定的输出流。
5)void write(String str,int off,int len):将str字符串从off位置开始的len个字符输出到指定流。
6)void flush():刷新该流的缓冲区。
7)public void close() throws IOException:关闭此输出流并释放与流关联的所有系统资源。
2、文件输入输出流
该类只能按照本地平台默认的字符编码规范读取数据(字符),用户不能指定其他字符编码类型。
1.FileReader
FileReader类构造方法的参数是磁盘文件,确定了数据源。其构造方法有:
1)FileReader(File file):在给定从中读取数据的文件名的情况下创建一个新的FileReader。
2)FileReader(String fileName):在给定从中读取数据的File的情况下创建一个新的FileReader。
FileReader类中可用的方法有:read()返回输入字符,read(char[]buffer)输入字符到字符数组中等。这些方法是从Reader类间接继承下来的,因此,其用法与Reader类中相应的读方法相同
2.FileWriter
FileWriter类构造方法的参数是磁盘文件,确定了数据目的地。其构造方法包括:
1)FileWriter(String fileName):根据给定的文件名构建一个FileWriter对象。
2)FileWriter(String fileName,boolean append):若使用构造器FileWriter(file, true),则目录下的同名文件不会被覆盖,在文件末尾追加内容。
3)FileWriter(File file):根据给定的File对象构造一个FileWriter对象,写入文件时目录下有同名的文件将被覆盖。
4)FileWriter(FileDescriptior fd):构造与某个文件描述相关联的FileWriter对象。
5)FileWriter(String fileName, boolean append):根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter对象。
package com.elif.two;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class File02 {
public static void main(String[] args) {
String str = "春眠不觉晓\n";
char[] ch = str.toCharArray();
FileWriter fw = null;
FileReader fr = null;
try{
fw = new FileWriter("春晓.txt");
fw.write(ch);
fw.write("处处闻啼鸟\n");
fw.write("夜来风雨声\n");
fw.write("花落知多少\n");
fw.close();
} catch (IOException e) {
System.err.println("流的创建、写和关闭都有可能产生IOException");
System.exit(-1);
}
try {
fr = new FileReader("春晓.txt");
int i;
while ((i=fr.read()) != -1) {
System.out.println((char) i);
}
System.out.println();
fr.close();
} catch (FileNotFoundException e) {
System.out.println("文件未找到!");
System.exit(-2);
} catch (IOException e) {
System.out.println("读和关闭都可能产生IOException异常。");
System.exit(-3);
}
}
}
package com.elif.two;
import java.io.IOException;
import java.io.*;
public class File01 {
public static void main(String[] args) throws IOException {
//创建File实例,使其表示目录d:\myDir
File myDir = new File("d://myDir");
if(! myDir.exists())
myDir.mkdir();
//如果目录d:\myDir不存在,创建File实例,使其表示目录d:\myDir\myDir1
File myDir1 = new File(myDir,"myDir1");
if(! myDir1.exists())
myDir1.mkdirs();
//创建File市里面,使其表示文件d:\myDir\myDir1\my.txt
File file = new File(myDir1,"my.txt");
if(! file.exists())
file.createNewFile();//如果文件不存在,创建它
listDir(myDir);//查看目录
}
static void listDir(File dir) {
File[] listF = dir.listFiles();
//打印当前目录下包含的所有子目录和文件的名字
String info ="目录:"+dir.getName() + "{";
for(int i=0;i<listF.length;i++) {
info +=listF[i].getName();
info +="}";
}
System.out.println(info);
//打印当前目录下包含的所有子目录和文件的信息
for(int i=0;i<listF.length;i++) {
File f = listF[i];
if(f.isFile())
printFileInfo(f);
else
listDir(f);//如果为目录,就递归调用listDir()方法
}
}
static void printFileInfo(File f) {
System.out.println("文件名:"+f.getName());
System.out.println("文件路径:"+f.getParent());
System.out.println("文件可读?:"+f.canRead());
System.out.println("文件长度:"+f.length()+"字节");
}
}