IO流:
输入流:是按程序来说的。比如文件到程序。
输出流:程序到文件。
字节流:InputStream/OutputStream
1.InputStream
read();读入一个字节并返回,包装为int,返回-1表示已读不到
read(byte[] b) 一次读入尽可能多的字节去填满字节数组b,返回实际读到的字节数,-1表示已读不到。
read(byte[] b, int off, int len) 一次读入尽可能多的字节去填满字节数组b从off开始的len个空间。
close()
请看下面代码:
读入指定文件“d:/a.txt”中的每个字节并输出显示
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class TestFIFO { public static void main(String[] args) throws IOException { //定义文件,并且导入File包,import java.io.File;也可以按住Ctrl+Alt+O导包 File file = new File("d:/a.txt"); //定义输入流 FileInputStream fis = new FileInputStream(file); int i = 0; //从指定文件中读出文件中的每个字节并输出 while((i = fis.read())!=-1){ System.out.println((char)i); } //不要忘记关闭fis fis.close(); } }
2.OutputStream
write(int b)
write(byte[] b)
write(byte[] b, int off, int len)
flush()
close()
看下面代码:
向指定目录下的文本文件中写入字节,如果文件不存在则创建该文件再写入
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class TestFIFO { public static void main(String[] args) throws IOException { //定义文件,并且导入File包,import java.io.File;也可以按住Ctrl+Alt+O导包 File file = new File("d:/a.txt"); //定义文件输入流。并且这里需要抛出异常 // 输出流:自己会新建一个文件 // true表示追加 false表示覆盖 默认是false FileOutputStream fos = new FileOutputStream(file,true); //向文件a.txt中写入一个ASCII码为97的字符即a。你可以上D盘根目录下查看一下 fos.write(97);//向文件中写入a fos.write(98);//向文件中追加写入b //冲刷 fos.flush(); //千万不要忘了关闭fos fos.close(); } }
如果用字符数组写入则将fos.write(97);//向文件中写入a
fos.write(98);//向文件中追加写入b
换成
byte[] bt = new byte[10];
//初始化byte数组为:abcdefghij
for(int i=0;i<bt.length;i++){
bt[i] = (byte) (i+97);
}
fos.write(bt);
基本流/低级流/节点流
FileInputStream/FileOutputStream:
上面代码已经介绍。
上述例子只能读入字符和写入字符,如果是汉字,而且每个字符占俩个字节,可想而出,汉字被分成两部分又怎能正确输出呢?
这里引出下面包装流的概念:IO的精华。
基本流中构造中参数是介质。
包装流构造中参数是流。
字符流:Writer/Reader
(1)InputStreamReader/OutputStreamWriter
(2)FileReader/FileWriter
(3)BufferedReader/BufferedWriter
(1)介绍一种字节转换为字符输出的方法InputStreamReader和OutputStreamWriter
看下面一段代码介绍
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class TestIROW { public static void main(String[] args) throws IOException { File file = new File("d:\\b.txt"); //d:/b.txt 存入一些数据例如:中国人 FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis,"gbk");// 字节转字符 // 对于汉字来说,gbk/gb2312占两个字节,utf-8占三个字节。 //读出d:/b.txt中第一个字符 char i = (char)isr.read(); System.out.println(i);//输出结果为:中 FileOutputStream fos = new FileOutputStream(file,true);//true为在原来文本后面追加false为覆盖 OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk"); osw.write("中国");//d:/b.txt中内容为:中国人中国 isr.close(); osw.close(); } }
(2)上面代码还可以用FileReader和FileWriter实现。
FileReader<==>FileInputStream+InputStreamReader
FileWriter<==>FileOutputStream+OutputStreamWriter
两者输出的结果相同但是也有区别:
(1)FileReader只能读入或写默认gbk编码的字符
(2)后者可以读入或写任意指定编码格式的字符如(gbk、gb2312、utf-8)
代码如下:前面导包代码省略了
public class TestIROW { public static void main(String[] args) throws IOException { File file = new File("d:\\b.txt"); //d:/b.txt中先存入中国两个字 // 区别 1.不能指定编码格式,按系统编码格式。2.不能包装其他流 FileWriter fw = new FileWriter(file,true); //可以查看d:/b.txt\r\n为换行,因为上面两行有所以为追加 fw.write("一二三四五\r\n"); fw.write("六七八九十"); fw.close(); // 系统默认编码 FileReader fr = new FileReader(file); char ch = (char) fr.read(); System.out.println(ch); } }
D:/b.txt中结果为:
中国一二三四五
六七八九十
(1).上面代码只能实现一个字节一个字节的读入或写入那么一行一行的读入和写入怎么办呢?下面我们介绍一种实现一行一行读入和写入的BufferedReader/BufferedWriter流
看下面一段代码:
import java.io.*; public class TestBRBW { public static void main(String[] args) throws IOException { File file = new File("d:\\b.txt"); //在d:创建b.txt,在其中先存入中国 FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); String str = null; str = br.readLine(); System.out.println(str);//第一次输出结果:中国 FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); bw.write("一二三四五"); bw.newLine();// 新起一行。输出一个换行符 bw.write("六七八九十"); bw.flush();// 注意冲刷 //注意关闭bw/br bw.close(); br.close(); } }
输出结果为:
一二三四五
其中FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
<==>BufferedReader brr = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
<==>BufferedWriter brr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
未完待续....