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的输出流。

代码演示

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 = "\r\n"[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="\r\n"+"你好";

                             //写入一个字节数组

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

         }   

 

}

 

 

设置给指定文件续写数据

实现换行

猜你喜欢

转载自www.cnblogs.com/layuechuquwan/p/11457455.html