IO流-字节流,字符流随笔

IO流

IO
IO流用来处理设备之间的数据传输,如上传文件和下载文件,文件的读取写入等操作

概述

Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中

按照数据流向:

  • 输入流 读入数据 从操作系统上读入文件到内存中
  • 输出流 写出数据 就是将文件从编译器中编写到操作系统上

按照数据类型:

  • 字节流 由于我们的文件存储的基本单元都是字节,所以这个很早出现了
  • 字符流 为了方便处理某些数据,则出现字符流

如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流,否则用字节流。如果不知道是什么文件,就用字节流。

字节流:

字节输入流:
  • InputStream
  • FileInputStream
    //InputStream是最基础的字节输入流的接口
    //FileInputStream是最基础的文件操作字节输入流对象
    /*使用try-catch进行捕获异常
    1、声明输入流对象
    2、定义每次读入的字节数大小
    3、每次读取一个字节数组的大小,读取的内容都在字节数组中,直到字节数组返回的大小等于-1,则表示已经读取完毕
    4、必须关闭输入流
    */
     try(FileInputStream fis = new FileInputStream(READ_FILE_PATH)){
                byte[] bytes = new byte[1024];
                while (fis.read(bytes) != -1) {
                    String str = new String(bytes);
                    System.out.println(str);
                }
                fis.close();
            }
字节缓冲输入流:

BufferedInputStream
成员方法:

int read() 一次读取一个字节
int read(byte [] bytes) 一次读取一个字节数组

    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(READ_FILE_PATH))) {
                byte[] bytes = new byte[1024];
                while (bis.read(bytes) != -1) {
                    String str = new String(bytes);
                    System.out.println(str);
                }
                bis.close();
            }
字节输出流:

OutputStream
FileOutStream

    /*输出流的构造方法可以定义是否续写
    即new FileOutputStream(WRITE_FILE_PATH,true);支持续写,不会覆盖之前文件中的内容
    */
    //定义当前系统下的换行符
      public static final String LINE_SEPARATOR = System.getProperty("line.separator");
      try (FileOutputStream fos = new FileOutputStream(WRITE_FILE_PATH)) {
                for (int i = 0; i < 100; i++) {
                    String s = "HELLO" + (int) (Math.random() * 100 + 1) + LINE_SEPARATOR;
                    fos.write(s.getBytes());
                }
                fos.close();
            }
字节缓冲输出流:

BufferedOutputStream

成员方法:

void write() 一次写入一个字节
void write(byte [] bytes , int off , int len) 一次写入一个字节数组,从off开始,长度为len

    /*
    缓冲输出流必须使用flush()方法将缓冲区中的数据强制输出完
    */
    try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(WRITE_FILE_PATH))) {
                for (int i = 0 ; i < 10000000 ; i++) {
                    String str = i + "";
                    bos.write(str.getBytes(Charset.forName("UTF-8")));
                    bos.flush();
                }
            }

缓冲流仅仅只是对字节流的优化,所以最好的定义方式是传递一个输入流/输出流对象

字节数组输入流/输出流

字节数组输入流
  • ByteArrayInputStream
    public String readFromArray(byte[] bytes) {
            StringBuffer sb = new StringBuffer();
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            int tmp;
            while ((tmp = bais.read()) != -1) {
                sb.append(Integer.toHexString(tmp));
            }
            return sb.toString();
        }
    
        public void readMarkAndReset(byte[] bytes,int mark) {
            StringBuffer sb = new StringBuffer();
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            bais.mark(mark);
    
            bais.skip(mark + 1);
            int tmp;
            while ((tmp = bais.read()) != -1) {
                sb.append(Integer.toHexString(tmp));
            }
    
            System.out.println("越过标记后的字符串");
            System.out.println(sb.toString());
    
            bais.reset();
            sb.setLength(0);
    
            int m;
            while ((m = bais.read()) != -1) {
                sb.append(Integer.toHexString(m));
            }
    
            System.out.println("重置之后的字符串");
            System.out.println(sb.toString());
        }
    
字节数组/输出流
  • ByteArrayOutputStream
    try (InputStream is = new FileInputStream("D://read_file.txt")) {
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                byte[] bytes = new byte[1024];
                while (is.read(bytes) != -1) {
                    output.write(bytes);
                }
    
                String data = output.toString("UTF-8");
                System.out.println(data);
    
            }

字符流(转换流):

字符流 = 字节流 + 编码集

字符输入流:
  • Reader
  • FileReader
/*
1、定义FileReader()对象
2、定义字符数组
3、读取数组大小的内容
4、返回的读取长度为-1表示读完
*/
try (FileReader reader = new FileReader(READ_FILE_PATH)) {
          char[] chars = new char[1024];
          while (reader.read(chars) != -1) {
              System.out.println(chars);
          }
      }

  • InputStreamReader
    /*
    定义InputStreamReader对象,传递一个FileInputStream对象作为参数
    */
     try (Reader reader = new InputStreamReader(new FileInputStream(READ_FILE_PATH))) {
                char[] chars = new char[1024];
                while (reader.read(chars) != -1){
                    System.out.print(new String(chars));
                }
            }

字符缓冲输入流:
  • BufferedReader:

特殊用法:

String readLine() 一次读取一行数据,但不包括换行符【\n】


    try(BufferedReader reader = new BufferedReader(new FileReader(READ_FILE_PATH))){
                String str;
                while ((str = reader.readLine()) != null) {
                    System.out.println(str);
                }
            }
字符输出流:
  • Writer
  • FileWriter
     try (FileWriter writer = new FileWriter(WRITE_FILE_PATH)) {
                for (int i = 0 ; i< 1000000;i++) {
                    writer.write("我是byhieg");
                }
            }
  • OutputStreamWriter
    try (Writer writer = new OutputStreamWriter(new FileOutputStream(WRITE_FILE_PATH))) {
                for (int i = 0 ; i < 100;i++) {
                    writer.write("我是中国人" +Math.random()*100+1);
                    writer.write("\r\n");
                }
                System.out.println("输出流");
            }
字符缓冲输出流:
  • BufferedWriter:

特殊用法:

void newLine() 写入一个行分隔符【\n】,适用于各个系统

    try (BufferedWriter bw = new BufferedWriter(new FileWriter(READ_FILE_PATH))) {
                for (int i = 0 ;i < 100000;i++) {
                    String str = "asd";
                    bw.write(str);
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值