常用IO流的使用方式

 常用IO流这里指的是用于对文件的读取操作的IO流,IO流分类两大类,分别是字节流和字符流,字节流相关类用于处理字节相关文件,比如视频、音频、图片、格式化文件等。字符流相关类用于处理字符相关文件,比如.txt之类的文件没有格式的文件。

这里写图片描述
一、常用字符流
Reader:字符输入流,是一个抽象类其子类必须实现read(char[], int, int)和close()方法
BufferedReader:从字符输入流中读取文本,缓冲字符以便提供对字符、数组和行的有效读取。可以指定缓冲区的大小也可以使用默认大小(足够了)
CharArrayReader:源是字符的字符输入流。
StringReader:源是字符串的字符流。
InputStreamReader:字节输入流到字符输入流的桥梁,并使用指定的字符集将字节解码为字符。
可以在BufferedReader中包装一个InputStreamReader来提高字节的读取效率。
构造方法:
InputStreamReader(InputStream in):实用默认字符集创建“字节-字符”对象
InputStreamReader(InputStream in, Charset cs):使用给定的字符继创建“字节-字符”对象
InputStreamReader(InputStream in, CharsetDecoder dec):创建一个使用给定字符集解码器的InputStreamReader。
InputStreamReader(InputStream in, String charsetName):创建一个使用名为charsetName的InputStreamReader。
常用方法:
String getEncoding():返回该流的字符编码名称
int read():读取单一字符。
int read(char[] cbuf, int offset, int length):将字符读入数组的一部分。
boolean ready():是否准备好开始读取字符。
void close():关闭流。
InputStreamReader子类:
FileReader:用来读取字符输入流文件的

Writer:字符输出流
BufferedWriter:文本写入字符输出流,缓冲字符。提供单个字符、数组和字符串的高效写入
CharArrayWriter:字符缓冲输出流,用于写入字符数据。可以用户toCharArray()和toString()方法来检索数据。
OutputStreamWriter:字符输出流到字节输出流的桥梁,用指定的字符集将字符编码成字节。为了达到最高效率,
可以在BufferedWriter中包装一个OutputStreamWriter来提高字符转换成字节的效率。
构造方法:
OutputStreamWriter(OutputStream out):使用默认字符集编码创建OutputStreamWriter
OutputStreamWriter(OutputStream out, Charset cs):使用指定字符集编码创建OutputStreamWriter
OutputStreamWriter(OutputStream out, CharsetEncoder enc):使用指定编码器创建OutputStreamWriter
OutputStreamWriter(OutputStream out, String charsetName):使用命名字符集来创建OutputStreamWriter
常用方法:
void close():在刷新流之前关闭流。
void flush():刷新流
String getEncoding():获取字符集的编码
void write(char[] cbuf, int off, int len):写入字符数组的一部分。
void write(int c):写入单个字符
void write(String str, int off, int len):写入字符串的一部分。
OutputStreamWriter的子类:
FileWriter:用来写入字符输出流到指定文件

二、常用字节流
InputStream:字节输入流
BufferedInputStream:缓存字节输入流,能够对输入流中的字节进行缓冲。提供了标记方法mark()和重置方法reset(),当BufferedInputStream
被创建时内部缓冲区即被创建,默认缓存区大小是8M。
ByteArrayInputStream:以字节数组保存数据,包含一个内部缓冲区,可以从流中读取的字节。内部计数器为read()方法提供需要跟踪的下一个字节。
FileInputStream:从文件系统中获取文件的输入字节流,
OutputStream:字节输出流
BufferedOutputStream:缓冲字节输出流,可以将字节写入底层的输出流。
ByteArrayOutputStream:以字节数组保存数据,缓冲字节输出流,数据被写入一个字节数组,当数据写入时,缓冲区会自动增长。使用toByteArray()和toString()来检索数据。
FileOutputStream:文件输出流,是将字节流写入文件或者文件描述当中

三、常用文件处理流
File:文件和目录路径名的抽象类
FileInputStream:从文件系统中获取文件的输入字节流。
FileReader:用来读取字符输入流文件的
FileOutputStream:文件输出流,是将字节流写入文件或者文件描述当中
FileWriter:用来写入字符输出流到指定文件
Files:最终类,只包含对文件、目录或其他类型文件进行操作的静态方法


BufferedInputStream、BufferedOutputStream、FileInputStream、FileOutputStream的使用代码示例

package com.wangxiaofei.io;
import static org.junit.Assert.*;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.junit.Test;
public class BufferedInputStreamTest {
    private static final String FILE_PATH="D:/Workspaces/MyEclipse Professional 2014/JAVASECode/src/com/wangxiaofei/io/";
    @Test
    public void test() throws IOException {
        //声明字节流
        FileInputStream fis=null;
        FileOutputStream fos=null;
        //声明字节缓冲流
        BufferedInputStream bis=null;
        BufferedOutputStream bos=null;
        //声明文件
        File file=null;
        try {
          //读取源文件
          fis=new FileInputStream(FILE_PATH+"Faded.mp3");
          //写入文件
          file=new File(FILE_PATH+"out-faded.mp3");
          if(!file.exists()){
              file.createNewFile();
          }
          fos=new FileOutputStream(file);
          //创建字节输入输出缓冲流对象
          bis=new BufferedInputStream(fis);
          bos=new BufferedOutputStream(fos);
          //每次读取写入字节的大小
          byte[] bys=new byte[1024];
          int len=0;
          try {
            long start=System.currentTimeMillis();
            while((len=bis.read(bys))!=-1){
               bos.write(bys, 0, len);
            }
            long end=System.currentTimeMillis();
            System.out.println("总耗时:"+(end-start));
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            System.out.println("找不到文件");
            e.printStackTrace();
        }finally{
            if(null!=bis) bis.close();
            if(null!=bos) bos.close();
        }   
    }
}

BufferedReader、BufferedWriter、FileReader、FileWriter代码示例如下:

package com.wangxiaofei.io;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.junit.Test;
public class BufferedWriterTest {
    /**
     * BufferedWriter:字符输出缓冲流,搞效地将字符、字符数组、字符串写入文本
     * 构造方法:
     * BufferedWriter(Writer writer):创建一个字符输出缓冲流,使用默认大小缓冲区。
     * BufferedWriter(Writer writer,int size):创建一个字符输出缓冲流,指定缓冲区的大小。
     * 常用方法:
     * void close():关闭流。
     * void flush():刷新流。
     * void newLine():写入一行分隔符(换行)
     * void write(char[] cbuf, int off, int len):从字符数组写入一部分字符,off-从哪里开始,len-需要几个。
     * void write(int c):写入单个字符。
     * void write(String s, int off, int len):从字符串中写入一部分字符,off-从哪里开始,len-需要几个。
     * @throws IOException 
     */
    //任务1:将字符、字符数组的一部分、字符串的一部分写入test.txt文件中 
    @Test
    public void test1() throws IOException {
        char c='t';
        char[] charArray={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','k','r','s','t','u','v','w','x','y','z'};
        String str="ABCDEFGHIJKLMNOPQRSTUVWSYZ";
        //创建一个文件对象,用于输出。
        File file=new File("D:/Workspaces/MyEclipse Professional 2014/JAVASECode/src/com/wangxiaofei/io/test.txt");
        //判断该文件是否存在,不存在则创建
        if(!file.exists()){
            file.createNewFile();
        }
        //创建文件字符输出流对象
        FileWriter fw=new FileWriter(file);
        //创建字符输出流的缓冲对象
        BufferedWriter bw=new BufferedWriter(fw);
        //将字符、字符数组的一部分、字符串的一部分写入test.txt文件中 
        bw.write(c);
        bw.flush();
        bw.newLine();//换行
        bw.write(charArray, 0, 5);
        bw.flush();
        bw.newLine();//换行
        bw.write(str, 5, 10);
        bw.flush();
        bw.newLine();//换行
        bw.close();
    }

    //任务2:将note.txt的内容写入到test.txt中
    @Test
    public void test2() throws Exception{
      //创建文件对象
      File sourceFile=new File("D:/Workspaces/MyEclipse Professional 2014/JAVASECode/src/com/wangxiaofei/io/note.txt");
      if(!sourceFile.exists()) throw new Exception("源文件不存在");
      //创建字符缓冲输入流
      //BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile)))
      BufferedReader br=new BufferedReader(new FileReader(sourceFile));
      //创建目标文件
      File destinationFile=new File("D:/Workspaces/MyEclipse Professional 2014/JAVASECode/src/com/wangxiaofei/io/test.txt");
      if(!destinationFile.exists()){
          destinationFile.createNewFile();
      }
      //创建字符缓冲输出流
      BufferedWriter bw=new BufferedWriter(new FileWriter(destinationFile));
      String str=null;
      //将源文件的内容写入到目标文件中
      while((str=br.readLine())!=null){
          bw.write(str);
          bw.newLine();
          bw.flush();
      }
      br.close();
      bw.close();
    }
}

ByteArrayInputStream代码示例如下:

package com.wangxiaofei.io;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import org.junit.Test;
public class ByteArrayInputStreamTest {
    // 对应英文字母“abcddefghijklmnopqrsttuvwxyz”
    private static final byte[] byteArray={
        0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
        0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
    };
    /**
     * ByteArrayInputStream:字节缓冲输入流
     * @throws Exception 
     */
    @Test
    public void test() throws Exception {
        //创建ByteArrayInputStream对象
        ByteArrayInputStream bais=new ByteArrayInputStream(byteArray);
        //在字节数组流中读取5个字节,并以字符串的形式输出。
        for(int i=0;i<5;i++){
            //是否可读
            if(bais.available()>0){
                System.out.println("第"+i+"个字节:"+(char)bais.read());
            }
        }
        //判断是否有标记功能,没有则上报异常。
        if(!bais.markSupported()) throw new Exception("ByteArrayInputStream标记功能不可用");
        bais.mark(0);
        //跳过5个字节后再往后读取5个字节,以字符的形式输出
        bais.skip(5);
        byte[] temArray=new byte[5];
        bais.read(temArray, 0, 5);//从当前位置开始读取,读取长度为5
        for(byte bys:temArray){
            System.out.print((char)bys+" ");
        }
        System.out.println();
        //重置后输出标记位置上的后5个字节,以字符的形式输出。
        bais.reset();
        bais.read(temArray, 0, 5);
        for(byte bys:temArray){
            System.out.print((char)bys+" ");
        }
    }
}

ByteArrayOutputStream示例代码如下:

package com.wangxiaofei.io;
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import org.junit.Test;
public class ByteArrayOutputStreamTest {
    @Test
    public void test() {
      ByteArrayOutputStream bios=new ByteArrayOutputStream();
      //写入字节数据
      for(int i=0;i<5;i++){
          bios.write(101+i);
      }
      //转换字节数组
      byte[] bys=bios.toByteArray();
      for(byte b:bys){
          System.out.println((char)b);
      }
    }
}

CharArrayReader代码示例如下:

package com.wangxiaofei.io;
import static org.junit.Assert.*;
import java.io.CharArrayReader;
import java.io.IOException;
import org.junit.Test;
public class CharArrayReaderTest {
    //定义字符数组
    private static final char[] arr={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','k','r','s','t','u','v','w','x','y','z'};
    @Test
    public void test() throws IOException {
        //1、创建字符缓冲输入流
        CharArrayReader car=new CharArrayReader(arr);
        //2、读取5个字符
        for(int i=0;i<5;i++){
            //是否开始读取
            if(car.ready()){
                //是否支持标记功能
              if(!car.markSupported()){
                  return;
              }else{
                  //需要进行强转
                  char temp=(char)car.read();
                  System.out.println("第"+(i+1)+"个字符:"+temp);
              } 
            }
        }
        //3、标记已经读取的位置
        car.mark(0);//下一次读取字符从f字符开始
        //4、跳过5个字符后读取后5个字符的串
        car.skip(5);//下一个字符从K位置开始读
        char[] char5=new char[5];
        car.read(char5, 0, 5);
        //String.valueOf(char[] c):将字符数组转换为字符串值
        System.out.println("继跳过5个字符后读取的字符为:"+String.valueOf(char5));
        //5、重置字符流,到被标记的位置,继续读取5个字符
        car.reset();
        char[] makerlast=new char[5];
        car.read(makerlast, 0, 5);
        System.out.println("从标记开始读5个字符:"+String.valueOf(makerlast));
        //关闭流
        car.close();
    }
}

CharArrayWriter示例代码如下:

package com.wangxiaofei.io;
import java.io.CharArrayWriter;
import java.io.IOException;
import org.junit.Test;
public class CharArrayWriterTest {
    //定义字符数组
    private static final char[] arr={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','k','r','s','t','u','v','w','x','y','z'};
    @Test
    public void test() throws IOException {
      //1、创建字符输出流
      CharArrayWriter caw=new CharArrayWriter();
      //2、写入字符A后写入串AB
      caw.write('A');
      caw.write("AB");
      //3、从arr中读取defgh并写入
      caw.write(arr, 3, 8);
      System.out.println("输出流内容为:"+caw);
      //4、写入字符0后写入123456789
      caw.write("0");
      caw.write("123456789");
      //5、从arr中读取ijkl并写入
      caw.write(arr,8,12);
      System.out.println("输出流内容为:"+caw);
      //6、计算输出流中字符的长度
      int size=caw.size();
      System.out.println("输出流内容长度为:"+size);
      //7、转换成字符数组
      char[] c=caw.toCharArray();
      System.out.println(c[c.length-1]);
      System.out.println("转换后的字符数组:"+String.valueOf(c));
      //8、将该字符输出流写入另一个字符输出流中
      CharArrayWriter caw2=new CharArrayWriter();
      caw.writeTo(caw2);
      System.out.println("caw2的字符流内容:"+caw2);
      //关闭流
      caw.close();
      caw2.close(); 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值