确定流的一般过程:
(1)是读还是写。读: Reader InputStream 写:Writer OutputStream
(2)是否纯文本。 是: Reader Writer 否:InputStream OutputStream
(3)确定流源:
硬盘:File 内存:ByteArray CharArray 网络:s.getInputStream( ) s.getOutputStream( )
(4)是否要转换流: InputStreamReader OutputStreamWriter
(5)是否要缓冲:BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )
InputStream是接口,抽象方法有:
- int read( ) 功能:读取一个字节放到int的低8位,其余高位填0,返回这个int类型数值。读到输入流末尾返回-1
- int read(byte [ ] b) 功能:读取流填满数组,返回数组b长度;读取流填不满数组,返回读取流本次读取的字节数。读到输入流末尾返回-1
- int read(byte [ ]b,int off,int len) 功能:每次读取的字节存放到off到off+len-1之间的单元,数组读满返回len,读不满返回实际读取的长度。读到输入流末尾返回-1
注意:InputStream读取一个文本(包含汉字和英文),假设系统默认编码是gbk,会把每一个字符的编码拆成两个字节,每个字节放到int的低8位,高位补0,即,一个字符,返回两个整型,两个整型的最低字节拼接在一起,是文本一个字符的gbk或UTF等的二进制编码。
1 import java.io.*; 2 public class TestIO { 3 public static void main(String[] args) throws Exception { 4 FileInputStream fis = new FileInputStream("C:/Users/well/Desktop/IO测试.txt"); 5 int b = 0;/*文本流内容是: 不识庐山真面目只缘身在此山中native */ 6 int count = 0; 7 while((b = fis.read()) != -1) { 8 count++; 9 System.out.print(b + " "); 10 } 11 System.out.println(); 12 System.out.println(count);//统计会输出多少个整型数值 13 } 14 }
OutputStream是接口,抽象方法有:
1 、int write(int b)
功能:将b的最低的一个字节写入此输入流,其他三个字节丢弃。
2、int write(byte[] b)
功能:将指定的字节数组b写入此输入流。
3、int write(byte[] b, int off, int len)
功能:将指定byte数组中从偏移量off开始的len个字节写入输入流。
4、flush()
功能:刷新此输入流并强制写出所有缓冲的输出字节数。
5、close()
功能:关闭输出流,释放这个流的相关资源。
Reader 基本方法:
int read( ); 读一个字符,当流中没有数据可读时,返回值为-1
int read(char[] c); 读取流的字符置于数组中,返回读取字符个数。
Writer基本方法
write(int b); 写一个字符数据
out.write(char[] cbuf) 向流中写字符数组
cbufout.write(String s) 向流中写一个字符串(很实用)
flush() 将缓冲区中数据立即写入到输出流, 刷新缓冲区
out.close() 关闭流
字符流一次处理一个字符,底层仍然是基本的字节序列;字符流操作的是文本文件
写入文件后必须要用flush()刷新
对已有文件续写,new流时增加参数“true”
1 import java.io.*; 2 public class TestIO { 3 public static void main(String[] args) throws Exception { 4 FileWriter fr = new FileWriter("C:/Users/well/Desktop/IO测试.txt"); 5 String str = new String("123456"); 6 char[] ch = new char[10]; 7 ch = str.toCharArray(); 8 fr.write("hello");//写入字符串 9 fr.write(ch);//写入字符数组 10 fr.write(126);//写入单个字符,整数大小必须符合ASCII码 11 fr.flush(); 12 fr.close(); 13 } 14 }
1. 字符流的缓冲区:BufferedReader和BufferedWreiter
* 缓冲区的出现时为了提高流的操作效率而出现的.
* 需要被提高效率的流作为参数传递给缓冲区的构造函数
* 在缓冲区中封装了一个数组,存入数据后一次取出
BufferedReader示例:
读取流缓冲区提供了一个一次读一行的方法readline,方便对文本数据的获取。
readline()只返回回车符前面的字符,不返回回车符。如果是复制的话,必须加入newLine(),写入回车符newLine()是java提供的多平台换行符写入方法。
1 class BufferedReaderDemo { 2 public static void main(String[] args) throws IOException { 3 4 //创建一个字符读取流流对象,和文件关联 5 FileReader rw = new FileReader("buf.txt"); 6 7 //只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可 8 BufferedReader brw = new BufferedReader(rw); 9 10 11 for(;;) { 12 String s = brw.readLine(); 13 if(s==null) break; 14 System.out.println(s); 15 } 16 17 brw.close();//关闭输入流对象 18 19 } 20 }
1 class BufferedWriterDemo { 2 public static void main(String[] args) throws IOException { 3 4 //创建一个字符写入流对象 5 FileWriter fw = new FileWriter("buf.txt"); 6 7 //为了提高字符写入效率,加入了缓冲技术。 8 //只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可 9 BufferedWriter bfw = new BufferedWriter(fw); 10 11 //bfw.write("abc de"); 12 //bfw.newLine(); 这行代码等价于bfw.write(" "),相当于一个跨平台的换行符 13 //用到缓冲区就必须要刷新 14 for(int x = 1; x < 5; x++) { 15 bfw.write("abc"); 16 bfw.newLine(); //java提供了一个跨平台的换行符newLine(); 17 bfw.flush(); 18 } 19 20 21 22 bfw.flush(); //刷新缓冲区 23 bfw.close(); //关闭缓冲区,但是必须要先刷新 24 25 //注意,关闭缓冲区就是在关闭缓冲中的流对象 26 fw.close(); //关闭输入流对象 27 28 } 29 }