流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候就可以想象数据好像在这其中“流动”一样。
可以读取字节序列的对象称为输入流,可以写入字节序列的对象称为输出流。
数据流的类可以分为字节流( byte stream )和字符流( character stream )两种类型,分别由
四个抽象基类来表示。字节流的基类有抽象类InputStream和OutputStream,字符流的基类有抽象类Reader和Writer。
以InputStream的读取为例,主要方法有:
int read(byte b[]) 把字节读到数组b 中,并返回实际读入的字节数
long skip(long n) 跳过输入数据流中n个字节的数据,并返回实际跳过的字节数
abstract int read() 读取下一个字节并返回它的整数表示
对某些流来说,可以从文件或者其他地方读入字节,而对另一些流来说,它们则可将字节“组装”成更有用的数据类型。通过将一个现成的流传递给另一个流的构造器来综合运用这两种流,可以将其合并成所谓的“过滤流”。
例如:为了能从文件中读取数字,首先要创建一个FileInputStream对象,然后将其传递给一个DataInputStream的构造器
FileInputStream fin = new FileInputStream("employee.dat");
DataInputStream din = new DataInputStream(fin);
double s = din.readDouble();
数据流支持读取和写入基本 Java 类型的方法。
// 为文件 in.dat 创建一个输入流
DataInputStream infile = new DataInputStream(new FileInputStream("in.dat"));
// 为文件out.dat 创建一个输出流
DataOutputStream outfile = new DataOutputStream(new FileOutputStream("out.dat"));
文本输出可以使用PrintWriter
import java.io .*;
class Test
{
public static void main(String [] args ) throws IOException
{
FileOutputStream fos = new FileOutputStream("employee.txt");
PrintWriter pw = new PrintWriter(fos);
pw.println(100);
pw.println("abc");
pw.println(false);
pw.flush();
pw.close();
fos.close();
}
}
而文本输入可以使用BufferedReader
// 从文件输入
BufferedReader in = new BufferedReader(new FileReader("employee.txt"));
// 获取键盘输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 常用方法
in.readLine();
File 类是文件名的一个包装类。常用方法包括:
exists() 查看文件是否存在
getName() () 得到文件名
getPath() 得到文件完整路径
getParent() 得到包含文件的目录
File f = new File("c:\\student.txt");
if(f.exists()) {
f.delete();
}
try{
f.createNewFile();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getParent());
System.out.println(f.canRead());
System.out.println(f.lastModified());
System.out.println(f.length());