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();
    
             }   
    
     
    
    }
    
     
    
     

    设置给指定文件续写数据

    实现换行

  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/layuechuquwan/p/11457455.html
Copyright © 2011-2022 走看看