美文网首页
字节流的基本操作

字节流的基本操作

作者: 小磊z | 来源:发表于2020-08-25 09:56 被阅读0次

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流。可以通过下图表示输入和输出的关系。

输入输出的关系

在java.io中流的操作主要有字节流、字符流两大类,均有输入和输出操作。字节流中输出数据主要使用OutputStream类完成,输入使用的是InputStream类。字符流中输出主要是使用Writer类完成,输入主要是使用Reader类完成。

字节流

1.字节输出流
字节流主要操作byte类型数据,以byte数组为准,主要操作类是OutputStream类和InputStream类。
OutputStream类是一个抽象类,如果要使用此类,则首先必须通过子类实例化对象。如果现在要操作的是一个文件,则可以使用FileOutputStream类,通过向上转型后,可以为OutputStream实例化。

范例:向文件中写入字符串

public class OutputStreamDemo01 {
    public static void main(String[] args) throws Exception{

        //使用File类找到一个文件
        File f = new File("d:" + File.separator + "test.txt");

        //通过子类实例化父类对象
        OutputStream out = new FileOutputStream(f);
        String str = "Hello World!!!";

        byte[] b = str.getBytes();//将字符串变为byte数组,因为只能输出byte数组
        out.write(b);//将内容输出,保存文件
        out.close();
    }
}

程序运行结果:

输出到文件

内容已成功地写入到文件中,以上程序在实例化、写、关闭时都有异常发生,为了方便起见,直接在主方法上使用throws关键字抛出异常,可以减少try...catch语句。

2.追加新内容
在之前的所有操作中,如果重新执行程序,肯定会覆盖文件中的已有内容,此时可以通过FileOutputStream向文件中追加内容,FileOutputStream的另外一个构造方法如下:

public FileOutputStream(File file,boolean append) throws FileNotFoundException

如果将append的值设置为true,则表示在文件的末尾追加内容。
范例:修改之前的程序,追加文件内容

public class OutputStreamDemo03 {
    public static void main(String[] args) throws Exception{//异常抛出,不处理

        File f = new File("d:" + File.separator + "test.txt");


        OutputStream out = new FileOutputStream(f,true);//此处表示在文件末尾追加内容
        String str = "Hello World!!!";
        byte[] b = str.getBytes();

        for (int i = 0; i < b.length; i++) {
            out.write(b[i]);
        }
        out.close();
    }
}

程序运行结果

内容追加

可以发现,每次执行后,内容会自动追加到文件的末尾。

3.字节输入流InputStream

既然可以用程序向文件中写入内容,那么也可以通过InputStream从文件中把内容读取进来。InputStream类和OutputStream类一样本身也是一个抽象类,必须依靠其子类。如果从文件中读取,子类肯定是FileInputStream。
FileInputStream类的构造方法如下:

public FileInputStream(File file) throws FileNotFoundException

范例:从文件中读取内容

public class InputStreamDemo01 {
    public static void main(String[] args) throws Exception {

        //通过File类找到一个文件
        File f = new File("d:" + File.separator + "test.txt");

        /* 第2步,通过子类实例化父类对象 */
        InputStream input = new FileInputStream(f);

        //将所有的内容读到此数组中
        byte b[] = new byte[1024];

        //将内容取出读到byte数组中
        input.read(b);

        input.close();
        System.out.println("内容为:" + new String(b));
    }
}

程序运行结果:
内容为:Hello World!!!Hello World!!!

文件的内容已经被读取出来,但是后面有很多个空格,这是因为开辟的byte数组大小为1024,而实际的内容只有28个字节,在这之后存在 996个空白的空间,在将byte数组变为字符串时也将这996个无用的空间转为字符串,这样不仅浪费空间,也不合理。可以使用read()方法上的返回值,此返回值表示向数组中写入了多少个数据。
范例:修正以上错误

public class InputStreamDemo02 {
    public static void main(String[] args) throws Exception{
        File f = new File("d:" + File.separator + "test.txt");
        InputStream input = new FileInputStream(f);
        byte b[] = new byte[1024];
        int len = input.read(b);
        input.close();
        System.out.println("读入数据的长度:" + len);
        System.out.println("内容为:"+new String(b,0,len));
    }
}

程序运行结果:

按照长度输出

此时的程序已不再产生多余的空格,因为在程序最后输出时将byte数组指定范围中的内容变成了字符串。

除以上方法外,也可以通过循环从文件中一个个地把内容读取出来,直接使用read()方法即可。
范例:使用read()通过循环读取

public class InputStreamDemo04 {
    public static void main(String[] args) throws Exception{
        File f = new File("d:" + File.separator + "test.txt");
        InputStream input = new FileInputStream(f);
        
        byte b[] = new byte[(int) f.length()];//将所有的内容读到此数组中

        for (int i = 0; i < b.length; i++) {
            b[i] = (byte)input.read();//将内容读出
        }

        input.close();
        System.out.println("内容为:" + new String(b));//将byte数组变为字符串输出
    }
}

程序运行结果:

按内容的大小进行输出

以上程序是在明确知道具体数组大小的前提下开展的,如果此时不知道要输入的内容有多大,则只能通过判断是否读到文件末尾的方式来读取文件。能否有根据内容大小自调整的方法?
范例:另一种方式的读取

public class InputStreamDemo05 {
    public static void main(String[] args) throws Exception{
        File f = new File("d:" + File.separator + "test.txt");
        InputStream input = new FileInputStream(f);
        int len = 0;             //用于记录读取的数据个数
        byte b[] = new byte[1024]; //所有的内容读到此数组中
        int temp = 0;              //接收读取的每一个内容
        while ((temp = input.read()) != -1) {
            //将每次的读取内容给temp变量,如果temp的值不是-1,则表示文件没有读完
            b[len] = (byte)temp;
            len++;
        }
        
        
        input.close();
        System.out.println("内容为:" + new String(b, 0, len));
    }
}

程序运行结果:

文件读到末尾,则返回的内容为-1。因此当temp接收到的内容为-1时,输入流的内容也读到底,才会返回-1,通过-1可以判断输入流中是否还有其他内容。

相关文章

  • Java 字符流操作

    上篇文章Java 字节流操作介绍了java中基本的字节流操作,但是我们常常对于字符操作,如果使用字节流来实现输入输...

  • 字节流的基本操作

    在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起...

  • java 复制图片

    在学习了java IO 的基本理论之后做如下总结:1、java的IO操作分为字节流和字符流两种方式。字节流可以传输...

  • Java IO 第3篇:不能不懂的 IO 处理流

    不能不懂的 IO 处理流 我们在掌握了 File 类、字节流、字符流,学会了 IO 操作的套路之后,IO 操作基本...

  • 四十、字符流

    经过前面的学习,我们基本掌握的文件的读写操作,在操作过程中字节流可以操作所有数据,可是当我们操作的文件中有中文字符...

  • JS节流小知识

    一、什么是节流? 节流:当某个操作是连续性执行的时候,我们通过某种方式,降低该操作的执行频率,这就是节流。就跟水龙...

  • 图解防抖动与节流模式

    防抖动 防抖动立即触发 防抖动 节流 节流立即触发 节流 总结 防抖动:将多个操作合并为一个操作(例如,键盘输入关...

  • 1.字节流和字符流

    字节流 字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputS...

  • 3. IO概述

    1. IO基本实现 1.1 字节流(stream) 个人理解: 以字节为单位对文件本身直接操作。主要接口: Inp...

  • Java技术:深入解析字节流与缓冲流

    本章先来看两大“流”派中的字节流。字节流相对字符流总体结构简单一点,只用记住它的4个最基本的操作类就可以了。下面一...

网友评论

      本文标题:字节流的基本操作

      本文链接:https://www.haomeiwen.com/subject/nnpnjktx.html