java流与文件——流

【0】README

0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——流 的相关知识;
0.2) 输入流和输出流(InputStream 和 OutputStream传输单位是基于单字节):

  • 0.2.1)输入流:可以从其中读入一个字节序列的对象,这个其中就叫做输入流,即我们可以从输入流中读入一个字节序列的对象;
  • 0.2.2)输出流:可以从其中写出一个字节序列的对象,这个其中就叫做输出流,即我们可以从输出流中写出一个字节序列的对象;
  • 0.2.3)抽象类 InputStream 和 OutputStream 构成了 输入输出类层次结构的基础;

0.3)引入 抽象类Reader 和 Writer(传输单位是基于两字节的Unicode码元,每次只传递一个字符,见read和write方法)

  • 0.3.1)problem: 因为面向字节的流不便于处理以 Unicode 形式存储的信息;
  • 0.3.2)solution:所以从抽象类 Reader 和 Writer 中继承出来了一个专门用于处理 Unicode字符的单独的类层次结构。这些类拥有的读入和写出操作都是基于两字节的 Unicode码元的, 而不是基于单字节的字符;(干货——Unicode码元==Unicode字符==两字节)

【1】读写字节

1.1)InputStream 类有一个抽象方法: abstract int read()
1.2)OutputStream类有抽象方法: abstract void write(int b)
1.3) read 和 write 方法 在执行时都将阻塞,直到字节确实被读入或写出;这意味着如果流不能被立即访问,则当前线程被阻塞;

  • 1.3.1)available 方法: 可以检查当前可读入的字节数量;
  • 1.3.2)close方法: 完成对流的读写后,用close 方法关闭它;且关闭一个输出流的同时还会冲刷(flush)缓冲区;
    缓冲区:所有被临时置于缓冲区中, 以便用更大的包的形式传递的字符在关闭输出流时被送出, 同时减少了访问硬盘的次数)(干货——缓冲区的定义和作用)
    • 1.3.2.1)如果不关闭文件, 那么写出字节的最后一个包可能将永远也不会传递出去;
  • 1.3.3)flush方法: 冲洗缓冲区的数据到流中,最后到达文件;

【2】完整的流家族

(图片来源: http://blog.csdn.net/hguisu/article/details/7418161)
这里写图片描述
2.1)InputStream 和 OutputStream

  • 2.1.1)DataInputStream 和 DataOutputStream: 可以以二进制格式读写所有的基本java类型;
  • 2.1.2)ZipInputStream 和 ZipOutputStream : 以常见的ZIP 压缩格式读写文件;
![这里写图片描述](https://img-blog.csdn.net/20160112133712321)
**2.2)Reader 和 Writer** * **2.2.1)read 方法:** 返回一个 Unicode 码元(一个在0 ~ 65535 间的整数), 或在碰到文件结尾时返回-1; * **2.2.2)write 方法:** 被调用时, 需要传递一个Unicode码元;
![这里写图片描述](https://img-blog.csdn.net/20160112133811813)![这里写图片描述](https://img-blog.csdn.net/20160112133821368)
**2.3)还有4个附加的接口: Closeable, Flushable, Readable, Appendable。** * **2.3.1)前两个接口非常简单, 它们分别拥有下面的方法:** close 和 flush 方法; * **2.3.2)InputStream, OutputStream , Read 和 Writer 都实现了 Closeable 接口;** **Attention)** * **A1)** Closeable 接口 extends AutoCloseable 接口, 因此对任何Closeable 进行操作时,都可以使用带资源的try 语句;**(干货——使用带资源的try 语句的条件是该类或接口要继承AutoCloseable接口)** * **A2)为什么要有两个接口呢?** 因为 Closeable 接口的close方法只抛出IOException, 而 AutoCloseable.close 可以抛出任何异常; * **2.3.3)** OutputStream 和 Writer 还实现了 Flushable 接口 * **2.3.4)Readable 接口只有一个方法:** int read(CharBuffer cb) * **2.3.4.1)CharBuffer 类:** 拥有按照顺序和随机地进行读写访问的方法, 它表示一个内存中的缓冲区或者一个内存映像的文件; * **2.3.5)Appendable 接口:有两个用于添加单个字符和字符序列的方法:** Appendable append(char c) Appendable append(CharSequence s) * **2.3.6)CharSequence 接口 :**描述了一个char 值序列的基本属性, String, CharBuffer, StringBuilder, 和 StringBuffer 都实现了它; * **2.3.7)**在流的家族中, 只有 Writer 实现了 Appendable 接口;
##**【3】组合流过滤器** **3.1)FileInputStream 和 FileOutputStream:** 可以提供附着在 一个磁盘文件上的输入流和输出流, 我们只需要提供完整路径名; **Hint)** 所有在 java.io 中的类都将相对路径名解释为以用户工作目录开始, 你可以通过调用 System.getProperty(“user.dir”) 来获得这个信息; **Warning)** * **W1)**对于可移植的程序来说, 应该使用程序所运行平台的文件分隔符, 通过 常量字符串 java.io.File.separator 来获得它; * **W2)**不推荐使用 单斜杠“/” 作为文件分隔符, 而使用 “\\”; **3.2)problem 和 solution ****(干货——这是产生组合流过滤器的原因)** * **3.2.1)problem:** 如果我们只有 DataInputStream, 我们就只能读入数值类型: DataInputStream din = … double s = din.readDouble(); 正如 FileInputStream 没有任何读入数值类型的方法一样, DataInputStream 也没有任何从文件中读取数据的方法: * **3.2.2)solution:** java使用了一种机制来分离这两种职责。某些流(如 FileInputStream 和 由 URL 类的openStream 方法返回的输入流) 可以从文件和其它位置获取字节, 而其他的流(如 DataInputStream 和 PrintWriter) 可以将字节组装到更有用的数据类型中; * **3.2.3)我们需要对它们进行组合, 看个荔枝:**为了从文件中读取数组,需要创建一个FileInputStream , 然后将其传递给 DataInputStream 的构造器:
FileInputStream fin = new FileInputStream("a.dat");
DataInputStream din = new DataInputStream(fin);
double s = din.readDouble();
![这里写图片描述](https://img-blog.csdn.net/20160112134434511) **3.3)嵌套过滤器添加多重功能** * **3.3.1)请求一个数据块并将其置于缓冲区中会更加高效, 添加这种缓冲机制:** DataInputStream din = new DataInputStream(new BufferedInputStream(new FileInputStream(“a.dat”))); * **Attention)**我们把 DataInputStream 放置在 构造器链 的最后,因为我们希望 使用 DataInputStream 的方法, 并且希望它们能够带有缓冲机制的 read 方法; * **3.3.2)PushbackInputStream(可回推输入流)** PushbackInputStream pbin = new PushbackInputStream(new BufferedInputStream(new FileInputStream(“a.dat”))); * **3.3.2.1) 现在,预读下一个字节: ** int b = pbin.read(); * **3.3.2.2)如果不满足,将其推回流中: ** pbin.unread(b); * **3.3.2.3)**但是读入和推回是可应用于可回推(pushback) 输入流的仅有 的方法; * **3.3.2.4)如果你需要预先浏览并且还可以读入数字, 那么你就需要一个既是可回推输入流,又是一个数据输入流的引用;**
PushbackInputStream pbin = new PushbackInputStream(new BufferedInputStream(new FileInputStream("a.dat")));
DataInputStream din = new DataInputStream(pbin);
![这里写图片描述](https://img-blog.csdn.net/20160112134500677)
注意: (转自, http://blog.csdn.net/u010700335/article/details/40155053) 如果文件串的最后一个字符是中文,使用mark()中的长度设为file.length() 如果文件的最后一个字符串是英文或数字,则java.io.IOException: Mark invalid,使用mark()中的长度设为file.length()+1 mark用于标记当前位置;在读取一定数量的数据(小于readlimit的数据)后使用reset可以回到mark标记的位置;FileInputStream不支持mark/reset操作;BufferedInputStream支持此操作; mark(readlimit)的含义是在当前位置作一个标记,制定可以重新读取的最大字节数,也就是说你如果标记后读取的字节数大于readlimit,你就再也回不到回来的位置了;通常InputStream的read()返回-1后,说明到达文件尾,不能再读取。除非使用了mark/reset。。
  • 3.3.3)看个荔枝: 可以通过一个 ZIP 压缩文件中通过使用下面的流序列读入数字:
ZipInputStream zin = new ZipInputStream(new FileInputStream("a.zip"));
DataInputStream din = new DataInputStream(zin);

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

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

相关文章

c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...

结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好?typedef struct person{char *name;int age;char sex[6];};该结构体中name用的是指针而不是数组,所以需要给字符串在堆上申请内存然后再赋值;…

java –cp ./:_成为Java流专家–第2部分:中级操作

java –cp ./:就像魔术棒一样,中间操作将一个Stream转换为另一个Stream。 这些操作可以无穷无尽的方式组合在一起,以可读有效的方式执行从简单到高度复杂的任务。 本文是五分之二,其中还有一个GitHub存储库,其中包含每个单元的说…

c语言编程代码对父母感恩,c语言中编程:每个做父母的都关心自己孩子成人后孩子的生高:...

c语言中编程:每个做父母的都关心自己孩子成人后孩子的生高:据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等.小孩成人后的身高与其父母的身高和自身的性别密切相关.设faHeight为其父身高,moHeight为其母…

Servlet之javaweb应用(二)

一、 使用 JavaEE 版的 Eclipse 开发动态的 WEB 工程(JavaWEB 项目) 1). 把开发选项切换到 JavaEE 2). 可以在 Window -> Show View 中找到 Package Explorer, 并把其拖拽到开发区的左边 3). 在 Servers 面板中新建 Tomcat 服务器. 一定要关联到 Tomcat 安装的根目录 4). 新…

java流与文件——文本输入输出

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——文本输入输出 的相关知识; 0.2) 在保存数据时,可以选择是二进制还是文本格式; 在存储文本字符串时, 需要考虑字…

RandomAccessFile类解析

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——RandomAccessFile类解析 的相关知识; 0.1) 本文 转自: http://blog.csdn.net/akon_vm/article/details/7429245 , for com…

Servlet之Tomcat配置与启动(一)

一、 部署并启动 tomcat 服务器 1). 解压 apache-tomcat-7.0.11.zip 到一个非中文目录下 2). 配置一个环境变量 java_home(指向 JDK 安装的根目录) 或 jre_home 3). 通过双击 apache-tomcat-6.0.16\bin 目录下的 startup.bat, 启动服务器 4). 可以在浏览器中输入 localhost:8…

随机数生成器c语言,句子随机生成器-怎么用C语言生成随机数

为随机数生成器初始化一个种子值在易语言中使用什么命令名置随机数种子 ()‘调用格式: 〈无返回值〉 置随机数种子 (〔整数型 欲置入的种子数值〕) - 系统核心支持库->算术运算英文名称:randomize为随机数生成器初始化一个种子值,不同的种…

nsstring 空值比较_用比较器的nulls排序具有空值的列表

nsstring 空值比较你好朋友, 在本教程中,我们将看到如何使用Java 8 Comparator.nullsFirst在列表中的项目很少为空时如何对项目列表进行排序,从而将null视为列表中的最小元素。 –什么是比较器 – nullsFirst方法在Comparator中做什么 –…

hibernate的Configuration和配置文件

一、hibernate的入口Configuration 在Hibernate中,Configuration是hibernate的入口。在实例化一个Configuration的时候,Hibernate会自动在环境变量(classpath)里面查找Hibernate配置文件hibernate.properties。如果该文件存在&…

单片机c语言6种开方,单片机快速开平方的算法

C语言中开平方的算法中要开平方的话,可以在头文件中加#include .然后调sqrt(n);函数即可.但在单片机中要开平方.可以用到下面算法:算法1:本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运…

spring 配置只读事务_只读副本和Spring Data第3部分:配置两个实体管理器

spring 配置只读事务我们之前的设置可以正常工作。 我们现在要做的是进一步发展,并配置两个单独的实体管理器,而不会影响我们之前实现的功能。 第一步是将默认实体管理器配置设置为主要配置。 这是第一步 package com.gkatzioura.springdatareadreplic…

java流与文件——读写二进制数据(DataOutput + DataInput)

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——读写二进制数据(DataOutput DataInput)的相关知识; 0.2) for complete my diy code, please visit https://github.com/p…

dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf

DSP课程设计-基于C语言实现256点的FFT精选XX 大学J1111111 UNIVERSITYDSP 课 程 设 计基于CCS 的FFT 算法的C 语言实现和验证学院名称:专业班级:学 号:学生姓名:指导教师姓名:201 年 0 月 0 日一、 课程设计目的1.此次…

java 字符数组与字符串_用于字符串和数组的5种简单有效的Java技术

java 字符数组与字符串Java通常会排在前五种最流行的编程语言中,因此可以理解。 它是一种通用语言,非常容易学习,因为它是一种高级语言,并且可以满足许多用例。 由于这些原因,Java是一门很棒的语言,可以用来…

Hibernate之映射

一、映射文件 Hibernate在实现ORM功能的时候主要用到的文件有: 1、 映射类(*.Java) 描述数据库表的结构,表的字段映射为类的属性,表的记录映射为类的对象。 2、映射文件(*.hbm.xml) …

java流与文件——ZIP文档

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——ZIP文档 的相关知识; 0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/cha…

单片机与gsm通信c语言,gsm模块如何与单片机通信?

51单片机与GSM模块实现通信1、检测串口线的好坏1)将串口线插在电脑上,用短路子短接串口的2脚和3脚2)打开串口调试助手3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能接收到自己发的数据表示串口线是正常的,…

aws terraform_在AWS第1部分中使用Terraform自动缩放组:基本步骤

aws terraform因此,您想使用Terraform在AWS上创建一个自动缩放组。 以下是达到此目的的最少步骤。 在编写实际代码之前,应指定aws terraform提供程序以及provider.tf文件上的区域。 provider "aws" { version "~> 2.0" region …

java流与文件——java生成解压缩文件(夹)

【0】README 0.1) 本文描述转自 http://blog.csdn.net/chenssy/article/details/9622171 , 旨在理解 java流与文件——java生成解压缩文件(夹) 的相关知识; 0.2) for my diy source code, please visit h…