java基础知识I/O流使用详解

“流”概念源于UNIX中的管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等,它屏蔽了实际的I/O设备中处理数据的细节。   一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可以分为两类:输入流和输出流。其实输入/输出是想对于内存来说的。实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对于输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。

a.流:一组有序的数据序列。
b字节流:数据流中最小的数据单元是字节。
c.字符流:数据流中最小的数据单元是字符。

一.  java.io包中的类对应两类流

一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流,其他的流则称为过滤流(包装流)

过滤流:一些流可以从文件以及其他地方接收字节,另一些流可以将字节组合成更有用的数据类型。将一个已经存在的流传递给另一个流的构造方法,将这两种流结合起来,结合后的流被称为过滤流。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流也类似。我们很少用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能(即装饰器设计模式)。

java的常用输入、输出流其实都是继承自4个抽象类,分别是:

基于单字节的InputStream,OutputStream类(面向字节形式的I/O)
基于双字节的Unicode代码单元的 Reader, Writer类(面向字符形式的I/O)
一旦打开输入流后,程序就可从输入流串行地读数据。从输入流读/写数据的过程一般如下:打开一个流通道-->读取/写信息-->关闭流通道。

在java平台中,有以下两种方式能获得本地平台的字符编码类型:

(a)System.getProperty("file.encoding");

(b) Charset cs=Charset.defaultCharset();

所有的输入流、输出流都可以分为字节(输入、输出)流,字符(输入、输出)流,处理字节的主要是(OutputStream/InputStream) 系列,处理字符的,主要是(Reader/Write)系列

二.以字节(Byte)为导向的输入流(InputStream系列),这几个类都可以与FileInputStream对象相连以提供有用接口:

ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
StringBufferInputStream(在java1.1中已经弃用了):把一个String对象作为InputStream,底层实现使用StringBuffer
FileInputStream:把一个文件作为InputStream,实现对文件的读取操作(文件名、文件、FileDescriptor对象)
PipedInputStream:实现了pipe的概念,主要在线程中使用(作为多进程中的数据源)
SequenceInputStream:把多个InputStream合并为一个InputStream
以字节(Byte)为导向的输出流(OutputStream系列),可以与FilterOutputStream对象相连以提供有用接口:

ByteArrayOutputStream:在内存中创建缓冲区,把信息存入内存中的一个缓冲区中,缓冲区初始化尺寸(可选)
 FileOutputStream:把信息存入文件中(文件名、文件、FileDescriptor)
PipedOutputStream:实现了pipe的概念,主要在线程中使用(指定用于多线程的数据的目的地)

三.与之对应的(Reader/Writer)系列

Reader:                 与InputStream相对应,适配器InputStreamReader
Writer:                 与OutputStream相对应,适配器为OutputStreamWriter
FileReader:              与FileOutputStream相对应
 FileWriter:             与FileOurputStream相对应
 StringReader:           无相对应的类
StringWriter:           与ByteArrayInputStream相对应
CharArrayReader:        与ByteArrayOutputStream相对应
 CharArrayWriter:        与ByteArrayOutputStream相对应
 PipedReader:            与PipedInputStream相对应
 PipedWriter:            与PipedOutputStream相对应

四.两种不限导向的stream之间的转换(使用适配器类)

InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集

.通过FilterInputStream从InputStream读取数据

DataInputStream:从stream中读取基本类型(int、char,long等)数据。
BufferedInputStream:使用缓冲区 ,使用它可以防止每次读取都得进行实际的读操作
LineNumberInputStream:会记录input stream内的行数,然后可调用getLineNumber()和setLineNumber(int)
PushbackInputStream:很少用到,一般用于编译器开发
通过FilterOutputStream向OutputStream写入:

DataIOutputStream:可以按照移植方式往stream中输出基本类型(int、char,long等)数据。
 BufferedOutputStream:使用缓冲区 ,使用它可避免每次发送数据都进行实际的写操作
 PrintStream:产生格式化输出 ,其中DataOutputStream处理数据的存储,PrintStream处理显示

六.更改流的行为

尽管BufferedOutputStream是FilterOutputStream的子类,但是BufferedWriter并不是FilterWriter的子类,(FilterWriter是抽象类,没有任何子类)

没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
BufferedReader:与BufferedInputStream对应
 LineNumberReader:与LineNumberInputStream对应
PushBackReader:与PushbackInputStream对应
BufferedWrite:与BufferedOutStream对应
PrintWrite:与 PrintStream对应

七.自我独立的类:RandomAccessFile

这个类适用于有大小已知的记录组成的文件,RandomAccessFile除了实现了DataInput和DataOutput接口(DataInputStream和DataOutputStream也实现了这两个接口)之外,这个类是个完全独立的类,它拥有和别的I/O类型本质不同的行为,可以在一个文件内向前和向后移动,直接从Object派生而来。

可通过RandomAccessFile对象完成对文件的读写操作
在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
可以直接跳到文件中指定的位置
RandomAccessFile的大部分功能(不是全部)有nio存储映射文件所取代

(0)

相关推荐

  • Java 面试题基础知识集锦

    经典的Java基础面试题集锦,欢迎收藏和分享. 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示"main方法不是public的". 问题:Java里的传引用和传值的区别是什么? 答案:传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝. 问题:如果要重写一个对象的equals方法,还要考虑什么? 答案:hashCode. 问题:Java的"一次编写,处处运行"是如何实现的? 答案:Java程序会被编译成字节码组成

  • Java的Socket网络编程基础知识入门教程

    一.TCP/IP简介 TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中. TCP/IP协议族包括了IP协议.TCP协议和UDP协议. IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失.乱序或者 重复发送.TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用 程序间建立起透明的连接. 不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接, 之后通过在消息中加入序列号来恢复消息中的错误.而UDP只是简单地扩展了IP协议, 使它

  • javaBean的基础知识及常见乱码解决方法

    javaBean的基础知识及常见乱码解决方法 乱码问题应该是做javaWeb开发人员都遇到过的问题吧,这个问题当时还影响了我学习Java的想法,甚至有过想放弃的想法,没办法,当时年轻,呵呵.其实产生乱码问题的原因有很多,解决乱码的问题也有很多,现在就一一来看一下: 出现乱码的地方大致可以分为以下三种: 1 jsp页面中 2 jsp页面之间相互传参的参数 3 与数据库中数据的存取 解决方案大致可以分为三种: 1 出现在jsp页面中,是由于没有设置jsp页面的中文字符编码.   2 出现在jsp页面

  • servlet基础知识_动力节点Java学院整理

    Servlet是一门专门用于开发动态web资源的技术,Sun公司在其API中提供了一个Servlet接口(当然,我们不会去直接实现这个接口,而是去继承其实现类会更好),因此,狭义的Servlet是指这个接口,广义的Servlet是指任何实现了这个Servlet接口的类. 使用Servlet开发一个动态web资源,其实就是开发一个Java程序向浏览器输出数据. Servlet其实就是一个运行在服务器上得Java程序,Servlet是J2EE十三门技术中的一种,因此我们不能去看J2SE的API文档,

  • java 基础知识之网络通信(TCP通信、UDP通信、多播以及NIO)总结

    java 基础知识之网路通信总结 在这篇文章里,我们主要讨论如何使用Java实现网络通信,包括TCP通信.UDP通信.多播以及NIO. TCP连接 TCP的基础是Socket,在TCP连接中,我们会使用ServerSocket和Socket,当客户端和服务器建立连接以后,剩下的基本就是对I/O的控制了. 我们先来看一个简单的TCP通信,它分为客户端和服务器端. 客户端代码如下: 简单的TCP客户端 import java.net.*; import java.io.*; public class

  • Java基础知识精选 你答对了几道?

    没有技术深度是大多程序员的一种常态. 但是当你成为一个资深的工程师的时候,很多公司并不希望你还是那样平庸,没有深度.虽然你会纳闷,我就算有深度你们也不一定用得上呀?然而到了这个级别的人需求量并不像初中级开发那么多,公司更理性和稳妥的做法是选择有深度的人,不是吗? Integer比较 看下面这段有意思的代码,对数字比较敏感的小伙伴有没有发现异常? public static void main(String[] args) { Integer a = 128,b=128; Integer c =

  • Java基础知识之Java语言概述

    Java语言是SUN(Stanford University Network,斯坦福大学网络公司)公司1995年推出的一门高级编程语言,起初主要应用在小型消费电子产品上,后来随着互联网的兴起,Java语言迅速崛起(Java applet 可以在浏览器中运行),成为大型互联网项目的首选语言. 2009年04月20日,美国甲骨文公司74亿美元收购Sun,取得java的版权. Java 是面向对象的语言,没有面向对象编程经验的读者需要花费不少时间来了解面向对象的概念.语法和编程思想,有不能理解的地方请

  • Java中的数组基础知识学习教程

    数字 通常情况下,当我们处理数字时,使用原始数据类型,如 byte,int,long,double 等. 示例 int i = 5000; float gpa = 13.65; byte mask = 0xaf; 然而,在开发中,我们会遇到需要使用对象而不是原始数据类型的情况.为了实现这个, Java 为每个原始数据类型提供包装类. 所有的包装类 (Integer, Long, Byte, Double, Float, Short) 是抽象类 Number 的子类. 这种包装是由编译器处理,这个

  • java 基础知识之IO总结

    java  基础知识之IO总结     我计划在接下来的几篇文章中快速回顾一下Java,主要是一些基础的JDK相关的内容. 工作后,使用的技术随着项目的变化而变化,时而C#,时而Java,当然还有其他一些零碎的技术.总体而言,C#的使用时间要更长一些,其次是Java.我本身对语言没有什么倾向性,能干活的语言,就是好语言.而且从面向对象的角度来看,我觉得C#和Java对我来说,没什么区别. 这篇文章主要回顾Java中和I/O操作相关的内容,I/O也是编程语言的一个基础特性,Java中的I/O分为两

  • java基础知识I/O流使用详解

    "流"概念源于UNIX中的管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等,它屏蔽了实际的I/O设备中处理数据的细节.   一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL. 流的方向是重要的,根据流的方向,流可以分为两类:输入流和输出流.其实输入/输出是想对于内存来说的.实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对于输入流,可不必

  • java基础(System.err和System.out)详解

    今天有位同事在使用System.err和System.out遇上了一些小问题. 看了些资料总结下: 1.JDK文档对两者的解释: out:"标准"输出流.此流已打开并准备接受输出数据.通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标. err:"标准"错误输出流.此流已打开并准备接受输出数据.通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标.按照惯例,此输出流用于显示错误消息,或者显示那些即使用户输出流(变量 out 的值)已经重

  • 微信小程序开发数据缓存基础知识辨析及运用实例详解

    提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容. 提示:以下是本篇文章正文内容,下面案例可供参考 一.微信数据缓存是什么? 在实际开发中,在用到一个数据时,我们需要调用api接口去得到,然后渲染在页面中,但是对于一些数据,是经常需要使用的,如果每次使用时都需要调用api接口,会十分麻烦.数据缓存就解决了这个问题,我们可以在初次调用某api得到数据的同时将数据缓存,那么在之后的使用过程

  • Java基础之枚举Enum类案例详解

    一.文章序言 Java中引用类型:数组.类.接口.枚举.注解 枚举这个既熟悉又陌生的东西具体再哪里可以使用呢? 什么是枚举? 枚举是一个引用类型,枚举就是一个规定了取值范围的变量类型. 枚举变量不能使用其他的数据,只能使用枚举中常量赋值.提高程序安全性: //格式: public enum 枚举名{ //枚举的取值范围 //枚举中可以生命方法 } 枚举的使用场景介绍? 1.最常见的情况如星期,相关变量我们会在Java里面重复使用,在这里我们就可以来定义一个叫做"星期"的枚举. publ

  • Java基础语法之二维数组详解

    一.二维数组 进入正题之前.首先为了便于大家理解,我画了一个图: xx枪战游戏中, 我是一个刚刚注册账号的小白,系统送了我两把枪,此时,我的武器库只有这么一层(可以理解为一位数组,枪就是对应的数组中对应的元素) 经过艰苦卓绝的战斗,终于有了一笔钱,现在我打算配置好的游戏装备,我现在有了一个枪柜,它可以存放三层的枪械,每一层都可以放多把武器(这个就是二维数组,有多层,每层都是一个一维数组) 随着游戏时长和我的高超技术,获取游戏装备的效率越来越高了,一个枪柜已经存不下了,于是,我就有了多个枪柜(这个

  • Java基础之内存泄漏与溢出详解

    一.浅析 内存泄露( memory leak):是指程序在申请内存后,无法释放已申请的内存空间,多次内存泄露堆积后果很严重,内存迟早会被占光.内存泄漏最终会造成内存溢出. 内存溢出(out of memory) :是指程序在申请内存时,没有足够的内存空间供其使用 JVM中有一下几种内存空间: 栈内存(Stack):每个线程私有的. 堆内存(Heap):所有线程公用的. 方法区(Method Area):有点像以前常说的"进程代码段",这里面存放了每个加载类的反射信息.类函数的代码.编译

  • Java基础之Web服务器与Http详解

    目录 Web服务器 技术讲解 PHP: JSP/Servlet Web服务器 IIS Tomcat JAVA jdk中的内容 Tomcat Tomcat根目录下的内容 Tomcat的配置 Http 1.什么是Http 2.两个时代 3.Http请求 4. Http响应 Web服务器 技术讲解 微软:国内最早流行的就是ASP 在HTML中嵌入了VB的脚本,ASP+COM 在ASP开放中,基本一个页面都有几千行的业务代码,页面极其混乱 维护成本高 PHP: PHP开发速度很快,功能很强大,跨平台,代

  • Java基础类库之StringBuffer类用法详解

    StringBuffer类 String类是在所有开发项目开发之中一定会使用的一个功能类,并且这个类拥有如下功能 每个字符串的常量都属于一个String类匿名对象,并且不能修改: String类有两个常量池:静态常量池.运行常量池: String类对象实例化建议直接使用赋值的形式完成,这样可以直接将对象保存在对象池中方便下次重用: 虽然String类很好用,但是我们发现它也有弊端,就是内容不允许频繁修改,所以为了解决问题,我们提供了StringBuffer类 StringBuffer 并不像St

  • Java基础知识之CharArrayWriter流的使用

    目录 Java CharArrayWriter流 一.CharArrayWriter流定义 二.CharArrayWriter流构造函数 三.CharArrayWriter流实例域 四.CharArrayWriter流方法 四.CharArrayWriter流的作用 Java基础之什么是CharArrayWriter 下面的例子阐述了CharArrayWriter Java CharArrayWriter流 一.CharArrayWriter流定义 API说明:该类实现了一个可用作字符输出流的字

  • Java基础篇之反射机制示例详解

    目录 一.什么是反射: 二.反射的原理: 三.反射的优缺点: 四.反射的用途: 五.反射机制常用的类: 六.反射的基本使用: 1.获得Class:主要有三种方法: 2.判断是否为某个类的示例: 3.创建实例:通过反射来生成对象主要有两种方法: 4.通过反射获取构造方法并使用: 5.获取成员变量并调用: 6.获取成员方法并调用: 7.反射main方法: 8.利用反射创建数值: 9.反射方法的其他使用--通过反射运行配置文件内容: 10.反射方法的其他使用--通过反射越过泛型检查: 总结 一.什么是

随机推荐