3、IO--字节流和字符流

1、相关理论

在java.io包中的流操作主要有两大类:字节流类和字符流类

字节流:

在字节流中输出数据使用OutputStream类完成

使用InputStream类进行输入

字节流主要操作byte数据,以byte数组为准

主要的操作类OutputStream和InputStream类

字符流:

在字符流中输出主要是使用Writer类

输入主要使用Reader类完成

在程序中一个字符等于两个字节

java提供Reader和Writer两个专门操作字符流的类

Java中I/O操作相应步骤

以文件操作为例

操作流程如下:

1、使用类File打开一个文件

2、通过字节流或者字符流指定输出的位置

3、进行读/写操作

4、关闭输入/输出

2、使用字节流

2.1、字节输出流OutputStream

类OutputStream是整个I/O包中的字节输出流的最大父类

定义格式:

public abstract class java.io.OutputStream 
  implements java.io.Closeable, java.io.Flushable

可以看出OutputStream是一个抽象类

使用此类首先必须通过字类实例化对象

如果操作是一个文件可以使用FileOutputStram类

通过向上转型后可以实例化OutputStream

OutputStream中的主要操作方法:

close()      关闭输出流

flush()        刷新缓冲区

write(byte[] b)           将一个byte数组写入数据流

write(byte[] b,int off,int len)      将一个指定范围的byte数据写入数据流

write(int b)    将一个字节数据写入数据流

向文件中写入字符串实例

write(byte[] b)将字节数组全部数据写入到输出流中

write(byte b[])写入字节数组长度的字节到输出流中,也即是将字节数组中全部数据写入到输出流中。

其本质调用的是write(b, 0, b.length)方法,也即从offset未0,读取length长度的字节数组数据到输出流中。
这样一次性将数据写入到输出流中的方法比单个字节写入到输出流效率高。

public static void main(String[] args) throws IOException {
        //1、使用File类找到一个文件,声明File对象
        File file = new File("d:\\text.txt");
        
        //2、通过子类实例化父类对象
        OutputStream out = null;//准备好一个输出对象
        out = new FileOutputStream(file);//通过对象多态性,进行实例化
        
        //3、进行写操作
        String str = "Hello word";
        //只能输出byte数组,所以将字符串变为byte数组
        byte b [] = str.getBytes();
        out.write(b);
        
        //4、关闭输出流
        out.close();
    }

此时文件中的结果:

注意:多次执行的结果之后重写定义文件的内容

write(int b)把单个字节写入到输出流中

write(int b)方法用于把单个字节写入到输出流中。OutputStream的write(int b)

将一个包含了待写入数据的int变量作为参数写入。

public static void main(String[] args) throws IOException {
        //1、使用File类找到一个文件,声明File对象
        File file = new File("d:\\text.txt");
        
        //2、通过子类实例化父类对象
        OutputStream out = null;//准备好一个输出对象
        out = new FileOutputStream(file,true);//通过对象多态性,进行实例化
        
        //3、进行写操作
        String str = "Hello word";
        //只能输出byte数组,所以将字符串变为byte数组
        byte b [] = str.getBytes();
        // 通过write(int b)将数据写入到输出流,操作系统设备根据输出流处理到终端文件
        for(byte bs : b){
            out.write(bs);
        }
        
        //4、关闭输出流
        out.close();

    }

write(byte[] b,int off,int len)  

  • b -- 目标字节数组。

  • off -- 将读取的数据写入到数组b中,off表示从数据b的哪个位置开始写。

  • len -- 要读取的字节数。

  • IOException -- 如果发生I/ O错误。

  • NullPointerException -- 如果b为 null.

  • IndexOutOfBoundsException -- 如果off为负,len为负,或len大于b.length - off。

public static void main(String[] args) throws IOException {
        //1、使用File类找到一个文件,声明File对象
        File file = new File("d:\\text.txt");
        
        //2、通过子类实例化父类对象
        OutputStream out = null;//准备好一个输出对象
        out = new FileOutputStream(file,true);//通过对象多态性,进行实例化
        
        //3、进行写操作
        String str = "Hello word";
        //只能输出byte数组,所以将字符串变为byte数组
        byte b [] = str.getBytes();
        
        int len = b.length;

        out.write(b, 0, len);
        
        //4、关闭输出流
        out.close();
        
        
    }

追加而不是更换

如果需要进行追加内容可以这样定义:

        File file = new File("d:\\text.txt");
        
        OutputStream out = null;
        out = new FileOutputStream(file,true);

此时使用另一个构造方法

public FileOutputStream(File file,boolean append) throws FileNotFoundException

 此时的内容是在原来文件之后进行追加内容

flush()
flush()方法将所有写入到OutputStream的数据冲刷到相应的目标媒介中。

比如,如果输出流是FileOutputStream,那么写入到其中的数据可能并没有真正写入到磁盘中。
即使所有数据都写入到了FileOutputStream,这些数据还是有可能保留在内存的缓冲区中。

通过调用flush()方法,可以把缓冲区内的数据刷新到磁盘(或者网络,以及其他任何形式的目标媒介)中。

close()

当你结束数据写入时,需要关闭OutputStream。通过调用close()方法来关闭。

猜你喜欢

转载自www.cnblogs.com/Mrchengs/p/10809390.html