IO流之文件字节/字符输入输出流用法

IO流之文件字节/字符输入输出流用法

文章目录

  • IO流之文件字节/字符输入输出流用法
    • 文件字节输入流
    • 文件字节输出流
    • 文件字符输入流
    • 文件字符输出流

文件字节输入流

顾名思义,文件字节输入流即是将文件通过读取字节的方式输入,通过此方式可以读取绝大多数种类的文件。

本文所讲的所有操作,都是针对文件来进行读取或输入的。

Java虚拟机无权直接对文件进行操作,它必须向操作系统申请,才可以读取/更改文件,因此在使用文件的字节/字符流后,一定要记住关闭字节/字符流,即释放资源

对字节数组等内存形式的数据进行输入/输出流时,会走Java虚拟机的gc即垃圾回收机制,无需主动释放流资源。当然,如果你就是想加上一条close()语句,那也是无所谓的。

文件字节输入流主要做以下几件事情:

1、创建源(File类)

2、选择流(InputStream类)

3、对字节操作

4、释放资源

示例代码如下:

public class IOTest01 {
    public static void main(String[] args) {
        // 1、创建源
        File src = new File("abc.txt");
        // 2、选择流
        InputStream is = null;
        try {
            is = new FileInputStream(src);
            byte[] flush = new byte[1024*10];
            // 接收长度
            int len = -1;
            // 3、对字节进行操作
            while ((len = is.read(flush)) != -1) {
                // 一定要限制实际长度
                String str = new String(flush, 0, len);
                System.out.println(str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4、释放资源
            try {
                // 流is在创建失败时可能为空,此时需要判断,否则会报NullPointerException
                if (null != is) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

文件字节输出流

通过输出字节的方式输出到文件中,具体步骤如下:

1、创建源(File)

2、选择输出流

3、操作(写出内容)

4、释放资源

示例代码如下:

public class IOTest02 {
    public static void main(String[] args) {
        // 1、创建源
        File src = new File("dest.txt");
        // 2、选择流
        OutputStream os = null;
        try {
            os = new FileOutputStream(src,true);
            String msg = "Xixi";
            // 字符串-->字节数组(编码)
            byte[] datas = msg.getBytes("utf-8");
            // 3、操作,写出字节数据
            os.write(datas, 0, datas.length);
            // 刷新,防止流没有输出干净
            os.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4、释放资源
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

搭配好字节输入流和字符输出流,可以很轻易的复制文件(包括图片等)。

文件字符输入流

读取字符的方式读取文件。注意,如果文件字符与读取的字符格式不匹配,会出现乱码。该方式也不适用于读取图片等非字符文件的操作。

具体步骤如下:

1、创建源

2、选择流

3、操作数据

4、释放资源

示例代码:

public class IOTest04 {
    public static void main(String[] args) {
        // 1、创建源
        File src = new File("abc.txt");
        // 2、选择流
        Reader reader = null;
        try {
            reader = new FileReader(src);
            // 与字节流的差异地方
            char[] flush = new char[1024];
            // 接收长度
            int len = -1;
            // 3、操作
            while ((len = reader.read(flush)) != -1) {
                // 一定要限制实际长度
                String str = new String(flush, 0, len);
                System.out.println(str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4、释放资源
            try {
                // 流is在创建失败时可能为空,此时需要判断,否则会报NullPointerException
                if (null != reader) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

文件字符输出流

字符流在写入字符时的方法是多样的,可以用字节流类似的方法,也可以直接writer.write(String),或者使用append(String)

具体步骤如下:

1、创建源

2、选择流

3、操作数据

4、释放资源

示例代码:

public class IOTest05 {
    public static void main(String[] args) {
        File src = new File("dest.txt");
        Writer writer = null;
        try {
            writer = new FileWriter(src);
            // 写法一
//            String msg = "我是姚明";
//            char[] datas = msg.toCharArray();
//            writer.write(datas, 0, datas.length);
            // 写法二
//            String msg = "我是姚明";
//            writer.write(msg);
            // 写法三
            writer.append("我是JOJO").append("哈哈啊哈");
            writer.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

你可能感兴趣的:(JavaSE)