Java

I/O流

按流的方向分

输入输出流

  • I表示intput(输入),是数据从硬盘文件读入到内存的过程,称之输入,负责读。
  • O表示output(输出),是内存程序的数据从内存到写出硬盘文件的过程,称之输出,负责写。

按流中的数据最小单位分

  • 字节流
    • 操作所有类型的文件
    • InputStream 字节输入流
      • 实现类 FileInputStream
    • OutputStream 字节输出流
      • 实现类 FileOutputStream
  • 字符流
    • Reader 字符输入流
      • 实现类 FileReader
    • Writer 字符输出流
      • 实现类 FileWriter
    • 只能操作纯文本文件
文件字节输入流 FileInputStream
  • 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
构造器 说明
public FileInputStream(File file) 创建字节输入流管道与源文件对象接通
public FileInputStream(String pathname) 创建字节输入流管道与源文件路径接通
方法名称 说明
public int read() 每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1

测试数据

  • ab312
package com.yu.Day1005Demo;

import java.io.FileInputStream;
import java.io.InputStream;

public class FileInputStreamDemo02 {
    public static void main(String[] args) throws Exception{
        InputStream in = new FileInputStream("src//data.txt");
        //定义一个字节数组,用于读取字节数组
        byte[] buffer = new byte[3];
        int len = in.read(buffer);
        System.out.println(len);
        String rs = new String(buffer);
        System.out.println(rs);
        //当提取出的数据小于桶内数据时,只能替换前面的数据后面数据将保存
        //这时需要根据提取出的数据长度来限制需要输出的数据长度
        int len1 = in.read(buffer);
        System.out.println(len1);
        String rs1 = new String(buffer,0,len1);
        System.out.println(rs1);

    }
}

输出结果

3
ab3
2
12
当遇见中文字符时可能会遇见乱码

解决方法

  • 方法1:自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成
方法名称 说明
public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1
  • 方法2:官方字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
方法名称 说明
public byte[] readAllBytes() throws IOException 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
文件字节输出流(FileOutputStream)
创建文件字节输出流
构造器 说明
public FileOutputStream(File file) 创建字节输出流管道与源文件对象接通
public FileOutputStream(file file,boolean append) 创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream(String filepath) 创建字节输出流管道与源文件路径相通
public FileOutputStream(String filepath,boolean append) 创建字节输出流管道与源文件路径相通,可追加数据
写数据出去API
方法名称 说明
public void write (int a) 写一个字节出去
public void write(byte[] buffer) 写一个字节数组出去
public void write(byte[] buffer ,int pos,int len) 写一个字节数组的一部分出去
流的关闭与刷新
方法 说明
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会刷新流,一旦关闭,就不能再写数据
字节流实际应用——文件拷贝
package com.yu.Day1005Demo;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class ziyuankaobei {
    public static void main(String[] args) throws Exception{
        //建立需要拷贝的文件
        InputStream in = new FileInputStream("D:\\英雄时刻\\javaWeb1班\\movie\\1012下午.mp4");
        //创建需要接收文件
        OutputStream out = new FileOutputStream("F:\\daoluan\\new.avi");
        //使用字节流方法拷贝
        byte[] buffer = new byte[1024];
        int len;
        while((len=in.read(buffer)) != -1){
            out.write(buffer,0,len);
        }
        out.flush();
        out.close();
        in.close();
        System.out.println("拷贝完成!!!");

    }
}
相关问题
  1. 字节流适合做一切文件数据拷贝吗

​ 任何文件的底层都是字节,拷贝是一字不漏的欢迎字节,只要前后文件格式编码一致没有任何问题

try-cath-finally

  • finally: 在异常处理提供finally块来执行所有清除操作,比如说IO流的释放资源

  • 特点:被finally控制的语句最终一定会执行,处分JVM退出

  • 异常处理标准格式:try...catch...finally

  • try-catch-finally格式

  • package com.yu.Day1005Demo;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class FileInputStreamDemo03 {
        public static void main(String[] args) {
            InputStream in = null;
            try {
               in = new FileInputStream("src\\data.txt");
                try {
                    System.out.println(in.read());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }
    
    
  • 作用

    • finally代码块是最终一定执行的,可以在代码执行完毕的最后用于释放资源

文件字符输入流(FileReader)

每次读取一个字符的API

方法名称 说明
public int read() 每次读取一个字符返回,如果字节已经没有可读的返回-1
  • 字符流好处,每次读取一个字符存在的问题
    • 读取中文字符不会出现乱码(如果代码和文件编码一致)
    • 性能较慢

每次读取多个字符的API

方法名称 说明
public int read(char[] buffer) 每次读取一个字符数组,返回读取的字符数,如果字节已经没有可读的返回-1
  • 每次读取一个字符数组的优势
    • 读取的性能得到了提升

1.字符输出流写数据的方法

方法名称 说明
void write(int c) 写一个字符
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf,int off,int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str,int off,int len) 写一个字符串的一部分

2.字符输出流如何实现按数据追加

方法名称 说明
public FileWriter(String filepath,boolean append) 创建字符输出流管道与源文件路径接通,可追加数据

3.字符输出流如何实现写出去的数据能换行

  • fw.write("\r\n");

4.字符输出流写完数据后必须做什么?

  • flush()刷新数据
  • close()方法是关闭流,关闭包含刷新,关闭后流不可以继续使用了
 posted on 2022-10-05 21:39  yulll  阅读(39)  评论(0编辑  收藏  举报