简介
java I/O以标准化的操作对外界统一读写数据.
I–输入:从外界到程序的方向,读取数据
O–输出:从程序到外界的方向,写出数据
分类
节点流:低级流,是实际连接数据源与程序 的’管道’,负责实际读写数据的流.读写一定建立在节点流基础上进行
处理流:不能独立存在,建立在其他流上,当数据流经当前流时对数据加工处理,简化操作.
文件流
java.io.FileInputStream继承自InputStream
java.io.FileOutputStream继承自OutputStream
常用的一对低级流实现类,用来连接文件,对文件进行 读写操作的
//java.io.FileOutputStream
public class FOSDemo {
public static void main(String[] args) throws IOException {
/*
* 文件输出流的常用构造方法:
* FileOutputStream(File file)
* FileOutputStream(String path)
* 以上两种构造方法创建的文件输出流为
* 覆盖写模式,即:若指定的文件已经存在则
* 会将该文件数据清除,然后将通过当前流
* 写入的数据作为新数据保存.
*
*
* FileOutputStream(File file,boolean append)
* FileOutputStream(String path,boolean append)
* 以上两种构造方法创建的文件输出流为
* 追加模式.即:若指定的文件存在,则原数据
* 保留,通过当前流写出的内容会顺序的追加
* 到文件后面.
*/
FileOutputStream fos
= new FileOutputStream("./fos.txt",true);
String line = "么么哒";
byte[] data = line.getBytes("GBK");
fos.write(data);
System.out.println("写出完毕!");
fos.close();
}
}
//java.io.FileInputStream
public class FISDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis
= new FileInputStream("./fos.txt");
byte[] data = new byte[100];
int len = fis.read(data);
System.out.println("实际读取了"+len+"字节");
/*
* String(byte[] data,int offset, int len,String csn)
* 将给定的字节数组中从下标offset处的连续
* len个字节按照指定的字符集转换为字符串
*/
String line = new String(data,0,len,"GBK");
System.out.println(line);
fis.close();
}
}
流操作后要记得close.
复制示例
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 使用文件流完成文件的复制操作
*/
public class CopyDemo {
public static void main(String[] args) throws IOException {
/*
* 1:创建文件输入流读取原文件
* 2:创建文件输出流写复制文件
* 3:循环从原文件读取字节并写入到
* 复制文件中完成复制工作
*/
FileInputStream fis = new FileInputStream("./movie.wmv");
FileOutputStream fos= new FileOutputStream("./movie_cp.wmv");
int len = -1;
byte[] data = new byte[1024*10];
while((len = fis.read(data))!=-1) {
fos.write(data,0,len);
}
System.out.println("复制完毕");
fis.close();
fos.close();
}
}
可以使用缓冲流java.io.BufferedOutputStream
java.io.BufferedInputStream提高读写效率
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 缓冲流
* java.io.BufferedOutputStream
* java.io.BufferedInputStream
* 缓冲字节输出输入流是一对高级流,在流连接中的
* 作用是提高读写效率(内部默认维护一个8K的字节
* 数组,并将读写的数据统一转换为块读写从而提高
* 的效率.)
*
*
* @author Administrator
*
*/
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("music.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos= new FileOutputStream("music_cp.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int data = -1;
while((data = bis.read())!=-1) {
bos.write(data);
}
System.out.println("复制完毕!");
bis.close();
bos.close();
}
}
使用缓冲输出流会存在缓冲区问题
public class BOS_flushDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos= new FileOutputStream("bos.txt");
BufferedOutputStream bos= new BufferedOutputStream(fos);
String str = "hey!everybody,啦啦啦...";
byte[] data = str.getBytes("GBK");
bos.write(data);
/*
* void flush()
* 该方法是OutputStream定义的方法,实际上所有
* 字节输出流都有该方法,但并非所有字节输出流
* 都实现了这个方法的功能,只有缓冲流的该方法
* 有实际意义,作用是一次性将缓冲区已经缓存的
* 数据写出.
* 之所以所有字节输出流都有这个方法是因为流
* 连接应用中缓冲流通常不是"终端流"(直接被我们
* 操作的流),为了传递刷新缓冲区功能才有的.
*/
bos.flush();
System.out.println("写出完毕!");
bos.close();
}
}
学无止境!