一、Java中流的原理
流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。
四种基本流InputStream,OutputStream,Reader,Writer又分别有更具体的子类,分为文件流,缓冲流,数据流,转换流,Print流,Object流等,都分别有特定的功能或用来操作特定的数据。
二、字节流
2.1 InputStream
继承自InputStream的流用于向程序中输入数据,且数据的单位是8bit。
代码示例:
1 public static void main(String[] args) throws IOException{ 2 3 File f=new File("f:\a.txt"); 4 if(f.exists()){ 5 System.out.println("文件存在"); 6 }else{ 7 f.createNewFile();//用于创建文件 8 //f.setReadOnly(); 9 System.out.println(f.getName()+"文件是否可读:"+f.canRead()); 10 System.out.println(f.getName()+"文件是否可写:"+f.canWrite()); 11 } 12 13 InputStream in=new FileInputStream(f); 14 int data=in.read(); 15 while(data!=-1) 16 { 17 char e = (char)data; 18 System.out.print(e + " "); 19 data = in.read(); 20 } 21 22 }
read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区),然后再处理数组里面的数据。
2.2、OutputStream
OutputStream和InputStream相对应为字节输出流,用于向外部设备例如文件中写数据
代码示例:
1 File f=new File("f:\a.txt"); 2 if(f.exists()){ 3 System.out.println("文件存在"); 4 }else{ 5 f.createNewFile();//用于创建文件 6 //f.setReadOnly(); 7 System.out.println(f.getName()+"文件是否可读:"+f.canRead()); 8 System.out.println(f.getName()+"文件是否可写:"+f.canWrite()); 9 } 10 11 OutputStream out=new FileOutputStream(f); 12 String str="Hello world!"; 13 byte[] b=str.getBytes(); 14 out.write(b); 15 out.flush(); 16 out.close();
write(byte[] b):将 b.length
个字节从指定的 byte 数组写入此输出流。
write(byte[] b, int off, int len):将指定 byte 数组中从偏移量 off
开始的 len
个字节写入此输出流。
write(int b):将指定的字节写入此输出流,b为ascll码。
2.3、字节缓冲流
三、字符流
字节流和字符流的区别就是读取方式一个为按字节读取,一个是按字符读取。在读取文件想对文件内容进行处理,比如修改某一行的时候一般使用字符流,二仅仅是读取文件一般使用字节流。
3.1、Reader流和writer流
代码示例:
1 import java.io.File; 2 import java.io.FileReader; 3 import java.io.FileWriter; 4 import java.io.IOException; 5 6 public class wr { 7 8 public static void main(String[] args) throws IOException{ 9 File f=new File("f:\a.txt"); 10 if(f.exists()){ 11 System.out.println("文件存在"); 12 }else{ 13 f.createNewFile();//用于创建文件 14 //f.setReadOnly(); 15 System.out.println(f.getName()+"文件是否可读:"+f.canRead()); 16 System.out.println(f.getName()+"文件是否可写:"+f.canWrite()); 17 } 18 19 FileWriter fw = new FileWriter(f); 20 String str="asdw"; 21 fw.write(str);//向文件中写入asdw 22 fw.write(str,0,2);//向文件中写入as 23 char c='a'; 24 fw.write(c);//向文件中写入a 25 fw.flush();//使用字符流必须要对缓存进行刷新才能向文件中写入内容 26 fw.close();//调用close()函数时自动对缓存进行刷新 27 //注意,OutputStream中还有append()方法可以对文件内容进行追加输出,详见Java API。 28 29 FileReader fr = new FileReader(f); 30 int b=0,num=0; 31 while((b = fr.read())!= -1){ 32 System.out.print((char)b ); 33 num++; 34 } 35 System.out.println("输出了"+num+"个字符!"); 36 } 37 38 }
3.2 字符缓冲流
带有缓冲区的,缓冲区(Buffer)就是内存里面的一小块区域,读写数据时都是先把数据放到这块缓冲区域里面,最后对缓冲区内容统一操作,减少io对硬盘的访问次数,保护我们的硬盘。
-BufferedWriter bw = new BufferedWriteer(fw);
-BufferedReader br = new BufferedReader(fr);
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.File; 4 import java.io.FileReader; 5 import java.io.FileWriter; 6 7 public class Buffertry { 8 9 public static void main(String args[]){ 10 11 try{ 12 File f=new File("f:\a.txt"); 13 if(f.exists()){ 14 System.out.println("文件存在"); 15 }else{ 16 f.createNewFile();//用于创建文件 17 //f.setReadOnly(); 18 System.out.println(f.getName()+"文件是否可读:"+f.canRead()); 19 System.out.println(f.getName()+"文件是否可写:"+f.canWrite()); 20 } 21 22 BufferedWriter bw = new BufferedWriter(new FileWriter(f)); 23 String s = null; 24 for(int i=0;i<100;i++){ 25 s = String.valueOf(Math.random());//“Math.random()”将会生成一系列介于0~1之间的随机数。 26 bw.write(s); 27 bw.newLine();//调用newLine()方法使得每写入一个随机数就换行显示 28 } 29 bw.flush();//调用flush()方法清空缓冲区 30 31 BufferedReader br = new BufferedReader(new FileReader(f)); 32 while((s = br.readLine())!=null){ 33 //使用BufferedReader处理流里面提供String readLine()方法读取文件中的数据时是一行一行读取的 34 System.out.println(s); 35 } 36 bw.close(); 37 br.close(); 38 }catch(Exception e){ 39 e.printStackTrace(); 40 } 41 } 42 }
3.3、转换流
字节输入流转换为字符输入流:InputStreamReader是字节流转化为字符流的桥梁,它将字节去出并且按照指定方式解码为字符,构造方法为
InputStreamReader(InputStream in);//详见Java API
字节输出流转换为字符输出流:OutputStreamWriter继承自Writer,可以将指定写入流中的字符编码为字节
OutputStreamWriter(OutputStream out);//详见Java API
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 5 public class changetry { 6 7 public static void main(String[] args) throws IOException{ 8 9 InputStreamReader isr=new InputStreamReader(System.in); 10 BufferedReader br = new BufferedReader(isr); 11 System.out.println("请输入:"); 12 String str=br.readLine(); 13 System.out.println("输入内容:"+str); 14 15 } 16 17 }
1 File f=new File("f:\a.txt"); 2 FileOutputStream fos = new FileOutputStream(f); 3 OutputStreamWriter os = new OutputStreamWriter(fos); 4 BufferedWriter bos = new BufferedWriter(os); 5 bos.write("hahahaha"); 6 bos.close(); 7 os.close(); 8 fos.close();