java I/O———字节流与字符流—字节输出流(OutputStream)

  • File类不支持文件内容处理,如果要处理文件内容,必须要通过流的操作模式来完成。流分为输入流和输出流。
  • 在java.io包中,流分为两种:字节流与字符流
  1. 字节流:InputStream、OutputStream
  2. 字符流:Reader、Writer

在这里插入图片描述

在这里插入图片描述

字节流与字符流操作的本质区别只有一个:字节流是原生的操作,而字符流是经过处理后的操作

在进行网络数据传输、磁盘数据保存所保存所支持的数据类型只有:字节。
而所有磁盘中的数据必须先读取到内存后才能进行操作,而内存中会帮助我们把字节变为字符。字符更加适合处理中文。

不管使用的是字节流还是字符流,其基本的操作流程几乎是一样的,以文件操作为例。

  1. 根据文件路径创建File类对象 ;
  2. 根据字节流或字符流的子类实例化父类对象 ;
  3. 进行数据的读取或写入操作
  4. 关闭流(close())。

对于IO操作属于资源处理,所有的资源处理操作(IO操作、数据库操作、网络)最后必须要进行关闭。

字节输出流(OutputStream)

如果要想通过程序进行内容输出,则可以使用java.io.OutputStream。

来观察OutputStream类的定义结构:

public abstract class OutputStream implements Closeable, Flushable

OutputStream类实现了Closeable,Flushable两个接口,这两个接口中的方法:

  1. Closeable: public void close() throws IOException;
  2. Flushable: public void flush() throws IOException;

在OutputStream类中还定义有其他方法:

  1. 将给定的字节数组内容全部输出:public void write(byte b[]) throws IOException
  2. 将部分字节数组内容输出:public void write(byte b[], int off, int len) throws IOException
  3. 输出单个字节:public abstract void write(int b) throws IOException;

由于OutputStream是一个抽象类,所以要想为父类实例化,就必须要使用子类。由于方法名称都由父类声明好了,所以我们在此处只需要关系子类的构造方法。如果要进行文件的操作,可以使FileOutputStream类来处理,这个类的构造方法如下:

  1. 接收File类(覆盖):public FileOutputStream(File file) throws FileNotFoundException
  2. 接收File类(追加):public FileOutputStream(File file, boolean append)

范例:实现文件的内容输出

package www.bit.java.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestIO {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
            if (!file.getParentFile().exists()) { // 必须保证父目录存在
            file.getParentFile().mkdirs() ; // 创建多级父目录
            }
            // OutputStream是一个抽象类,所以需要通过子类进行实例化,此时只能操    作File类
            OutputStream output = new FileOutputStream(file) ;
            // 要求输出到文件的内容
            String msg = "I'm bad man" ;
            // 将内容变为字节数组
            output.write(msg.getBytes());
            // 关闭输出
            output.close();
    }
}

在进行文件输出的时候,所有的文件会自动帮助用户创建,不在需要调用createFile()方法手工创建。
这个时候程序如果重复执行,并不会出现内容追加的情况而是一直在覆盖。如果需要文件内容追加,则需要调用FileOutputStream提供的另外一种构造方法。

范例:文件内容追加

package www.bit.java.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestIO {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
            if (!file.getParentFile().exists()) { // 必须保证父目录存在
            file.getParentFile().mkdirs() ; // 创建多级父目录
            }
            // OutputStream是一个抽象类,所以需要通过子类进行实例化,此时只能操    作File类
            OutputStream output = new FileOutputStream(file,true) ;//**
            // 要求输出到文件的内容
            String msg = "I'm bad man\n" ;//**
            // 将内容变为字节数组
            output.write(msg.getBytes());
            // 关闭输出
            output.close();
    }
}

范例:部分内容输出

package www.bit.java.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestIO {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
            if (!file.getParentFile().exists()) { // 必须保证父目录存在
            file.getParentFile().mkdirs() ; // 创建多级父目录
            }
            // OutputStream是一个抽象类,所以需要通过子类进行实例化,此时只能操    作File类
            OutputStream output = new FileOutputStream(file,true) ;//**
            // 要求输出到文件的内容
            String msg = "I'm bad man\n" ;//**
            // 将内容变为字节数组
           output.write(msg.getBytes(),0,5);//*****
            // 关闭输出
            output.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章