【Java_19】字节流、字符流

2021-02-04 10:07:48 浏览数 (1)

一、IO

1. 分类
代码语言:javascript复制
① 按流向
    输入流、输出流
② 按类型
    字节流、字符流

二、字节流

1. 一切皆为字节
代码语言:javascript复制
* 一切数据在电脑中存储时都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。
* 字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
2. OutputStream 抽象类
代码语言:javascript复制
① void close() 
    关闭此输出流并释放与此流相关联的任何系统资源。  
② void flush() 
    刷新此输出流并强制任何缓冲的输出字节被写出。  
③ void write(byte[] b)
    将 b.length字节从指定的字节数组写入此输出流。  
④ void write(byte[] b, int off, int len) 
    从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。  
⑤ void write(int b) 
    将指定的字节输出流。
3.FileOutputStream
代码语言:javascript复制
① 构造方法
    * public FileOutputStream(File file)
        创建文件输出流以写入由指定的 File对象表示的文件。 
    * public FileOutputStream(String name)
        创建文件输出流以指定的名称写入文件。  
    * public FileOutputStream(File file, boolean append)
        创建文件输出流以写入由指定的 File对象表示的文件。  
    * public FileOutputStream(String name, boolean append)
        创建文件输出流以指定的名称写入文件。 
    示例:
        import java.io.File;
        import java.io.FileOutputStream;
        import java.io.IOException;

        public class OutputStream {
            public static void main(String[] args) throws IOException {
                //追加写
                FileOutputStream fos = new FileOutputStream(new File("C:\Users\Demo_Null\Desktop\file.java"), true);;
                //覆盖写
                FileOutputStream fos1 = new FileOutputStream("C:\Users\Demo_Null\Desktop\HelloWorld.java");;
 
                //将字符串转为字节
                fos.write("97".getBytes());
                //将ASCII第65号输出
                fos.write(65);
                //将字符串转为字节
                fos1.write("abc|".getBytes());
                //将ASCII第97号输出
                fos1.write(97);
                
                //刷新
                fos.flush();
                fos1.flush();
                
                //释放资源 释放资源时会先刷新在释放资源,flush()可以不写
                fos.close();
                fos1.close();
            }
        }
4. InputStream 抽象类
代码语言:javascript复制
① void close()
    关闭此输入流并释放与此流相关联的任何系统资源。    
② int read()
    从输入流读取数据的下一个字节。 
③ int read(byte[] b)
    从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
5. FileInputStream
代码语言:javascript复制
① 构造方法
    * FileInputStream(File file)
        通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 
    * FileInputStream(String name)
        通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。  
② 示例
    public class DemoInputStream {
        public static void main(String[] args) throws IOException{
            // 使用文件名称创建流对象
            FileInputStream fis = new FileInputStream("read.txt");
            // 读取数据,返回一个字节
            int read = fis.read();
            System.out.println((char) read);
            read = fis.read();
            System.out.println((char) read);
            read = fis.read();
            System.out.println((char) read);
            read = fis.read();
            System.out.println((char) read);
            read = fis.read();
            System.out.println((char) read);
            // 读取到末尾,返回-1
            read = fis.read();
            System.out.println( read);
            // 关闭资源
            fis.close();
        }
    }
6. 文件复制
代码语言:javascript复制
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

public class InputStream {
    public static void main(String[] args) throws IOException {
        //创建输入流
        FileInputStream fis = new FileInputStream("C:\Users\Demo_Null\Desktop\Desktop.rar");
        //创建输出流
        FileOutputStream fos = new FileOutputStream("C:\Users\Demo_Null\Desktop\copy.rar");
 
        //读入一个字节(读取->赋值->判断)
        /*int content;
        while ((content = fis.read()) != -1) {
            //写出一个字节
            fos.write(content);
        }*/
 
        //定义一个 1M 缓冲字节数组 
        byte[] bytes = new byte[1024 * 1024];
        //读取到的字节个数
        int len;
 
        //复制文件开始时间
        Date dateStart = new Date();
        long t1 = dateStart.getTime();
        //是否读到末尾
        while ((len = fis.read(bytes)) != -1) {
            //将字节数组从0开始写出len个
            fos.write(bytes,0,len);
        }
 
        //复制文件结束时间
        Date dateEnd = new Date();
        long t2 = dateEnd.getTime();
 
        //复制文件耗时多少毫秒
        System.out.println(t2 - t1);
 
        //释放资源
        fos.close();
        fis.close();
    }
}

三、字符流

1. Reader 抽象类
代码语言:javascript复制
① void close()
    关闭此流并释放与此流相关联的任何系统资源。    
② int read()
    从输入流读取一个字符。 
③ int read(char[] cbuf)
    从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
2. FileReader
代码语言:javascript复制
① 构造方法    
    * FileReader(File file)
        创建一个新的 FileReader ,给定要读取的File对象。   
    * FileReader(String fileName)
        创建一个新的 FileReader ,给定要读取的文件的名称。
3. Writer
代码语言:javascript复制
① void write(int c)
    写入单个字符。
② void write(char[] cbuf)
    写入字符数组。 
③ void write(char[] cbuf, int off, int len)
    写入字符数组的某一部分,off数组的开始索引,len写的字符个数。 
④ void write(String str)
    写入字符串。 
⑤ void write(String str, int off, int len) 
    写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
⑥ void flush()
    刷新该流的缓冲。  
⑦ void close() 
    关闭此流,但要先刷新它。 
4. FileWriter
代码语言:javascript复制
① 构造方法
    * FileWriter(File file)
        创建一个新的 FileWriter,给定要读取的File对象。   
    * FileWriter(String fileName)
        创建一个新的 FileWriter,给定要读取的文件的名称。
        
# GBK中文为2字节而UTF-8中文为3字节故不能直接操作不同的编码文本
5. 示例
代码语言:javascript复制
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Reader {
    public static void main(String[] args) throws IOException {
        //创建字符输出流
        FileWriter fw = new FileWriter("C:\Users\Demo_Null\Desktop\chinese.txt");
        //输入字符串到文本
        fw.write("努力工作?rnt↓rn升值加薪¥rnt↓rn走上人生巅峰<( ̄︶ ̄)↗[GO!]");
        //刷新数据
        fw.flush();
        //释放资源
        fw.close();
 
        //创建字符输入流
        FileReader fr = new FileReader("C:\Users\Demo_Null\Desktop\chinese.txt");
 
        //创建字符缓冲区
        char[] buffer = new char[1024 * 1024];
        //读取成功的字符数
        int len;
        //判断是否读到结束标记
        while ((len = fr.read(buffer)) != -1) {
            //打印
            System.out.print(new String(buffer,0,len));
        }
        //释放资源
        fr.close();
    }
}

0 人点赞