输入输出流:

• 输入/输出时, 数据在通信通道中流动。 所谓“数据流(stream)”指的是所有数据通信通道之中,数据的起点和终点。 信息的通道就是一个数据流。只要是数据从一个地方“流” 到另外一个地方,这种数据流动的通道都可以称为数据流。
• 输入/输出是相对于程序来说的。 程序在使用数据时所扮演的角色有两个:一个是源, 一个是目的。若程序是数据流的源, 即数据的提供者, 这个数据流对程序来说就是一个“输出数据流” (数据从程序流出)。 若程序是数据流的终点, 这个数据流对程序而言就是一个“输入数据流” ( 数据从程序外流向程序)
• 从功能上分为两大类:输入流和输出流。
• 从流结构上可分为字节流( 以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符) 。
• 字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。字符流是Java 1.1版后新增加的以字符为单位进行输入输出处理的流, 字符流输入输出的基础是抽象类Reader和Writer

• 需要声明:在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。

流的分类

• 节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
• 过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

字节流与字符流

• 字节流类(Byte Streams) 字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图象或声音等的二进制数据。
• 字符流类(Character Streams) 字符流类用于向字符流读写16位二进制字符。

Byte Streams Character Streams
InputStream Reader
OutputStream Writer

• 两种基本的流是:输入流(Input Stream)和输出流(Output Stream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。

输入流

读数据的逻辑为:
open a stream
while more information
read information
close the stream

输出流

写数据的逻辑为:
open a stream
while more information
write information
close the stream

字节流类以InputStream 和OutputStream为顶层类,它们都是抽象类(abstract)

• 抽象类InputStream 和 OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。两种
方法都在InputStream 和OutputStream中被定义为抽象方法。 它们被派生的流类重写。

OutputStream(字节输出流):将信息写到文件中

OutputStream是定义了Java流式字节输入模式的抽象类。该类的所有方法返回一个void值并且在出错的情况下引发一个IOException。

三个基本的写方法
abstract void write(int b) : 往输出流中写入一个字节。
void write(byte[] b) : 往输出流中写入数组b中的所有字节。
void write(byte[] b, int off,int len) : 往输出流中写入数组b中从偏移量off开始的len个字节的数据。

其它方法
void flush() : 刷新输出流,强制缓冲区中的输出字节被写出。
void close() : 关闭输出流,释放和这个流相关的系统资源。

• 通过打开一个到目标的输出流,程序可以向外部目标顺序写数据。当Java程序需要将数据输出到外设时, 可根据数据的不同形式, 创建一个适当的OutputStream子类类型的对象来完成与该外设的连接, 然后再调用执行这个流类对象的特定输出方法来实现对相应外设的输出操作。

FileOutputStream(文件字节输出流)

FileOutpuStream应该是Java中最常见的字节输出流了,它创建一个可向文件写入字节的类OutputStream,它常用的构造方法如下:

1、FileOutputStream(String name)

2、FileOutputStream(File file)

3、FileOutputStream(File file, boolean append)

前两个构造方法类似,前者输入文件的绝对路径,后者输入File的实例对象,推荐后者。第三个构造方法有一点不同

if true, then bytes will be written to the end of the file rather than the beginning

即原来的文件有内容的话不会冲掉,会在原有内容的基础上追加。

public class OutputStreamTest1 {
public static void main(String[] args) throws Exception { File file = new File("c:\\out.txt"); OutputStream os = new FileOutputStream(file, true); byte[] buffer = "hello world".getBytes(); os.write(buffer); os.close();
}
}

此时打开"out.txt":

aaarticlea/png;base64,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" alt="" />

看到C盘下多了"out.txt",且文件中的内容和我们写入的一致.

InputStream(字节输入流):将信息从文件读到程序中

InputStream是定义了Java流式字节输入模式的抽象类。该类所有方法在出错的时候都会引发一个IOException,InputStream提供的抽象方法有:

三个基本的读方法
abstract int read() : 读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。
int read(byte[] b) : 将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
int read(byte[] b, int off, int len) : 将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。 off指定在数组b中存放数据的起始偏移位置; len指定读取的最大字节数。

• 因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现,所以说只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。

其他方法

long skip(long n) : 在输入流中跳过n个字节,并返回实际跳过的字节数。
int available() : 返回在不发生阻塞的情况下,可读取的字节数。
void close() : 关闭输入流,释放和这个流相关的系统资源。
void mark(int readlimit) : 在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。
void reset() : 返回到上一个标记。
boolean markSupported() : 测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。

• 通过打开一个到数据源(文件、内存或网络端口上的数据)的输入流,程序可以从数据源上顺序读取数据。

FileInputStream(文件字节输入流)

FileInputStream是Java中最常见的字节输入流,它创建一个能从文件读取字节的InputStream类,它的两个常用构造方法如下:

1、FileInputStream(String name)

2、FileInputStream(File file)

推荐后者的用法。

public class InputStreamTest {
public static void main(String[] args) throws Exception { File file = new File("c:\\test.txt"); InputStream is = new FileInputStream(file); //缓存,读取的字节先放在缓存中
byte[] buffer = new byte[200]; //实际读取的字节数
int length = 0; while ((length = is.read(buffer, 0, 200)) != -1) { //把读取的字节数组转换成字符串
String str = new String(buffer, 0, length); System.out.println(str); } is.close(); }
}

运行结果

Heroes come and go!But legends are forever!
曼巴谢幕
传奇永恒

Java IO2:字节流的更多相关文章

  1. Java中字节流和字符流的比较(转)

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...

  2. java中字节流和字符流的区别

    流分类: 1.Java的字节流   InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先.2.Java的字符流  Reader是所有读取字符串输入流的祖先,而 ...

  3. java中字节流与字符流的区别

    字节流 在I/O类库中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,它们都是抽象类,不能实例化,数据流中的最小单位是字节,所以叫做字 ...

  4. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  5. OpenJDK 阅读源代码 Java 实现字节流输入类

    Java 的输入输出总是给人一种非常混乱的感觉.要想把这个问题搞清楚.必须对各种与输入输出相关的类之间的关系有所了解. 仅仅有你了解了他们之间的关系.知道设计这个类的目的是什么.才干更从容的使用他们. ...

  6. java使用字节流和字符流实现文件复制

    大家在Java开发中都会遇到文件复制的文件,众所周知,需要通过文件输入输出流实现. 那究竟该怎么做那,话不多说,直接上代码: 一,使用字节流复制文件 public class FileByteCopy ...

  7. Java 的字节流文件读取(一)

    上篇文章我们介绍了抽象化磁盘文件的 File 类型,它仅仅用于抽象化描述一个磁盘文件或目录,却不具备访问和修改一个文件内容的能力. Java 的 IO 流就是用于读写文件内容的一种设计,它能完成将磁盘 ...

  8. Java 的字节流文件读取(二)

    接着上篇文章,我们继续来学习 Java 中的字节流操作. 装饰者缓冲流 BufferedInput/OutputStream 装饰者流其实是基于一种设计模式「装饰者模式」而实现的一种文件 IO 流,而 ...

  9. Java中字节流和字符流复制文件

    字节流和字符流复制文件的过程: 1.建立两个流对象 绑定数据源和目的地 2.遍历出需复制的文件写入复制过后的新文件中(只不过是遍历的时候是区分字节和字符的) 3.访问结束后关闭资源 字节流复制文件: ...

随机推荐

  1. 应注意的Flex&Bison潜规则

    1.Flex的二义性模式 语法分析器匹配输入时匹配尽可能多的字符串 如果两个模式都可以匹配的话,匹配在程序中更早出的模式. 针对这一点的理解,在语法分析文件当中,token的识别,应从特殊到一般的过程 ...

  2. 完美高仿精仿京东商城手机客户端android版源码

    完美高仿精仿京东商城手机客户端android版源码,是从安卓教程网那边转载过来的,这款应用源码非常不错的,也是一个非常优秀的应用源码的,希望能够帮到学习的朋友. _js_op> <igno ...

  3. Open Live Writer增加代码插件

          作为一名程序员,免不了和代码打交道,自然在写博客的时候,也会用到代码的展示,Open Live Writer确实是一个不错的工具,不用再去登录博客的后台,就可以在本地进行文章的编写,但是致 ...

  4. Centos7下安装netstat

    刚安装centos7发想没有查看端口的命令 netstat yum install net-tools

  5. JSONP VS CORS

    What is JSONP ? http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about What is CORS? htt ...

  6. DigitalOcean(DO)购买VPS流程

    背景: 对于一个程序员来说,拥有自己的一台国外服务器是一种多么激动的事情,尽管配置不如自己电脑的1/5,但是想一想可以不用备案搭建网站,可以搭建shadow服务器,从此通过自己的服务器上网,想一想真是 ...

  7. kali使用随笔

    1.kali 默认禁用网络服务,显示设备未托管.需要在/etc/NetworkManager/NetworkManager.conf将managed=false修改为true,重启电脑. 2.自己利用 ...

  8. Hadoop fs命令详解

    本文非原创,转载自http://www.superwu.cn/2013/07/31/312 另外参考:http://www.blogjava.net/changedi/archive/2013/08/ ...

  9. 快速解码base64和utf-8的ASCII编码和URL解码

    看论坛上总是有人发乱七八糟的文字,根本看不懂,用下面的方法解密一下. 只要有浏览器的开发者工具就行了. UTF-16解码 console.log("\u5475\u5475") U ...

  10. c#的协变和逆变

    关于协变和逆变要从面向对象继承说起.继承关系是指子类和父类之间的关系:子类从父类继承,所以子类的实例也就是父类的实例.比如说Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是D ...