关于I/O流的简单入门知识
1.流是文件(磁盘)与内存之间建立的一个通道,在Java API中,可以从其中读入一个字节序列的对象称为输入流,可以向其中写入一个字节序列的对象称为输出流。字节序列可以来自文件,网络连接,甚至内存块。
2.以内存作为参考,流可以分为输入流(InputStream,Reader<读入>)和输出流(OutputStream,Writer<写出>).
3.又分为字节流(InputStream,OutputStream)和字符流(Reader,Writer).
可以认为二进制数据为字节流,文本数据为字符流(只是能用记事本能够打开的文本文件)。
从抽象类Reader和Writer中继承出来的类拥有读与写的操作都是基于两字节的Unicode码元的,不是基于单字节的字符。
4. ① InputSream(抽象类,输入字节流的超类)
a.FileInputStream和FilterInputStream继承了InputStream
b.BufferedInputStream继承了FilterInputStream
② OutputStream(抽象类,输出字节流的超类
)
a.FileOutputStream和FilterInputStream继承了OutputStream
b.BufferedInputStream继承了FilterOutputStream
③ Reader(抽象类,读取字符流的类)
a.BufferedReader和FilterReader和InputStreamReader继承了Reader
b.FileReader继承了InputStreamReader
④ Writer(抽象流,写出字符流的类)
a.BufferedWriter和FilterWriter和InputStreamWriter继承了Writer
b.FileWriter继承了InputStreamWriter
5.FileInputStream(文件字节流)
①单字节读入
public void demo1() throws IOException{
InputStream is=new FileInputStream(new
File("e:/aa.txt"));
int i;
while((i=is.read())!=-1){
System.out.println((char)i);
}
is.close();
}
②字节组读入(java中一个汉字占两个字节)
public void demo2() throws IOException{
InputStream is=new FileInputStream(new
File("e:/aa.txt"));
byte buff[]=new byte[2];
int i;
while((i=is.read(buff))!=-1){
String s=new String(buff);
System.out.println(s);
}
}
6.FileOutputStream
①单字节写出(文件系统会自动创建)
public void demo3() throws IOException{
OutputStream os=new FileOutputStream(new
File("e:/aa.txt"),true);//这里的true是为了
下次写出时不会覆盖原文件,而是跟在后面
String str="Hello World!"
for(int i=0;i<str.length();i++){
char c=str.charAt(i);
os.write();
}
os.flush();//保证缓冲区的清空
os.close();
}
②汉字写出
public void demo4(){
OutputStream os=new FileOutputStream(new
File("e:/aa.txt"),true);
String str="你好,java!"
os.write(str.getBytes()); //将字符串转为byte数组
os.flush();
os.close();
}
7.缓冲流
缓冲流要“套”在相应的节点流上,对于读写数据提供了缓冲功能,能提高读写的效率。
(从磁盘整块拿到缓冲区,再分个流向内存,比一个一个从磁盘区流到内存的速度要快,从内存流向磁盘方向类似)
BufferedInputStream和BufferedOutputStream对于字节流而言,加速了文件读取与存入的速度,提高了复制效率。
BufferedReader和BufferedWriter对于字符流而言,提高了输入写出的速度。
8.利用缓冲流和字节流进行文件复制(任何java文件,不限于txt)
public void copy1() throws IOException{
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
bis=new BufferedInputStream(new FileInputStream(new
File("e:/aa.txt")),1024); // 1024 设置缓冲流的大小
bos=new BufferedOutputStream(new FileOutStream(new
File("e:/bb.txt")),1024);
byte[] buff=new byte[1024];
int i;
while((i=bis.read(buff))!=-1){
bos.write(buff);
}
System.out.println("复制完成!");
bos.flush(); //清空缓冲区
bos.close(); //先关闭输出流
bis.close(); //后关闭输入流
}
9.利用缓冲流和字符流进行文本复制
public void copy2() throws IOException{
BufferedReader br=null;
BufferedWriter bw=null;
br=new BufferedReader(new FileReader(new
File("e/:aa.txt")));
bw=new BufferedWriter(new FileWriter(new
File("e/:bb.txt")));
String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine(); //换行
}
bw.flush();
bw.close();
br.close();
}
10.InputStreamReader和OutputStreamWriter
InputStreamReader
是字节流通往字符流的桥梁
OutputStreamWriter是字符流通往字节流的桥梁
例:
public void demo5(){
BufferedReader br=new BufferedReader(new
InputStreamReader(new FileInputStream(new
File("e:/aa.txt"))));
String line;
while((line=br.readLine())!=null){
System.out,pritln(line);
}
}
(上例可与5①比较理解)
11.java的流组合机制
FileInputStream和FileOutputStream只支持在字节级别上的读写。也就是只能从其对象中读取字节和字节数组。
DataInputStream只能读入数值类型
Java使用了一种灵巧的机制来分离这两种职责,某些流()可以从文件和其他外部的位置上获取字节,而其他流可以将字节组装成更有用的数据类型,Java可以将其进行组合。
例
FileInputStream fin=new
FileInputStream("employee.dat");
DataInputStream din=new DataInputStream(fin);
double s=din.readDouble();
例
DataInputStream
din=new DataInputStream(new BufferedInputStream(new
FileInputStream(new File("e:/aa.txt"))));
12.从控制台输入
InputStreamReader in=new InputStreamReader(System.in);
#Java工程师#