Java I/O流

确定流的一般过程:

(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 }
View Code

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 }
View Code

 

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 }  
View Code
 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 }  
View Code
原文地址:https://www.cnblogs.com/joyeehe/p/7870104.html