io系列之字节流

  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 方法。

转载于:https://www.cnblogs.com/soficircle/p/6714315.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell for循环1到100_浅谈Linux下shell 编程的for循环常用的6种结构

浅谈Linux下shell 编程的for循环常用的6种结构1、 常用for循环结构(1)for 变量 in 值1 值2 值3...do程序块儿done(2)for 变量 in 命令 (或者$())do程序块儿done(3)for 变量 in {1..100}do程序块儿done(4)for 变量 in "$"do程序块儿done(5)for 变量 in /etc/*.confdo程…

案例163:基于微信小程序的校园二手交易平台系统设计与开发

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...

来源:专知【导读】生成式对抗网络(Generative Adversarial Networks,GANs)作为近年来的研究热点之一,受到了广泛关注,每年在机器学习、计算机视觉、自然语言处理、语音识别等上大量相关论文发表。密歇根大学…

201521123035《Java程序设计》第八周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容。 1.2 选做:收集你认为有用的代码片段 //泛型方法,打印MyStack的所有元素的薪水,不管MyStack中的元素是Employee类型或者Employee的子…

x79主板bios设置详解_BIOS(主板)常用功能:设置启动磁盘

BIOS是什么?BIOS是英文"Basic Input Output System"的缩写,翻译成中文名称就是"基本输入输出系统"。BIOS是个人电脑启动时加载的第一个软件,是连接电脑硬件和软件的枢纽,有多重要就不言而喻了吧!B…

mysql内部实现原理面试_理解完这些基本上能解决面试中MySql的事务问题

事务是指逻辑上的一组操作,要么都执行,要么都不执行,事务的特性(ACID)原子性(Atomicity):事务是不可分割的工作单元,要么都成功,要么都失败, 如果事务中一个sql语句执行失败,则已执行的语句也必…

《自然-神经科学》发表脑智卓越中心关于昼夜节律中枢的研究成果

来源:脑智卓越中心昼夜节律在生物体中广泛存在,对调节人们一天之中的运动、睡眠、代谢等诸多生理过程起着重要的作用。目前认为哺乳动物的昼夜节律是由位于大脑中的视交叉上核(Suprachiasmatic Nucleus, SCN)控制的。SCN能够接收视…

mybatis 打印sql_mybatis-plus 3.1.0 发布,划重点一大波升级

mybatis-plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件, 减少你的开发周期优化动态维护 XML 实体字段,无入侵全方位 ORM 辅助层让您拥有更多时间吃鸡、陪家人、陪朋友。更新日志升级 mybatis 到 3.5.0 版本升级 mybatis-spri…

201521123059 《Java程序设计》第八周学习总结

1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合与泛型相关内容。 1.2 选做&#xff1a;收集你认为有用的代码片段 简单泛型定义&#xff1a; public class Pair<T> {public Pair(T first, T second) {this.first first; this.…

mysql driver 读写分离_Mysql主从复制和读写分离实践

1、主从复制原理MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后&#xff0c;其作为master&#xff0c;它的数据库中所有操作都会以“事件”的方式记录在二进制日志中&#xff0c;其他数据库作为slave通过一个I/O线程与主服务…

二十世纪最伟大的10大算法

来源&#xff1a;数学中国发明十大算法的其中几位算法大师1、1946 蒙特卡洛方法[1946: John von Neumann, StanUlam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook upthe Metropolis algorithm, also known as the Monte Carlo method.]1946年&…

mybatis 动态字段与表中不一样_8.mybatis的基本工作流程(2.0)※

mybatis的基本工作流程1.读取配置文件&#xff0c;配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。2.有了这些信息就能创建SqlSessionFactory&#xff0c;SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡3.SqlSessionFactory建…

题目填坑计划

一个蒟蒻的最后的挣扎 吉林 JLOI 2016 侦察守卫 树形DP 可怕的题目&#xff0c;照题解抄了一遍&#xff0c;和它相似的题目还有HDU5290BombingPlan 方 容斥乱搞 可怕的题目&#xff0c;看题解懂的&#xff0c;但是完全写不来 成绩比较 组合DP 找题解理解了并且做完了&#xff0…

判断表达式值是否为空_如何在 Python 中判断列表是否为空

在判断列表是否为空时&#xff0c;你更喜欢哪种方式&#xff1f;决定因素是什么&#xff1f;在 Python 中有很多检查列表是否是空的方式&#xff0c;在讨论解决方案前&#xff0c;先说一下不同方法涉及到的不同因素。我们可以把判断表达式可以分为两个阵营&#xff1a;对空列表…

HDU 5890 Eighty seven(DP+bitset优化)

题目链接 Eighty seven 背包&#xff08;用bitset预处理&#xff09;然后对于每个询问O&#xff08;1&#xff09;回答即可。 预处理的时候背包。 #include <bits/stdc.h>using namespace std;#define rep(i, a, b) for(int i(a); i < (b); i) #define dec(i, …

《Lancet》发表全球学者联合声明!

来源&#xff1a;中国生物技术网 2020年2月18日&#xff0c;《LANCET》上发表通讯&#xff08;Correspondence&#xff09;文章&#xff0c;全球科学家发表声明反对阴谋论&#xff0c;全力支持奋战在疫情一线的中国科研技术工作者。就像病毒没有国界一样&#xff0c;科学也没有…

python时间序列库_时间序列数据处理python 库

【注】本人原创&#xff0c;最初发表于CSDN&#xff0c;后发布于知乎。为避免误会为抄袭&#xff0c;特此说明 由于我热衷于机器学习在时间序列中的应用&#xff0c;特别是在医学检测和分类中&#xff0c;在尝试的过程中&#xff0c;一直在寻找优质的Python库&#xff08;而不是…

python代数式的表达方式_关于python字典类型最疯狂的表达方式

一个Python字典表达式谜题让我们探究一下下面这个晦涩的python字典表达式&#xff0c;以找出在python解释器的中未知的内部到底发生了什么。# 一个python谜题&#xff1a;这是一个秘密# 这个表达式计算以后会得到什么结果&#xff1f;>>>{True: yes, 1: no, 1.0: mayb…

【LeetCode】152. Maximum Product Subarray

题目&#xff1a;   Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product 6. 题解&#xff1a; 先暴力解&am…

“哥德尔不完备定理”到底说了些什么?

来源&#xff1a; 赵昊彤科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-409681-1067019.html 【编者按&#xff1a;不知为何&#xff1f;一直不相信已有的数理、物理、生理、心理、管理……能够研究好人机融合智能系统。究其因&#xff0c;需要出现新的数/物…