zoukankan      html  css  js  c++  java
  • Java IO(三)——字节流

    一、流类

    Java的流式输入/输出是建立在四个抽象类的基础上的:InputStream、OutputStream、Reader、Writer。它们用来创建具体的流式子类。尽管程序通过具体子类执行输入/输出操作,但顶层类定义了所有流类的基本通用功能。

    InputStream和OutputStream为字节流设计,Reader和Writer为字符流设计,字节流和字符流形成分离的层次结构。一般来说,处理字符或字符串使用字符流类,处理字节或二进制对象使用字节流

    操作文件流时,不管是字符流还是字节流,都可以按照以下方式进行:

    1、使用File类找到一个对象

    2、通过File类的对象去实例化字节流或字符流的子类

    3、进行字节(字符)的读、写操作

    4、关闭文件流

    二、OutputStream(字节输出流)

    OutputStream是定义了Java流式字节输入模式的抽象类。该类的所有方法返回一个void值并且在出错的情况下引发一个IOException,OutputStream提供的抽象方法有:

    方    法 作    用
    void close() 关闭输入流,关闭后的写操作会引发IOException
    flush() 刷新此输入流并强制写出所有缓冲的输出字节
    write(byte[] b) 向输入流写入单个字节,注意参数是一个int型,它允许设计者不必把参数转换成字节型就可以调用write()方法
    write(byte[] b, int off, int len) 以b[off]为起点,向文件写入字节数组b中len个字节
    write(int b) 向一个输出流写一个完整的字节数组

    三、FileOutputStream(文件字节输出流)

    FileOutpuStream应该是Java中最常见的字节输出流了,它创建一个可向文件写入字节的类OutputStream,它常用的构造方法如下:

    1、FileOutputStream(String name)

    2、FileOutputStream(File file)

    3、FileOutputStream(File file, boolean append)

    前两个构造方法类似,前者输入文件的绝对路径,后者输入File的实例对象,和RandomAccessFile一样,推荐后者。第三个构造方法有一点不同,append如果设置为true,文件则以搜索路径模式打开。FileOutputStream的创建不依赖于文件是否存在,在创建对象时,FileOutputSStream会在打开输出文件之前就创建它。这种情况下如果试图打开一个只读文件,会引发IOException。FileOutputStream,写一个例子,现在我的D盘下的Files文件夹里并没有"stream.txt"这个文件:

    复制代码
    package com.demo;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    
    public class FileOutputStreamTest {
        
        public static void main(String[] args) throws Exception{
            File file = new File("D:/Files/stream.txt");
            OutputStream out = new FileOutputStream(file);
            byte b[] = "Hello World!!!".getBytes(); //操作字节流,要转换成字节
            out.write(b);
            out.close();
        }
    }
    复制代码

    此时打开"stream.txt":

    到D盘下的Files文件夹里多了"stream.txt",且文件中的内容和我们写入的一致,同样这个例子也证明了FileOutputStream并不依赖指定路径下的文件是否存在。那如果指定路径下本来就有文件,那么写将会覆盖而不是追加,很好证明:

    复制代码
    package com.demo;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    
    public class FileOutputStreamTest {
        
        public static void main(String[] args) throws Exception{
            File file = new File("D:/Files/stream.txt");
            OutputStream out = new FileOutputStream(file);
            byte b[] = "abcdefghijklmnopqrstuvwxyz".getBytes(); //操作字节流,要转换成字节
            out.write(b);
            out.close();
        }
    }
    复制代码

    此时再打开"stream.txt":

    "stream.txt"中的内容变掉了,证明了结论。

    四、InputStream(字节输入流)

    InputStream是定义了Java流式字节输入模式的抽象类。该类所有方法在出错的时候都会引发一个IOException,InputStream提供的抽象方法有:

    方    法 作    用
    int available() 返回当前可读的字节数
    void close() 关闭此输入流并释放与该流关联的所有系统资源,关闭之后再读取会产生IOException
    int mark(int readlimit) 在输入流中放置一个标记,该流在读取N个Bytes字节前都保持有效
    boolean markSupported() 如果调用的流支持mark()/reset()就返回true
    int read() 如果下一个字节可读取则返回一个整形,遇到文件尾时返回-1
    int read(byte b[]) 试图读取buffer.length个字节到buffer中,并返回实际成功读取的字节数,遇到文件尾则返回-1
    int read(byte b[], int off, int len) 将输入流中最多len个数组直接读入byte数组,off表示数组b中写入数据的初始偏移量。注意,三个read方法,在输入数据可用、检测到流末尾或者抛出异常前,此方法将一直阻塞
    void reset() 重新设置输入指针到先前设置的标记处
    long skip(long n) 跳过和丢弃此输入流中数据的n个字节

    五、FileInputStream(文件字节输入流)

    FileInputStream应该是Java中最常见的字节输入流了,它创建一个能从文件读取字节的InputStream类,它的两个常用构造方法如下:

    1、FileInputStream(String name)

    2、FileInputStream(File file)

    和FileOutputStream差不多,推荐后者的用法。FileInputStream,同样写一个例子,操作的是上面D盘下的Files文件夹生成的"stream.txt":

    复制代码
    package com.demo;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    public class FileInputStreamTest {
        
        public static void main(String[] args) throws Exception{
            File file = new File("D:/Files/stream.txt");
            InputStream in = new FileInputStream(file);
            byte b1[] = new byte[(int)file.length()];
            int i = 0;
            i = in.read(b1);
            System.out.println(i);
            System.out.println(new String(b1, 0, i));
    
        }
    }
    复制代码

    运行结果为:

    26
    abcdefghijklmnopqrstuvwxyz

    要区分清楚,OutputStream的作用是将内容由Java内存输出到文件中、InputStream是将内容由文件输入到Java内存中。read(byte b[])方法之前讲明了,表示"试图读取buffer.length个字节到buffer中,并返回实际读取的字节数",返回的是实际字节的大小。

  • 相关阅读:
    Xcode7.x中安装Alcatraz
    iOS开发:一个无限滚动自动播放图片的Demo(Swift语言编码)
    ios开发:一个音乐播放器的设计与实现
    iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)
    iOS开发:XCTest单元测试(附上一个单例的测试代码)
    设计模式之构造者模式
    控制流程
    变量与常量定义
    go语言内置基础类型
    解决Win10 Virtualbox5.2.18桥接不能联网小记
  • 原文地址:https://www.cnblogs.com/zhuyuewei/p/7263663.html
Copyright © 2011-2022 走看看