java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看。

  本篇为此系列随笔的第一篇:io系列之字节流。

一、字节流的File读写操作。

    InputStream and OutputStream

一)、 OutputStream: 字节输出流。

   以一个操作文件的例子进行说明: FileOutputStream (说明,该类对象必须指向一个文件,)

    构造方法:
        FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流.
        FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
        FileOutputStream(FileDescriptor fdObj) 创建一个向指定文件描述符处写入数据的输出文件流,
                  该文件描述符表示一个到文件系统中的某个实际文件的现有连接。

        FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
              使用方法及注意事项:
                    如: FileOutputStream fo = new FileOutputStream("filme.txt");
                  1、会在程序执行路径下创建一个filme.txt文件,该路径不因包名的变化而变化,只在执行路径下。
                  2、如果该路径下已有同名文件,那么该文件会被覆盖。

        FileOutputStream(String name, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
              使用方法及注意事项:
                    如: FileOutputStream fo = new FileOutputStream("filme.txt",true);
                  1、如果传入的参数为true,会在程序执行路径下打开一个已有的filme.txt文件。
                  2、如果该路径下没有该文件,则新建一个该文件, 并在文件末尾添加数据。
                  3、如果传入的参数为false,无论有无文件都会新建该文件。

        示例:1、以传入文件名的方式创建一个FileOutputStream对象(该对象一被初始化就必须明确被操作的文件)
           2、而且该文件会被新创建到指定目录下。
             3、路劲描述: 如: "D:\\java\\myclass\\winter.txt"

    写入方法:void write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
         void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
           void write(int c) 写入指定字节(就是写入该int型数的低八位,最后一个字节)。

            如: fo.write("winter is coming".getBatys());

            注意:字节流与字符流不同,这里每写入一个字节都会直接存入文件中,不需要flush()。

               off表示开始角标, len为长度。

    刷新方法: 字节流不需要刷新,没有flush方法。

    关闭方法:void close() 关闭此流。

            如: fo.close();
               (为了节约Windows资源,最后一定要 close ,关闭io。)

        注意:1、 几乎所有的IO操作都会抛出 IOException 异常,注意对异常的处理(try、catch或者throws)
           2、在程序调用Io结束后,一定使用 close语句结束流对象。

二)、InputStream :字符输入流。
    以一个操作文件的例子进行说明: FileInputStream (说明,该类对象必须指向一个文件,)

    构造方法:
        FileInputStream(String name) 在给定从中读取数据的文件名的情况下创建一个新 FileInputStream
              使用方法及注意事项:
                    如: FileInputStream fi = new FileInputStream("filme.txt");
                 1、创建一个FileInputStream对象,该对象会指向 filme.txt 文件。
                 2、该文件必须存在,否则抛出 FileNotFoundException 异常。

        FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个 FileInputStream,
                          该文件描述符表示到文件系统中某个实际文件的现有连接。

        FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,
                      该文件通过文件系统中的 File 对象 file 指定。

    取出方法:
        int read() 读取单个字节数据, 返回值为该字节值, 可使用(char)强转为字符形式。
             从文件的开头, 随着该方法的不断调用,一直读到文件结尾, 之后返回 -1.

             取出的字节本身只有8为,但是变为int型被补0到了32为(平时提升是补1,但是此处有位与255操作).

                    如: int i = fi.read(), char c = (char)i;

        int read(byte[] b, int off, int len) 将字节数据读入字节数组的某一部分
             将文件中的数据从文件头开始读取,并存入数组,直到文件中数据读完 或者 数组位置存满。
             只要文件中还有数据可读,便返回读取的字节个数。如果文件中已经没有数据可读,返回-1.
                    如: int i = 0; baty [] b = new baty[1024];
                       while((i = fi.read(c))!=-1)
                       { System.out.print(new String(b,0,i)); }

    获取文件字节数:
        int available() 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
              即:返回剩余的字节数。
              可以用来作为定义接受数据的字节数组长度的依据, 但是大型文件(如视频等)不建议使用该方法。

    结束方法:
        void close() 关闭该流并释放与之关联的所有资源。 此语句为必须执行语句。

二、字节流的 缓冲功能

    缓冲区的出现是为了增加流的效率的,所以建立缓冲区之前必须要先有流对象。
    缓冲区对象只是给传入的流对象加了一个缓冲区,他的所有的读、写功能其实还是在调用原来的流对象的功能(close关闭的是流对象)

一)、BufferedOutputStream :

    构造方法:
        BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
              如:FileOutputStream fo = new FileOutputStream()
                BufferedOutputStream bo = new BufferedOutputStream(fo);
            为流对象 fo建立了一个缓冲区对象fo。

        BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
              如:FileOutputStream fo = new FileOutputStream()
                BufferedOutputStream bo = new BufferedOutputStream(fo,1024);
            为流对象 fo建立了一个缓冲区对象 bo,缓冲长度为 1024个字符。
    写入方法:
        void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。

        void write(int b) 将指定的字节写入此缓冲的输出流。(其指定字节就是int型数据的最后八位)

                与传入的流对象相同, 这些方法底层就是在调用流对象的相应方法。

    关闭方法:void close();
          与传入的流对象相同, 此方法底层就是在调用流对象的close方法,缓冲区调用了过后,流对象不用重复关闭。

    其他方法:
        void flush() 刷新此缓冲的输出流。

二)、BufferedInputStream:

    构造方法:
        BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
                    如:FileInputStream fi = new FileInputStream()
                      BufferedInputStream bi = new BufferedInputStream(fi);
                  为流对象 fi建立了一个缓冲区对象 bi。

        BufferedInputStream(FileInputStream in, int sz) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,。
                    如:FileInputStream fi = new FileInputStream()
                      BufferedInputStream bi = new BufferedInputStream(fi,1024);
                  为流对象 fi建立了一个缓冲区对象 bi,缓冲长度为1024个字符。

    取出方法: 基本方法有流对象的相同(因为在调用流对象方法), 但是多了一个行读取方法。

        int read() 读取单个字节,返回值为该字节前补 0 至4个字节长度(write的 时候只写入最后一个字节)

                    (本来数据提升是在前补1的,但是此处内部有位与255操作)
             从文件的开头, 随着该方法的不断调用,一直读到文件结尾, 之后返回 -1.

        int read(bate[] cbuf, int off, int len) 将字节读入数组的某一部分
            将文件中的数据从文件头开始读取,并存入数组,知道文件中数据读完 或者 数组位置存满。
            只要文件中还有数据可读,便返回读取的字节个数。如果文件中已经没有数据可读,返回-1.
                  如: int i = 0; Bate [] b = new Bate[1024];
                     while((i = bi.read(b))!=-1)
                     { System.out.print(new String(b,0,i)); }

    结束方法:
        void close() 关闭该流并释放与之关联的所有资源。 此语句为必须执行语句。
              底层调用 流对象的 close 方法。

io系列之字节流的更多相关文章

  1. java io系列01之 "目录"

    java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...

  2. Java IO系列之一:IO

    1. 概述 Java IO一般包含两个部分: 1.java.io包中堵塞型IO: 2.java.nio包中的非堵塞型IO,通常称为New IO. java.io包下,分为四大块近80个类: 1.基于字 ...

  3. io系列之字符流

    java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,ja ...

  4. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)

    我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...

  5. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)

    前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会 ...

  6. java io系列12之 BufferedInputStream(缓冲输入流)的认知、源码和示例

    本章内容包括3个部分:BufferedInputStream介绍,BufferedInputStream源码,以及BufferedInputStream使用示例. 转载请注明出处:http://www ...

  7. java io系列21之 InputStreamReader和OutputStreamWriter

    InputStreamReader和OutputStreamWriter 是字节流通向字符流的桥梁:它使用指定的 charset 读写字节并将其解码为字符.InputStreamReader 的作用是 ...

  8. java io系列22之 FileReader和FileWriter

    FileReader 是用于读取字符流的类,它继承于InputStreamReader.要读取原始字节流,请考虑使用 FileInputStream.FileWriter 是用于写入字符流的类,它继承 ...

  9. java io系列25之 PrintWriter (字符打印输出流)

    更多内容请参考:java io系列01之 "目录" PrintWriter 介绍 PrintWriter 是字符类型的打印输出流,它继承于Writer.PrintStream 用于 ...

随机推荐

  1. mysql参数优化记录

    服务器参数16G内存,4核CPUvim /etc/my.cnf 原: back_log=170 max_connections=600 max_user_connections=0 thread_co ...

  2. Chrome 75 & lazy-loading

    Chrome 75 & lazy-loading https://addyosmani.com/blog/lazy-loading/ https://chromestatus.com/feat ...

  3. python数据结构与算法第六天【栈与队列】

    1.栈和队列的原理 栈:后进先出(LIFO),可以使用顺序表和链表实现 队列:先进先出(FIFO),可以使用顺序表和链表实现 2.栈的实现(使用顺序表实现) #!/usr/bin/env python ...

  4. vue中组件绑定事件时是否加.native

    组件绑定事件时 1. 普通组件绑定事件不能添加.native, 添加后事件失效 2. 自定义组件绑定事件需要添加.native, 否则事件无效 <template> <!-- < ...

  5. oracle11g安装教程完整版

    来自: https://www.2cto.com/database/201701/588135.html 64位WIN7+oracle11g+plsql安装 1.下载Oracle 11g R2 for ...

  6. MySQL 5.7 关闭严格模式

    If your app was written for older versions of MySQL and is not compatible with strict SQL mode in My ...

  7. Process 模块的方法

    join from multiprocessing import Process import time, os def task(name): print('%s is running' % nam ...

  8. 转 Debugging AutoCAD 2017 using Visual Studio 2015

    原文地址: http://adndevblog.typepad.com/autocad/2016/05/debugging-autocad-2017-using-visual-studio-2015. ...

  9. P1028 数的计算

    P1028 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该 ...

  10. Codeforces986C AND Graph 【位运算】【dfs】

    题目大意: 一张$ m $个编号互异点图,最大不超过$ 2^n $,若两个编号位与为0则连边,问连通块数量. 题目分析: 考虑怎样的两个点会连边.这种说法对于A和B两个点来说,就相当于B在A的0的子集 ...