当前位置 > it书童 > java > 正文

java的字节流和字符流

java it书童 2020-12-02 13:43:50 0赞 0踩 860阅读 0评论

InputStream和Reader

InputStream和Reader是所有输入流的抽象基类,本身并不能创建实例来执行输入,但它们将成为所有输入流的模板,所以它们的方法是所有输入流都可使用的方法

InputStream和Reader都是抽象类,本身不能创建实例,但它们分别有一个用于读取文件的输入流:FileInputStream和FileReader,它们都是节点流——会直接和指定文件关联

public class FileInputStreamTest {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流
        FileInputStream fis = new FileInputStream("src/main/java/crazy/chart15/section03/FileInputStreamTest.java");
        // 创建一个长度为 1024 的"竹筒"
        byte[] bbuf = new byte[1024];
        // 用于保存实际读取的字节数
        int hasRead = 0;
        while ((hasRead = fis.read(bbuf)) > 0) {
            // 取出"竹筒"中的水滴(字节),将字节数组转换成字符串输入
            System.out.println(new String(bbuf, 0, hasRead));
        }
        fis.close();
    }
}

源码 javaDemo 580c62a

与JDBC编程一样,程序里打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源。Java 7改写了所有的IO资源类,它们都实现了AutoCloseable接口,因此都可通过自动关闭资源的try语句来关闭这些IO流。下面程序使用FileReader来读取文件本身。

try (
    // 创建字节输入流
    FileInputStream fis = new FileInputStream("src/main/java/crazy/chart15/section03/FileInputStreamTest.java");
) {
    // 创建一个长度为 1024 的"竹筒"
    byte[] bbuf = new byte[1024];
    // 用于保存实际读取的字节数
    int hasRead = 0;
    while ((hasRead = fis.read(bbuf)) > 0) {
        // 取出"竹筒"中的水滴(字节),将字节数组转换成字符串输入
        System.out.println(new String(bbuf, 0, hasRead));
    }
} catch (IOException e) {
    e.printStackTrace();
}

源码 javaDemo 13f62ec

OutputStream和Writer

下面程序使用FileInputStream来执行输入,并使用FileOutputStream来执行输出,用以实现复制FileOutputStreamTest.java文件的功能

public class FileOutputStreamTest {
    public static void main(String[] args) {
        try (
            // 创建字节输入流
            FileInputStream fis = new FileInputStream("src/main/java/crazy/chart15/section03/FileOutputStreamTest.java");
            // 创建字节输出流
            FileOutputStream fos = new FileOutputStream("src/main/java/crazy/chart15/section03/newFile.txt");
        ) {
            byte[] bbuf = new byte[32];
            int hasRead = 0;
            while ((hasRead = fis.read(bbuf)) > 0) {
                fos.write(bbuf, 0, hasRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

源码 javaDemo 1a794ab

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/924