流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。
流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。
实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。形象的比喻——水流 ,文件 ======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。
-
java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为 结点流(node stream), 其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流的原理也类似。
-
Java的常用输入、输出流
java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字节流。
Java的字节流InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
Java的字符流Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。结合开始所说的输入/输出流 ,出现了个一小框架。字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
//复制文件
1.字节流 FileInputStream FileOutputStream
public void readFile(){
try {
File file = new File("D:\\Test\\src\\com\\stream\\TestFileInputStream.java");
FileInputStream fin = null;
FileOutputStream fou = null;
fin = new FileInputStream(file);
fou = new FileOutputStream("D:\\Test\\src\\com\\stream\\TestFileInputStream.txt");
int num = 0;
int b = 0;
while ((b = fin.read()) != -1){
fou.write(b);
num ++;
System.out.print((char)b);
}
System.out.println(num);
fin.close();
fou.close();
} catch (FileNotFoundException e) {
System.out.println("文件不存在!");
System.exit(-1);
} catch (IOException e) {
System.out.println("读取文件错误!");
System.exit(-1);
}
}
2.字符流 FileReader FileWriter
public void fileReader(){
try {
FileReader reader = new FileReader("D:\\Test\\src\\com\\stream\\TestFileReader.java");
FileWriter writer = new FileWriter("D:\\Test\\src\\com\\stream\\TestFileReader.txt");
//按字符数组读取
char b[] = new char[1024];
while((b = reader.read())!= -1){
writer.write(b);
System.out.print((char)b);
}
reader.close();
writer.close();
System.out.println("文件复制成功!");
} catch (FileNotFoundException e) {
System.out.println("文件不存在!");
} catch (IOException e) {
System.out.println("读取文件失败");
}
}
3.带缓冲区的字节流 BufferedInputStream BufferedOutputStream
public void test(){
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\Test\\src\\com\\stream\\BufferedStream.java"));
BufferedOutputStream bot = new BufferedOutputStream(new FileOutputStream("D:\\Test\\src\\com\\stream\\BufferedStream.txt"));
int b = 0;
while((b = bis.read()) != -1){
System.out.print((char)b);
bot.write((char)b);
bot.flush();
}
bis.close();
bot.close();
System.out.println("文件复制完成!");
} catch (FileNotFoundException e) {
System.out.println("文件不存在!");
} catch (IOException e) {
System.out.println("读取文件失败!");
}
}
4.带缓冲区的字符流 BufferedReader BufferedWriter
public void test(){
try {
BufferedReader re = new BufferedReader(new FileReader("D:\\Test\\src\\com\\stream\\BufferedIO.java"));
BufferedWriter wr = new BufferedWriter(new FileWriter("D:\\Test\\src\\com\\stream\\BufferedIO.txt"));
String str = "";
while((str = re.readLine()) != null){
System.out.println(str);
wr.write(str);
wr.newLine();
wr.flush();
}
System.out.println("复制完成!");
} catch (FileNotFoundException e) {
System.out.println("文件不存在!");
} catch (IOException e) {
System.out.println("读取文件失败!");
}
}