zoukankan      html  css  js  c++  java
  • io流--字节流-字符流

    返回值readerline 返回值是String,得用String来接

    掉什么方法就用什么来接

    程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

    操作流程

    在Java中IO操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:

    1. 使用File类打开一个文件
    2. 通过字节流或字符流的子类,指定输出的位置
    3. 进行读/写操作
    4. 关闭输入/输出

    IO操作属于资源操作,一定要记得关

    字节流

    FileInputStream 从文件系统中的某个文件中获得输入字节。

    FileOutputStream可用来写入数据到文件

    字节输出流OutputStream  :以Stream结尾的就是字节流

    字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream

    OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。

    此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:FileOutputStream类。通过向上转型之后,可以为OutputStream实例化

    FileOutputStream类

    OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。

    FileOutputStream类,即文件输出流,是用于将数据写入 File的输出流。

     输出流中定义都是写write方法

    代码演示

    package com.oracle.demo01;
    
    import java.io.FileNotFoundException;
    
    import java.io.FileOutputStream;
    
    import java.io.IOException;
    
    public class Demo01 {
    
                  public static void main(String[] args) throws IOException {
    
                                //文件输出流
    
                                //如果指定文件不存在,则创建
    
                                //如果指定文件存在则覆盖
    
                                FileOutputStream fos=new FileOutputStream("D:\demo06\o.txt",true);//添加true进行续写。,默认是false不进行续写,内容将会被覆盖
    
                                //写入方法一。----向文件中单个字节写入
    
                         //调用父类中的write方法。
    
                                fos.write(100);//走阿斯克码表,对应值d
    
                                //写入方法二-------向文件中写入字节数组
    
                                byte[]  by={66,67,68,69};//
    
                      //调用父类中的write方法。
    
                                fos.write(by);
    
                                byte[]  bys={-66,-67,-68,-69};///////
    
                                fos.write(bys,1,2);//从下标1开始写入两个
    
                                //释放资源
    
                                fos.close();
    
                  }            
    
    }

    文件的续写和换行:

     

    续写:在构造方法中,如果将append的值设置为true,则表示在文件的末尾追加内容。则表示在文件的末尾追加内容。默认值为false,内容将会被覆盖

    l   给文件中续写数据和换行,代码演示:

    publicclass FileOutputStreamDemo2 {
    
           publicstaticvoid main(String[] args) throws Exception {
    
                  File file = new File("c:\file.txt");
    
    //
    
                  FileOutputStream fos = new FileOutputStream(file, true);[L1] 设置给指定文件续写数据
    
                  String str = "
    "[L2] +"aaa";实现换行
    
                  fos.write(str.getBytes());
    
                  fos.close();
    
           }
    
    }
    
     

    Io的异常处理

    package com.oracle.demo01;
    
    import java.io.FileNotFoundException;
    
    import java.io.FileOutputStream;
    
    import java.io.IOException;
    
    public class demo02 {
    
     public static void main(String[] args) {
    
                    //明确目的地
    
                   FileOutputStream fos=null;
    
                  try {
    
                                fos = new FileOutputStream("D:\demo0611\o.txt",true);//true开启续写功能
    
                                 String str="
    "+"你好";
    
                                 //写入一个字节数组
    
                                 fos.write(str.getBytes());
    
                  } catch (FileNotFoundException e) {
    
                                // TODO Auto-generated catch block
    
                                e.printStackTrace();
    
                  } catch (IOException e) {
    
                                // TODO Auto-generated catch block
    
                                e.printStackTrace();
    
                  }finally{
    
              //释放资源      
    
    //一定要判断fos是否为null,只有不为null时,才可以关闭资源
    
     
    
                                if(fos!=null){
    
                   try {
    
                                fos.close();
    
                  } catch (IOException e) {
    
                                // TODO Auto-generated catch block
    
                                e.printStackTrace();
    
                  }
    
                  }
    
                                }
    
     
    
                 
    
                   
    
    }
    
    }

    字节输入流InputStream

    。InputStream此抽象类,是表示字节输入流的所有类的超类。

    InputStream有很多子类,其中子类FileInputStream可用来读取文件内容。

    FileInputStream 从文件系统中的某个文件中获得输入字节。

    l    read():返回值为int,读取一个字节并返回,没有字节返回-1.

    l   read(byte[]):返回值为int, 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。

    代码展示

      

     public static void main(String[] args) throws IOException {
    
            //明确数据源(从那里读,不需要创建)
    
            FileInputStream fis=new FileInputStream ("D:\demo0611\o.txt");
    
    //单个读出字节读取文件
    
            int  len =0;
    
            while ((len=fis.read())!=-1){
    
        System.out.println((char)len); //因为len是int数值需要强转成char字符,也安装阿克斯码表的数值转的字符,
    
        }
    
            //释放资源
    
            fis.close();
    
        }
    
    }

    字节数组读出

       

    public static void main(String[] args) throws IOException {
    
            // 明确数据源(明确数据源)
    
            FileInputStream fis=new FileInputStream ("D:\demo0611\o.txt");
    
            byte[]  bytes=new byte[1024];//1024
    
            //一个字节一个字节数组读取
    
            int len =0;
    
            while((len=fis.read(bytes))!=-1){
    
            //将字节数组转换为字符串打印
    
            System.out.println(new String(bytes,0,len));
    
                 // 这里是把bytes数组转成了String字符打印;(bytes,0,len)这里的0是从数组下标0开始打印长度是len也就是传的字符个数,这样        就避免了重复打印最后一个字符的问题
    
            }
    
           
    
            fis.close();
    
        }
    
     
    
    }

     

    复制文件—字节

    过程:

    1. 获取目的地文件  FileInputStream进行读取  .read()
    2. 复制的目的文件   FileOutputStream进行写入 .write()

    //单个字节数组复制文件

        

      public static void get() throws IOException {
    
                  // 获取数据来源
    
         FileInputStream fis= new FileInputStream("D:\demo0611\cc.wmv");
    
         //获取复制的目的地
    
         FileOutputStream fos=new FileOutputStream("D:\demo0611\a\cc.wmv");
    
         //建立数组
    
         byte[]  by=new byte[1024];
    
         int len=0;
    
         long time =System.currentTimeMillis();
    
         while((len=fis.read(by))!=-1 ){
    
             fos.write(by,0,len);
    
         }
    
         long time2=System.currentTimeMillis();
    
         fis.close();
    
         fos.close();
    
         System.out.println(time2-time); //3592//
    
                                           
    
           }

         //单个字符复制文件

     

         public static void getone() throws IOException{
    
                  //获取数据来源
    
                  // 获取数据来源
    
                FileInputStream fis= new FileInputStream("D:\demo0611\cc.wmv");
    
                //获取复制的目的地
    
                FileOutputStream fos=new FileOutputStream("D:\demo0611\a\cc.wmv");
    
     //单个字节复制文件按
    
     
    
                int len=0;
    
                long time =System.currentTimeMillis();
    
                while((len=fis.read())!=-1 )
    
                {
    
                    fos.write(len);
    
                }
    
                long time2=System.currentTimeMillis();
    
                fis.close();
    
                fos.close();
    
                System.out.println(time2-time);  //1984605
    
           }
    
     
    
    非文本传输用字节流(如zip,jpg,视频等文件)
    (一帮传的是看不懂的文件如java的class文件);文本文件传输用字符流(如:word,txt)
    (一般是可以看懂的文件)

    字符流

    字符输入流Reader

    以Reader结尾的就是字符流

    ,Reader,读取字符流的抽象超类。

    l   read():返回值是int,读取单个字符并返回

    l   read(char[]):返回值是int,将数据读取到数组中,并返回读取的个数。

    使用FileReader读取包含中文的文件

     

        

    public static void main(String[] args) throws IOException {
    
             // 明确数据源
    
               FileReader  fr=new  FileReader("D:\demo0611\o.txt");
    
               //读单个字符
    
                int len=0;
    
           while((len=fr.read())!=-1){
    
           System.out.print((char)len);
    
           }
    
               //释放资源
    
               fr.close();
    
         }

     

    单个字符数组读取

    package com.oracle.demo02;
    
    import java.io.FileNotFoundException;
    
    import java.io.FileReader;
    
    import java.io.IOException;
    
    public class demo02 {
    
             public static void main(String[] args) throws IOException {
    
                       // 明确目的地
    
                       FileReader  fr=new FileReader("D:\demo0611\o.txt");
    
                       //建立数组
    
                       char[] ch=new char[1024];
    
                       //
    
                       int len=0;
    
                       while ((len=fr.read(ch))!=-1)
    
                                System.out.println(new String(ch,0,len));
    
                       }
    
                       //释放资源
    
                       fr.close();
    
                      
    
             }
    
     
    
    }

    字符输出流Writer

    package com.oracle.demo02;
    
     
    
    import java.io.FileWriter;
    
    import java.io.IOException;
    
     
    
    public class demo03 {
    
     
    
             public static void main(String[] args) throws IOException {
    
                       //明确目的地
    
                       FileWriter fw=new FileWriter("D:\demo0611\utf8.txt",true);//开启续写功能加true
    
                       //写入一个字符
    
                       fw.write(100);
    
                       //字符流需要刷一下,才能显示字符
    
                       fw.flush();
    
                       //写入一个数组
    
    /*              char[] ch={'窝','窝','头','1','块','钱','四','个'};
    
                       fw.write(ch,0,8);//指定插入的数组
    
                       fw.flush();
    
                       //写入一个字符串
    
    */              fw.write("窝窝头。你好");
    
                       //释放资源
    
              fw.close();
    
             }
    
     
    
    }   

    字符流需要flush刷新一下才会出现复制内容

    flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。

    close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。

    字符复制文件

    1. 单个字符复制
    2. 字符数组复制

    单个字符复制

     

       public static void main(String[] args) throws IOException {
    
    // 明确目的地
    
        FileWriter fw=new FileWriter("D:\demo0611\a\u.txt");
    
        //明确数据源
    
        FileReader  fr=new    FileReader("D:\demo0611\o.txt");
    
        int len=0;
    
        while((len=fr.read())!=-1){
    
               fw.write(len);
    
               fw.flush();
    
           }
    
        //释放资源
    
        fw.close();
    
        fr.close();
    
     
    
    }
    
    字符数组复制
    
    package com.oracle.demo02;
    
     
    
    import java.io.FileReader;
    
    import java.io.FileWriter;
    
    import java.io.IOException;
    
     
    
    public class demo05 {
    
     
    
             public static void main(String[] args) throws IOException {
    
                       //明确目的地
    
                       FileWriter fw=new FileWriter("D:\demo0611\a\p.txt");
    
             //明确数据源
    
                       FileReader fr=new FileReader("D:\demo0611\o.txt");
    
                       //数组
    
                       char[]  ch=new char[1024];
    
                       int  len=0;
    
                       while((len=fr.read(ch))!=-1){
    
                                fw.write(ch,0,len);
    
                                fw.flush();
    
                       }
    
                       //释放资源
    
                       fw.close();
    
                       fr.close();
    
             }   
    
     
    
    }
    
     
    
     

    设置给指定文件续写数据

    实现换行

  • 相关阅读:
    删除指定目录下的文件及子文件
    PHP简单实现“相关文章推荐”功能的方法(此方法不是自创)
    微信开发中自动回复(扫码、关注推事件)
    方式三(API方式)C++手动加载CLR运行托管程序(CLR Hosting)
    分享 N种方法使用C++调用C#.NET库
    redis 持久化之 RDB & AOF
    redis 慢查询、Pipeline
    redis 发布订阅、geo、bitmap、hyperloglog
    redis5.0 数据结构与命令
    Linux 下安装 redis5.0
  • 原文地址:https://www.cnblogs.com/layuechuquwan/p/11457455.html
Copyright © 2011-2022 走看看