天道酬勤,学无止境

065.JAVA输入输出_包装流的概念和缓冲流

  • 1. 包装流的概念
  • 2. 缓冲流
    • 2.1. 缓冲流的概述
      • 2.1.1. 缓冲流读取文件的过程
    • 2.2. 字节缓冲流
      • 2.2.1. 字节输入缓冲流常用构造器
      • 2.2.2. 字节输出缓冲流常用构造器
      • 2.2.3. 用法实例
    • 2.3. 字符缓冲流
      • 2.3.1. 输入流增强的方法
      • 2.3.2. 输出流增强的方法

1. 包装流的概念

  • 处理流/包装流(相对于节点流更高级):

    • 隐藏了底层的节点流的差异, 并对外提供了更方便的输入/输出功能,
      让开发者只需要关注高级流的操作, 是对字节流的一种增强操作.
    • 使用处理流包装了节点流程序直接操作处理流, 让节点流与底层的设备做 io 操作.
    • 只需要关闭处理流即可.
  • 包装流如何区分:
    在创建流对象的时候需要传递另一个流对象, 这种流对象就是包装流对象.
    例如: new包装流(流对象);



博主的 Github 地址


2. 缓冲流

2.1. 缓冲流的概述

  • 是一个包装流, 目的起缓存作用, 缓冲流还能优化 io 效率, 使速度提升.
    因此操作字节或字符流的时候, 都建议使用缓冲流进行包装, 提高运行效率.

  • 缓冲流一共有四种:

    • BufferedInputStream
    • BufferedOutputStream
    • BufferedReader
    • BufferedWriter
  • 直接操作的缺陷:
    操作流的时候习惯定义一个 byte/char 数组.
    int read() 方法每次都从磁盘文件中读取一个字节.
    这样直接操作磁盘文件性能极低.

  • 解决方案:
    定义一个数组作为缓冲区. 例如 byte[] buffer = new byte[1024];
    一次性从磁盘文件中读取 1024 个字节并放入缓冲区中.
    这样会减少操作磁盘文件次数, 程序性能得以提升.
    因此在 JAVA 中所提供的缓存区默认大小是 8192byte.

2.1.1. 缓冲流读取文件的过程

  • 读取文件的流程和写入文件流程相似, 假定现在是读取操作
    • 首先输入缓冲流定义了大小为 8092 字节的缓冲区, 然后一次从文件中读取 8092 字节
    • 当缓冲区存放够了 8092 个字节的数据后, 就会进行数据转移, 从内存转移到程序中去
    • 转移过程会使用字节输入流并根据用户定义的字节数组, 分批将这些字节数据进行转移.
  • 下一步进行写入操作, 那么又会再次分批次将字节存入输出缓冲流的缓冲区中
    • 转移过程会使用到字节输入流来从内存获取数据, 并分批转移到缓冲区中进行存放
    • 当输出缓冲流的缓冲区存满或不再被写入的时候, 就将缓冲区内容一次转移到文件中去.

2.2. 字节缓冲流

  • BufferedInputStream 字节缓冲输入流

    • BufferedInputStream 为另一个输入流添加一些功能,
      即缓冲输入以及支持 markreset 方法的能力.
  • BufferedOutputStream 字节缓冲输出流

    • 该类实现缓冲的输出流. 通过设置这种输出流, 程序就可将各个字节写入底层输出流中,
      而不必针对每次字节写入调用底层系统

2.2.1. 字节输入缓冲流常用构造器

  • BufferedInputStream(InputStream in)
    • 作用:
      创建一个 BufferedInputStream 并保存其参数, 即输入流 in, 以便将来使用.

2.2.2. 字节输出缓冲流常用构造器

  • BufferedOutputStream(OutputStream out)
    • 作用:
      创建一个新的缓冲输出流, 以将数据写入指定的底层输出流.

2.2.3. 用法实例

  • 实际上和其它的输入输出流用法相仿, 但提高了性能.

    public static void main (String[] args) throws Exception{
      //字节缓冲输出流
      BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream("stream.txt",true));
      bos.write("hello world".getBytes());
      bos.close();
    
      //字节缓冲输入流
      BufferedInputStream bin = new BufferedInputStream(new FileInputStream("stream.txt"));
      byte[] buffer = new byte[1024];
      int len = -1;
      while((len = bin.read(buffer)) != -1){
          System.out.println(new String(buffer, 0,len)) ;
      )
      bin.close();
    }

2.3. 字符缓冲流

  • BufferedReader 字符缓冲输入流
  • BufferedWriter 字符缓冲输出流
  • 在使用上和字节缓冲流相似.

2.3.1. 输入流增强的方法

  • String readLine()
    • 作用:
      读取一个文本行.

2.3.2. 输出流增强的方法

  • void newLine()
    • 作用:
      写入一个行分隔符.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 您能解释一下流的概念吗?(Can you explain the concept of streams?)
    问题 我知道流是字节序列的表示。 每个流都提供用于将字节读取和写入其给定的后备存储的方法。 但是,流的意义是什么? 为什么我们与之交互的后备商店本身不存在? 无论出于何种原因,这个概念都无法满足我的需求。 我读了很多文章,但我想我需要一个类比之类的东西。 回答1 选择“流”一词是因为它在现实生活中表示的含义与我们在使用它时要传达的含义非常相似。 让我们稍微忘记一下后备店,然后开始考虑与水流的类比。 您会收到连续的数据流,就像水在河中不断流动一样。 您不一定知道数据来自何处,而且通常不需要。 无论是来自文件,套接字还是其他任何来源,都没有(应该)没有关系。 这与接收水流非常相似,您无需知道水的来源。 无论是来自湖泊,喷泉还是其他任何来源,都没有(应该)没有关系。 就是说,一旦您开始考虑只关心获取所需数据(无论它来自何处),其他人谈论的抽象就会变得更加清晰。 您开始认为可以包装流,并且您的方法仍然可以完美地工作。 例如,您可以这样做: int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); } // in another method: Stream fileStream = new FileStream("My Data.dat"); Stream zipStream = new
  • JAVAOOP-16 IO流
    JAVAOOP-16 IO流 一. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 ​ 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 ​ 流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。 ​ 实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。 ​ 形象的比喻——水流 ,文件**======**程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。 二. 流的分类 按输入输出分: ​ 输入流: Reader, InputStream类型的子类 ​ 输出流: Writer, OutputStream类型的子类 java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream)
  • 黑马程序员Java 全课程目录【999集】
    视频链接 : https://www.bilibili.com/video/BV1uJ411k7wy下面是 999集全课程目录,tips : [ ctrl +f ] 序号视频名称101_Java语言发展史202_计算机进制转换303_计算机存储单元404_命令提示符_基本介绍505_命令提示符_常用命令606_Java语言的跨平台性707_JDK、JRE与JVM808_JDK的下载与安装909_环境变量的配置1010_HelloWorld程序的代码编写1111_HelloWorld程序的编译运行1212_-HelloWorld的常见问题与Notepad++使用1313_程序注释与HelloWorld说明1414_关键字的概念与特征1515_标识符的概念与规则1616_常量的概念与分类(1)1717_常量的打印输出1818_基本数据类型1919_变量的概念与定义格式2020_变量的基本使用2121_变量的注意事项2201_数据类型转换_自动转换2302_数据类型转换_强制转换2403_数据类型转换_注意事项2504_ASCII编码表2605_算术运算符_四则与取模运算2706_算术运算符_加号的多种用法2807_算术运算符_自增自减运算符2908_赋值运算符3009_比较运算符3110_逻辑运算符3211_三元运算符3312_方法入门_概念引入3413_方法入门_方法的定义3514
  • 什么是流?(What is a stream?)
    问题 在编程世界中什么是流? 我们为什么需要它? 如有可能,请类比说明。 回答1 流表示一系列对象(通常是字节,但不一定是字节),可以按顺序访问。 流上的典型操作: 读取一个字节。 下次阅读时,您将获得下一个字节,依此类推。 从流中读取几个字节到一个数组中搜索(在流中移动当前位置,以便下次阅读时从新位置获取字节) 写一个字节将数组中的几个字节写入流中从流中跳过字节(这类似于读取,但是您忽略了数据。或者,如果您更喜欢它,则类似于seek,但只能前进。) 将字节推回输入流中(这类似于“撤消”以进行读取-您将一些字节推回流中,以便下次阅读时将看到此内容。对于解析器而言,它有时是有用的,如下所示: 偷看(不读字节就看字节,以便它们仍然存在于流中以供以后读取) 特定的流可能支持读取(在这种情况下为“输入流”),写入(“输出流”)或两者兼而有之。 并非所有流都是可搜索的。 推回相当少见,但您始终可以通过将实际输入流包装在另一个具有内部缓冲区的输入流中来将其添加到流中。 读取来自缓冲区,如果您往回推,则会将数据放入缓冲区。 如果缓冲区中没有任何内容,则推回流将从实际流中读取。 这是“流适配器”的一个简单示例:它位于输入流的“末端”,它本身就是输入流,并且做了一些原始流不具备的其他功能。 Stream是一个有用的抽象,因为它可以描述文件(实际上是数组,因此查找很简单),而且可以描述终端输入/输出
  • 深入学习JAVA -IO流详解
    目录 (一)IO流基本概念(二)文件字节输入流(2.1)使用输入流的4个基本步骤(2.2)构造方法(2.2)使用输入流读取文件 (三)文件字节输出流(3.1)使用输出流的4个基本步骤(3.2)构造方法(3.3)使用输出流写字节 (四)文件字符输入、输出流(五)缓冲流(5.1)缓冲流概述(5.2)构造方法 (六)随机流(6.1)概述(6.2)构造方法 (七)数组流(八)数据流(8.1)概述(8.2)代码实现 (九)对象流 (一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入、输出。 (二)文件字节输入流 (2.1)使用输入流的4个基本步骤 1.设定输入流的源。 2.创建指向源的输入流。 3.让输入流读取源中的数据。 4.关闭输入流。 (2.2)构造方法 如果对文件读取需求比较简单,从文件系统中的某个文件中获得输入字节,可以使用文件字节输入流FileInputStream类。 构造方法: // 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定 FileInputStream(File file) //
  • Java I / O中的“ Stream”和“ Buffer”到底是什么意思?(What exactly does “Stream” and “Buffer” mean in Java I/O?)
    问题 我刚刚学习了使用BufferedReader输入/输出。 我想知道术语Stream和Buffer确切含义是什么? 这行代码还为我们提供了什么: BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 回答1 Java有两种用于输入和输出(I / O)的类:流和读取器/写入器。 流( InputStream , OutputStream和扩展它们的所有内容)用于从文件,网络或任何其他设备读取和写入二进制数据。 读者和作家用于阅读和书写文本(字符)。 它们是流之上的一层,它使用字符编码将二进制数据(字节)转换为字符,然后转换回字符。 从磁盘逐字节读取数据效率很低。 一种加快速度的方法是使用缓冲区:不是一次读取一个字节,而是一次读取几千个字节,然后将它们放入内存的缓冲区中。 然后,您可以一一查看缓冲区中的字节。 Oracle的有关I / O的Java教程对此进行了详细说明。 查看您提供的代码行: BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.in是一个InputStream 。 您创建一个InputStreamReader ,它从System.in中读取字节。 然后
  • javacode基本概念语法--学习笔记
    javacode学习笔记大纲 一、语法规范二、键盘输入三、数据类型分类及类型转换四、局部变量、switch-case、随机数五、函数六、数组1.基础概念2.数组扩容及排序3.保留小数(扩充) 七、面向对象1.面向对象的思想:2.特点3.类的概念4. 如何编写一个类5.面试题+应用6.方法的概念7.方法重载8.构造方法9.对象的创建过程(初步认识)10.this关键字 八、三大特性1.基础概念2.四个访问修饰符3.方法覆盖4.set、get方法5.继承6.对象的创建过程(重新认识)7.super关键字 九、多态1.概念2.特点3.instanceof关键字 十、三个修饰符1.static 静态的2.final3.abstract抽象的 十一、接口1.基础概念及语法2.implements关键字3.特点4.接口回调5.JDK高版本的一些新特性(jdk8.0、jdk9.0)6.接口的分类7.Comparable接口 十二、内部类1.成员内部类2.静态内部类3.局部内部类4.Lambda表达式 十三、常用类1.Object类2.包装类3.自动装箱、拆箱4.常用方法:5.String、StringBuilder、StringBuffer的区别 十四、集合1.基础概念2.Collection接口3.List接口及其实现类4.Collections工具类5.Set接口及其实现类6
  • JAVA I/O流的分类
    Java中 对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将 这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分。   二、分类   流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕。流分类的方式很多:   1、按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序。   2、按照处理数据的单位不同分,字节流和字符流,字节流读取的最小单位是一个字节(1byte=8bit),而字符流一次可以读取一个字符(1char = 2byte = 16bit)。   3、按照功能的不同分,分节点流和处理流,节点流是直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的 一种流,FileInputStream是一个节点流,可以直接从文件读取数据,但是BufferedInputStream可以包装 FileInputStream,使得其有缓冲功能。   其实除了以上三种分类外,还有一些常常听到的一些分类比如:对象流、缓冲流、压缩流、文件流等等。其实都是节点流和处理流的子分类。当然你也可以创建新的流类型,只要你需要。   三、流分类的关系   不管流的分类是多么的丰富和复杂
  • FileInputStream与FileReader(FileInputStream vs FileReader)
    问题 FileReader rd=new FileReader("new.mp4"); FileWriter wr=new FileWriter("output.mp4"); int ch; while((ch=rd.read())!=-1) wr.write(ch); wr.flush(); wr.close(); 当我使用FileReader和FileWriter读写mp4文件时, output.mp4文件无法很好地呈现。 但是当我使用FileInputStream和FileOutputStream它工作得很好。 因此,我可以得出结论FileReader和FileWriter仅用于读取和写入文本吗? 回答1 是的,您的结论是Reader和Writer正确子类适用于读取/写入文本内容。 InputStream / OutputStream用于二进制内容。 如果您看一下文档: Reader用于读取字符流的抽象类 InputStream抽象类是表示字节输入流的所有类的超类。 回答2 FileReader (以及其他扩展Reader的东西)的确适用于text 。 从阅读器的文档中: 读取字符流的抽象类。 (强调一下。)查看一下API,您将发现它与文本有关–整个地方都是char而不是byte 。 InputStream和OutputStream用于二进制数据,例如mp4文件。
  • Java IO——字节流和字符流详解&区别对比
    Java IO——字节流和字符流详解&区别对比 概述 大多数应用程序都需要实现与设备之间的数据传输,在Java中,将这种通过不同输入输出设备(例如:输入设备、内存、显示器、网络等)之间的数据传输抽象的表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中,称之为IO(输入输出)流。 IO流,即InputOutput的缩写。 Java IO库有两个支系: 面向字节流的InputStream和OutputStream面向字符的Reader和Writer java流在处理上分为字符流和字节流。实际上字节流的InputStream和OutputStream是一切的基础。实际总线中流动的只有字节流。需要对字节流做特殊解码才能得到字符流。Java中负责从字节流向字符流解码的桥梁是:InputStreamReader和InputStreamWriter。 字节流&字符流 大多数情况下,字节是数据最小的基本单位,1 byte = 8 bit,而 1 char = 2 byte = 16 bit。 流 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 Java中的流是对字节序列的抽象
  • 字节流和字符流的区别
    视频课堂 https://edu.csdn.net/course/play/8034 字节流和字符流概念 字节流和字符流都有输入和输出方式 字节输入流和输出流的祖先:InputStream和OutputStream 字符输入流和输出流的祖先:Reader和Writer 以上这些类都是abstract修饰的抽象类,不能直接实例化对象 在开发之中,对于字节数据处理比较多,例如,图片,电影,文字 字符流最大的好处是它可以进行中文的有效处理。如果在日常开发中有中文处理,用字符流,如果没有,建议使用字节流。 ———————————————— 字节流没有使用到缓冲区,字符流使用到了缓冲区,在缓冲区的数据需要使用close()或者flush()方法将其强行输出。程序没有关闭数据是不会从缓冲区输出出来的。 来源:https://aaaedu.blog.csdn.net/article/details/104369312
  • Java BIO
    Java 中 IO 系统可以分为Bio,Nio,AIO 三种IO模型 BIO,同步阻塞IO模型,Bio操作的对象:流,以及如何使用Bio进行网络编程,使用Bio进行网络编程的问题。 NIO,同步非阻塞IO模型,多路复用IO模型,以及NIO中的Buffer,Channel,Selector概念,以及如何使用Nio进行网络编程 AIO,异步非阻塞IO模型,AIO可以使用集中方式实现异步操作,以及如何使用Aio进行网络编程。 BIO BIO是同步阻塞IO,JDK之前只有这一个IO模型,BIO操作的对象是流,一个线程只能处理一个流的IO请求,如果想要同时处理多个流就需要使用多线程。 流包括字符流和字节流,流从概念上来说是一个连续的数据流,当程序需要读数据的使用就需要使用输入流读取数据,当需要往外写数据的使用就需要输出流。 流 BIO中操作的流主要由两大类,字节流和字符流,两类根据流的方向都可以分为输入流和输出流,按照类型和输入输出方向可以分为: 输入字节流InputStream 输出字节流OutputStream 输入字符流Reader 输出字符流Writer 字节流主要用来处理字节或二进制对象,字符流用来处理字符文本或字符串 使用InputStreamReader 可以姜输入字节流转化为输入字符流 Reader reader = new InputStreamReader
  • IO的GoF装饰器模式的用例和示例(Use Cases and Examples of GoF Decorator Pattern for IO)
    问题 我在维基百科中已经读到Decorator模式用于.Net和Java IO类。 谁能解释这是如何使用的? 举一个可能的例子,它的好处是什么? 维基百科上有一个Windows表单示例,但我想知道Java IO类如何发生这种情况。 回答1 InputStream是一个抽象类。 大多数具体的实现(例如BufferedInputStream,GzipInputStream,ObjectInputStream等)都有一个构造函数,该构造函数采用同一抽象类的实例。 这就是装饰器模式的识别键(这也适用于采用相同接口实例的构造函数)。 使用此类构造函数时,所有方法都将委派给包装的实例,并改变方法的行为方式。 例如,预先在内存中缓冲流,预先解压缩流或以不同方式解释流。 有些甚至具有其他方法,这些方法最终也进一步委托给包装的实例。 这些方法用额外的行为来修饰包装的实例。 假设我们在Gzipped文件中有一堆序列化的Java对象,并且我们想快速读取它们。 首先打开它的输入流: FileInputStream fis = new FileInputStream("/objects.gz"); 我们需要速度,所以让我们将其缓冲在内存中: BufferedInputStream bis = new BufferedInputStream(fis); 该文件已压缩,因此我们需要将其解压缩:
  • 字节流和字符流详解
    1.流的概念 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 2.流的分类 按照流向可以分为:输入流(如:键盘,麦克风),输出流(如:显示器,音箱) 按照传输单位可以分为:字节流和字符流 3.什么是字节流,什么是字符流 字节流: 它处理单元为1个字节(byte),操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流好点(1byte = 8位); 字符流: 它处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,如果是关系到中文(文本)的,用字符流好点(1Unicode = 2字节 = 16位); 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能
  • 标准I/O
    在Linux环境下进行IO操作的两种方式:标准I/O和文件I/O 1.文件的概念和类型 概念:一组相关数据的有限集合 文件类型(7种) (1)常规文件(r):又分为文本文件、二进制文件等 (2)目录文件(d) (3)字符设备文件(c) (4)块设备文件(b) (5)符号链接文件(l) (6)管道文件(p) (7)套接字文件(s) 注意第(3)个和第(4)个每一个中的每个设备文件代表一个具体的设备,Linux下访问设备时同样是当做文件去进行访问。 第(5)个是可以通过符号链接文件访问他所指向的文件 注意:不同的操作系统,所支持的文件类型也不相同 2.标准I/O特点 标准IO是由ASCI C 标准定义,即可以理解为是在c库中一些定义好的输入输出的一组函数 只要有C库,就可以使用标准IO。主流操作系统上都实现了C库,即不管是在Windows下还是Linux下都可以使用标准IO,通过标准IO来访问文件。 标准IO通过缓冲机制减少系统调用,实现更高的效率 解释: 1.系统调用 (1)代码直接操作硬件(类似于单片机),是没有操作系统的 (2)带操作系统,如下图: 此处的接口就是系统调用,注意不同的操作系统的系统调用接口是不一样的 理解:有操作系统的话应用程序不能直接操作硬件,需要通过操作系统的接口来操作硬件。操作系统是多任务的,可以同时处理多个应用程序
  • java IO流之字节流
    1 IO流相关概念 1.1 什么是IO流? IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 1.2 IO流分类 按流向来分 输入流InputStream Reader(读取数据) 输出流OutStream Writer(写数据) 按操作类型分 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 字符流 : 字符流只能操作纯字符数据 1.3 Java中常用IO流的类 字节流的抽象父类: InputStream 输入流 OutputStream 输出流 字符流的抽象父类: Reader 字符读取流 Writer 字符写入流 2 InputStream InputStream是抽象类,表示字节输入流,用于读数据。 直接已知子类: AudioInputStream ByteArrayInputStream FileInputStream(学习文件输入流) FilterInputStream ObjectInputStream PipedInputStream SequenceInputStream StringBufferInputStream InputStream之FileInputStream 概述: FileInputStream 从文件系统中的某个文件中获得输入字节
  • java字节流
    字节流: 有两个根类:输入流:InputStream 输出流:OutputStream 这两个根类流都是抽象类 字节输出流: OutputStream:方法 write(int by):写一个字节数据 write(byte[] by) :将by写到目的地 write(byte[] by,int index,int len):将by一部分数据写到目的地 close():关闭流 子类:FileOutputStream,文件输出流对象 构造方法: FileOutputStream(File/String filename) FileOutputStream(File/String, boolean append) append:true表示不会覆盖文件,而是追加数据写到原有内容末尾 字节输入流: 字节输入流的根类:InputStream抽象类 方法: int read():读取一个字节数据,如果读取到末尾返回-1. int read(byte[] by):读取数据存储到by中,返回读取到的字节数,末尾返回-1 int read(byte[] by, int index,int len):读取数据存储到by的一部分中,返回读取到的字节数,末尾返回-1 close():关闭流 子类对象: FileInputStream 构造方法: FileInputStream(File/String
  • 文件描述符和文件指针之间有什么区别?(What's the difference between a file descriptor and file pointer?)
    问题 我想知道文件描述符和文件指针之间的区别。 另外,在哪种情况下,您会使用一种而不是另一种? 回答1 文件描述符是一个低级整数“句柄”,用于在Linux和其他类似Unix的系统中在内核级别标识打开的文件(或套接字,或其他)。 您将“裸”文件描述符传递给实际的Unix调用,例如read() , write()等。 FILE指针是C标准库级别的构造,用于表示文件。 FILE包装文件描述符,并添加缓冲和其他功能以简化I / O。 您将FILE指针传递给标准C函数,例如fread()和fwrite() 。 回答2 一个被缓冲( FILE * ),另一个不被缓冲。 实际上,除非您知道自己在做什么,或者除非文件实际上是套接字等等,否则您几乎总是在从“真实”文件中读取文件时(即在驱动器上)使用FILE * 。 您可以使用fileno()从FILE *获取文件描述符,并且可以使用fdopen()从文件描述符打开缓冲的FILE * 回答3 文件描述符只是从POSIX open()调用中获得的整数。 使用标准的C fopen()您将获得一个FILE结构。 FILE结构包含此文件描述符以及其他内容,例如文件结束和错误指示符,流位置等。 因此,与open()相比,使用fopen()给您一定数量的抽象。 通常,您应该使用fopen()因为它具有更高的可移植性
  • java对象转化为流_Java I/O 流之转换流
    一、转换流简介 Reader 和 Writer 最重要的子类是 InputStreamReader 和 OutputStreamWriter 类。用来实现将字节流与字符流的相互转换,是字符流与字节流之间的桥梁。 1、InputStreamReader InputStreamReader 类包含了一个底层输入流,可以从中读取原始字节。它根据指定的编码方式,将这些字节转换为 Unicode 字符。构造方法: //创建一个使用默认字符集的 InputStreamReaderInputStreamReader(InputStream in){} //创建使用指定字符集的 InputStreamReaderInputStreamReader(InputStream in, String charsetName){}参数:InputStream in:字节输入流,用来读取文件中保存的字节 String charsetName:指定的编码表名称(不区分大小写,不指定默认使用utf-8)使用步骤:创建InputStreamReader对象,构造方法中传递字节输入流对象和指定的编码名称 使用InputStreamReader对象的方法read读取文件 释放资源 2、OutputStreamWriter OutputStreamWriter 从运行的程序中接收 Unicode 字¬
  • std :: cout是否被缓冲?(Is std::cout buffered?)
    问题 刚刚读了《斯科特·迈耶斯》(Scott Meyers)的一篇古老而有趣的文章 http://aristeia.com/Papers/C++ReportColumns/novdec95.pdf 基本上,这是关于优先使用'\n'不是std::endl (我同意并且多年来使用相同的增量)。 但是最后一部分表明这没有包括在他的书中,因为有两点使整个事情变得毫无意义: std::cout未缓冲。 未明确定义std :: cout上ios::unitbuf的状态(因此取决于实现)。 我做了一个快速浏览,但无法找到一个明确的参考标准为1是真实的。 std::cout无缓冲的,与我一直理解的相反吗? 回答1 是的,它被缓冲了: C ++ 11 27.4.2 [narrow.stream.objects] / 3:对象cout控制输出到与对象stdout关联的流缓冲区 本文指的是C ++ 98标准的1995年草稿版本。 我不知道那是否说了些不同的话。 对于第2点,除了cerr和wcerr明确指定wcerr外,所有单元上的unitbuf最初均为false(由basic_ios构造basic_ios的后置条件指定)。 同样,在提到的古代草案中,这可能完全不同。 回答2 首先,不要求取消缓冲std::cout (甚至std::cerr )。 唯一的要求是std::cerr必须设置std::basic