IO流

1286134-20181208090041144-1561147209.png

流分类:
  • 流向:输入流和输出流
  • 数据:字节流和字符流
字符流和字节流和文件:
  • 字节流:可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的,包括二进制、音频、视频、doc等
    输入流:InputStream FileInputStream
    输出流:OutputStream FileOutputStream
        FileInputStream fis = new FileInputStream("aaa.mp3");   //创建输入流对象,关联aaa.mp3
        FileOutputStream fos = new FileOutputStream("bbb.mp3");//创建输出流对象,关联bbb.mp3,如果没有bbb.txt,会创建出一个
        
        int b;
        while((b = fis.read()) != -1) { //没读到内容时返回-1
            fos.write(b);
        }
        
        fis.close();
        fos.close();
        FileInputStream fis = new FileInputStream("xxx.mp3");
        FileOutputStream fos = new FileOutputStream("copy.mp3");
        byte[] arr = new byte[fis.available()];                 //根据文件大小做一个字节数组
        fis.read(arr);                                          //将文件上的所有字节读取到数组中
        fos.write(arr);                                         //将数组中的所有字节一次写到了文件上
        fis.close();
        fos.close();

        FileInputStream fis = new FileInputStream("xxx.mp3");
        FileOutputStream fos = new FileOutputStream("copy.mp3");
        int len;
        byte[] arr = new byte[1024 * 8];                    //自定义字节数组
         
        while((len = fis.read(arr)) != -1) {
            //fos.write(arr);
            fos.write(arr, 0, len);                         //写出字节数组写出有效个字节个数
        }
        
        fis.close();
        fos.close();
  • 字符流:只能处理纯文本,全部为可见字符,txt、html
    输入流:Reader FileReader
    输出流:Writer FileWriter
//字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.
//FileReader类的read()方法可以按照字符大小读取
//FileWriter类的write()方法可以自动把字符转为字节写出
        FileReader fr = new FileReader("a.txt");
        FileWriter fw = new FileWriter("b.txt");
        
        int ch;
        while((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        
        fr.close();
        fw.close();
        FileReader fr = new FileReader("aaa.txt");          //创建字符输入流,关联aaa.txt
        FileWriter fw = new FileWriter("bbb.txt");          //创建字符输出流,关联bbb.txt
        
        int len;
        char[] arr = new char[1024*8];                      //创建字符数组
        while((len = fr.read(arr)) != -1) {                 //将数据读到字符数组中
            fw.write(arr, 0, len);                          //从字符数组将数据写到文件上
        }
        
        fr.close();                                         //关流释放资源
        fw.close(); 
操作:

1)建立联系 File对象
2)选择流
3)操作 数组大小+read、write
4)释放资源

处理流:

增强功能,提高性能,节点流之上
一、缓冲流
1)字节缓冲流
BufferedInputStream BufferedOutputStream


        FileInputStream fis = new FileInputStream("aaa.mp3");           //创建文件输入流对象,关联aaa.mp3
        BufferedInputStream bis = new BufferedInputStream(fis);         //创建缓冲区对fis装饰
        FileOutputStream fos = new FileOutputStream("copy.mp3");        //创建输出流对象,关联copy.mp3
        BufferedOutputStream bos = new BufferedOutputStream(fos);       //创建缓冲区对fos装饰
        
        int b;
        while((b = bis.read()) != -1) {     
            bos.write(b);
        }
        
        bis.close();                        //只关装饰后的对象即可
        bos.close();

2)字符缓冲流
BufferedReader BufferedWriter

//BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
//BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率

        BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));  //创建字符输入流对象,关联aaa.txt
        BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));  //创建字符输出流对象,关联bbb.txt
        
        int ch;             
        while((ch = br.read()) != -1) {     //read一次,会先将缓冲区读满,从缓冲区中一个一个的返给临时变量ch
            bw.write(ch);                   //write一次,是将数据装到字符数组,装满后再一起写出去
        }
        
        br.close();                         //关流
        bw.close();  
// BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)
// BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"

        BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
        String line;
        while((line = br.readLine()) != null) {
            bw.write(line);
            //bw.write("\r\n");                 //只支持windows系统
            bw.newLine();                       //跨平台的
        }
        
        br.close();
        bw.close(); 

二、转换流:字节流转字符流,处理乱码

//FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
//FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)

        BufferedReader br =                                     //高效的用指定的编码表读
                new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));
        BufferedWriter bw =                                     //高效的用指定的编码表写
                new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));
        int ch;
        while((ch = br.read()) != -1) {
            bw.write(ch);
        }
        
        br.close();
        bw.close();
IO流(flush和close方法的区别)
  • flush()方法
    • 用来刷新缓冲区的,刷新后可以再次写出
  • close()方法
    • 用来关闭流释放资源的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写

转载于:https://www.cnblogs.com/StephenChenin/p/9141798.html

09-04
IO指的是输入(input)和输出(Output),是一种抽象概念,是对数据传输的总称,即数据在设备间的传输称为,其本质是数据传输。IO用来处理设备间数据传输问题,常见应用有文件复制、文件上传、文件下载等[^1]。 IO可以从多个维度进行分类: - 按方向分类:可分为输入和输出。 - 按传输单位分类:有字节和字符。 - 按功能分类:可分为节点和处理等。 在Java中,常见的IO包括以下几类: ### 字符 - `FileReader`/`FileWriter`:用于读写文件的字符。 - `BufferedReader`/`BufferedWriter`:提供缓冲功能,提高读写效率。 - `PipedReader`/`PipedWriter`:用于线程间通信的管道。 - `InputStreamReader`/`OutputStreamWriter`:用于字节和字符之间的转换。 - `PrintWriter`:方便进行格式化输出的字符输出。 ### 字节 - `InputStream`/`OutputStream`:字节的抽象基类。 - `FileInputStream`/`FileOutputStream`:用于读写文件的字节。 - `FilterInputStream`/`FilterOutputStream`:过滤的抽象基类。 - `BufferedInputStream`/`BufferedOutputStream`:提供缓冲功能的字节。 - `DataInputStream`/`DataOutputStream`:用于读写基本数据类型的字节。 - `ObjectInputStream`/`ObjectOutputStream`:用于对象的序列化和反序列化。 - `PrintStream`:方便进行格式化输出的字节输出。 以下是一些Java中使用IO的代码示例: #### 字节读取文件 ```java import java.io.FileInputStream; import java.io.IOException; public class ByteStreamReadExample { public static void main(String[] args) { try { // 创建一个读取文件的对象 FileInputStream fIpS = new FileInputStream("D:\\IdeaProjects\\untitled1\\untit__IO\\src\\Day_2\\fIpS_1.txt"); // 调用该对象的读取方法 // 字节读数据的标准代码 int read; while ((read = fIpS.read()) != -1) { System.out.print((char) read); } // 关闭此文件输入并释放与相关联的任何系统资源 fIpS.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` #### 字节写入文件 ```java import java.io.FileOutputStream; import java.io.IOException; public class OutputDemo2 { public static void main(String[] args) { try { // 1. 创建字节输出的对象 // 注意点:如果文件不存在,会帮我们自动创建出来. // 如果文件存在,会把文件清空. FileOutputStream fos = new FileOutputStream("C:\\itheima\\a.txt"); // 2. 写数据 传递一个整数时,那么实际上写到文件中的,是这个整数在码表中对应的那个字符. fos.write(98); // 3. 释放资源 fos.close(); // 告诉操作系统,我现在已经不再用这个文件了. } catch (IOException e) { e.printStackTrace(); } } } ``` #### 字符写入文件 ```java import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class CharacterStreamWriteExample { public static void main(String[] args) { try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/news11.txt")))) { bw.write("hi,韩顺平教育"); } catch (IOException e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值