黑马程序员-IO流 02

来源:互联网 发布:python工厂模式 编辑:程序博客网 时间:2024/06/05 12:03
----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

字节流:可以操作任意文件 * 字节输出流抽象基类 OutputStream * 字节输入流的抽象基类 InputStream FileInputStream类,读取文件
import java.io.*;public class FileInputStreamDemo {   public static void main(String[] args)throws IOException {      //FileInputStream(String name)       FileInputStream fis = new FileInputStream("c:\\stream.txt");      int length = 0 ;      //定义字节数组进行缓冲      byte[] buf = new byte[30];      while((length = fis.read(buf))!=-1){    System.out.println(new String(buf,0,length));      }      fis.close();   }}


1.字节流File读写操作
练习:标准的复制一个图片,带有异常处理
/* 复制一个图片 思路: 1,用字节读取流对象和图片关联。 2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。 3,通过循环读写,完成数据的存储。 4,关闭资源。 */  import java.io.*;  class CopyPic  {           public static void main(String[] args)  {                     FileOutputStream fos = null;                     FileInputStream fis = null;                     try  {                              fos= new FileOutputStream("c:\\2.bmp");                              fis= new FileInputStream("c:\\1.bmp");                                 byte[] buf = new byte[1024];                                 int len = 0;                              while((len=fis.read(buf))!=-1) {                                       fos.write(buf,0,len);                              }                     }                     catch(IOException e)  {                             throw new RuntimeException("复制文件失败");                     }                     finally {                              try {                                       if(fis!=null)                                                 fis.close();                              }                              catch(IOException e) {                                       throw new RuntimeException("读取关闭失败");                              }                              try  {                                       if(fos!=null)                                                 fos.close();                              }                              catch(IOException e)  {                                       throw new RuntimeException("写入关闭失败");                              }                     }           }  }  



练习:自定义一个字节流缓冲区BufferedInputStream
class import java.io.*;   class MyBufferedInputStream  {         private InputStream in;              private byte[] buf = new byte[1024*4];                               private int pos = 0,count = 0;                     MyBufferedInputStream(InputStream in){  //将in传入 装饰一下                   this.in= in;           }              //一次读一个字节,从缓冲区(字节数组)获取。           publicint myRead()throws IOException   {                                       if(count==0)  {                              count= in.read(buf);  //通过in读取硬盘上数据 存储buf中。                            if(count<0)                                       return -1;                              pos= 0;                              byte b = buf[pos];                                 count--;                              pos++;                              return b&255;                     }                    else if(count>0)  {                              byte b = buf[pos];                                 count--;                              pos++;                              return b&0xff;                     }                     return -1;           }           publicvoid myClose()throws IOException  {                     in.close();           }  }  /* 结论: 字节流的读一个字节的read方法为什么返回值类型不是byte,而是int。     因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1. 那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。     所以,为了避免这种情况将读到的字节进行int类型的提升。     并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。  而在写入数据时,只写该int类型数据的最低8位。 */


2.键盘录入及转换流
System.out:对应的是标准输出设备,控制台。
System.in:对应的标准输入设备:键盘。
 
字符流:
FileReader
FileWriter
 
BufferedReader
BufferedWriter
 
字节流:
FileInputStream
FileOutputStream
 
BufferedInputStream
BufferedOutputStream
 
字节转成字符的转换流
InputStreamReader
OutputStreamWriter
练习:利用转换流,及BufferedReaderreadLine方法读取键盘操作
 
/* readLine方法是字符流BufferedReader类中的方法。  而键盘录入的read方法是字节流InputStream的方法。   那么能不能将字节流转成字符流在使用字符流缓冲去的readLine方法呢? */  import java.io.*;  class TransStreamDemo  {           public static void main(String[] args) throws IOException  {                     //获取键盘录入对象。                     //InputStream in = System.in;                        //将字节流对象转成字符流对象,使用转换流。InputStreamReader                     //InputStreamReader isr = new InputStreamReader(in);                        //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader                     //BufferedReader bufr = new BufferedReader(isr);                     //键盘的最常见写法。  上面三句话变一句*************       BufferedReader bufr = newBufferedReader(new InputStreamReader(System.in));        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));                        String line = null;                     while((line=bufr.readLine())!=null) {                              if("over".equals(line))                                       break;                              bufw.write(line.toUpperCase());                              bufw.newLine();                              bufw.flush();                     }                     bufr.close();             }  }  


IO流操作规律
当我们确定要使用IO流对象的时候,什么时候选择哪一个流对象呢
    Writer Reader InputStream OutputStream
    FileWriter FileReader
    FileInputStream  FileOutputStream
    BufferedWriter BufferedReader
    BufferedInputStream BufferedOutputStream
    InputStreamReader OutputStreamWriter 
      FileWriter写出操作       
      FileOutputStream写出操作
   
 *  选择流对象的时候,首先确定操作数据源是什么
        1. 文本
          FileReader读取操作
          需要高效吗? 需要的话 BufferedReader 读一行
        2. 非文本
          FileInputStream  读取操作
          需要高效吗?需要的话BufferedInputStream  最好自己写数组
          
      3. 是控制台或者是另一个主机
         字节流  InputStream
         如果确定是文本信息,转换流InputStreamReader,转成字符流,方便操作
         
         如果不能确定是不是文本信息  决对不可以使用转换流,只能用字节流名,读取操作
        
 *  再次确定操作的数据目的是什么
      1. 文本
        FileWriter写出操作     
        需要高效吗? 需要的话 BufferedWriter 写一行
      2. 非文本
        FileOutputStream写出操作
        需要高效吗?需要的话BufferedOutputStream  最好自己写数组
        
      3. 控制台或者是另一个主机
        字节流 OutputStream
        如果确定是文本信息,转换流OutputStreamWriter,字符转成字节,方便操作
        如果不确定是不是文本信息 只能字节流输出
       
 *  使用规律:
        当我们无法确定数据源和数据目的,只能字节流
        例如:点对点通信,服务器和客户端的通信
----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

 
0 0
原创粉丝点击