关闭

Java IO 3:字节流

标签: IONIOjava
97人阅读 评论(0) 收藏 举报
分类:

流类

Java的流式输入/输出是建立在四个抽象类的基础上的:InputStream、OutputStream、Reader、Writer。它们用来创建具体的流式子类。尽管程序通过具体子类执行输入/输出操作,但顶层类定义了所有流类的基本通用功能。

InputStream和OutputStream为字节流设计,Reader和Writer为字符流设计,字节流和字符流形成分离的层次结构。一般来说,处理字符或字符串使用字符流类,处理字节或二进制对象使用字节流

操作文件流时,不管是字符流还是字节流,都可以按照以下方式进行:

1、使用File类找到一个对象

2、通过File类的对象去实例化字节流或字符流的子类

3、进行字节(字符)的读、写操作

4、关闭文件流

 

OutputStream(字节输出流)

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

方    法 作    用
void close() 关闭输入流,关闭后的写操作会引发IOException
flush() 刷新此输入流并强制写出所有缓冲的输出字节
write(byte[] b) 向输入流写入单个字节,注意参数是一个int型,它允许设计者不必把参数转换成字节型就可以调用write()方法
write(byte[] b, int off, int len) 以b[off]为起点,向文件写入字节数组b中len个字节
write(int b) 向一个输出流写一个完整的字节数组

 

FileOutputStream(文件字节输出流)

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

1、FileOutputStream(String name)

2、FileOutputStream(File file)

3、FileOutputStream(File file, boolean append)

前两个构造方法类似,前者输入文件的绝对路径,后者输入File的实例对象,和RandomAccessFile一样,推荐后者。第三个构造方法有一点不同,append如果设置为true,文件则以搜索路径模式打开。FileOutputStream的创建不依赖于文件是否存在,在创建对象时,FileOutputSStream会在打开输出文件之前就创建它。这种情况下如果试图打开一个只读文件,会引发IOException。FileOutputStream,写一个例子,现在我的D盘路径下并没有"stream.txt"这个文件:

复制代码
public static void main(String[] args) throws Exception
{
    File file = new File("D:/stream.txt");
    OutputStream out = new FileOutputStream(file);;
    byte b0[] = "abcdefghijklmnopqrstuvwxyz".getBytes(); //操作字节流,要转换成字节
    out.write(b0);
    out.close();
}
复制代码

此时打开"stream.txt":

看到D盘下多了"stream.txt",且文件中的内容和我们写入的一致,同样这个例子也证明了FileOutputStream并不依赖指定路径下的文件是否存在。那如果指定路径下本来就有文件,那么写将会覆盖而不是追加,很好证明:

复制代码
public static void main(String[] args) throws Exception
{
    File file = new File("D:/stream.txt");
    OutputStream out = new FileOutputStream(file);;
    byte b0[] = "abcdefghijklmnopqrstuvwxyz".getBytes(); //操作字节流,要转换成字节
    out.write(b0);
    out.close();
}
复制代码

此时再打开"stream.txt":

"stream.txt"中的内容变掉了,证明了结论。

 

InputStream(字节输入流)

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

方    法 作    用
int available() 返回当前可读的字节数
void close() 关闭此输入流并释放与该流关联的所有系统资源,关闭之后再读取会产生IOException
int mark(int readlimit) 在输入流中放置一个标记,该流在读取N个Bytes字节前都保持有效
boolean markSupported() 如果调用的流支持mark()/reset()就返回true
int read() 如果下一个字节可读取则返回一个整形,遇到文件尾时返回-1
int read(byte b[]) 试图读取buffer.length个字节到buffer中,并返回实际成功读取的字节数,遇到文件尾则返回-1
int read(byte b[], int off, int len) 将输入流中最多len个数组直接读入byte数组,off表示数组b中写入数据的初始偏移量。注意,三个read方法,在输入数据可用、检测到流末尾或者抛出异常前,此方法将一直阻塞
void reset() 重新设置输入指针到先前设置的标记处
long skip(long n) 跳过和丢弃此输入流中数据的n个字节

 

FileInputStream(文件字节输入流)

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

1、FileInputStream(String name)

2、FileInputStream(File file)

和FileOutputStream差不多,推荐后者的用法。FileInputStream,同样写一个例子,操作的是上面D盘下生成的"stream.txt":

复制代码
public static void main(String[] args) throws Exception
{
    File file = new File("D:/stream.txt");
    InputStream in = new FileInputStream(file);
byte b1[] = new byte[(int)file.length()]; int i = 0; i = in.read(b1); System.out.println(i); System.out.println(new String(b1, 0, i)); }
复制代码

运行结果为:

20
Hello World!!!

要区分清楚,OutputStream的作用是将内容由Java内存输出到文件中、InputStream是将内容由文件输入到Java内存中。read(byte b[])方法之前讲明了,表示"试图读取buffer.length个字节到buffer中,并返回实际读取的字节数",返回的是实际字节的大小。不要误以为"Hello World!!!"是14个字符即28个字节,字节流底层是以byte为单位的,因此文件里面只有14个字节罢了,至于返回的是20,还是因为"字节对齐"的问题。

这里没有演示skip方法,因为比较简单,skip多少无非少读几个字节罢了,skip(3),那么读出的就是"lo World!!!",可以自己尝试一下。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Java之IO流---字节流

1.概述1.1 IO流的引入 IO流在很多语言已有体现,诸如C语言的stdio.h,C++中的iostream。Java中的IO流大抵是用于在控制台、磁盘、内存上进行数据的读写操作,完成数据的传递...
  • qq_28261343
  • qq_28261343
  • 2016-09-27 19:23
  • 4136

Java基础:IO流之字节流和字符流

一、流的概念流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。一个流,必有源端和目的端,它们...
  • axi295309066
  • axi295309066
  • 2016-10-15 00:23
  • 1297

黑马程序员-Java I/O流(一)-IO流概述、字符流、字节流、流操作规律

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-1. 概述 流:可以理解数据的流动,就是一个数据流。Java中与IO相关的类有很多,都集中在java.io...
  • u012561959
  • u012561959
  • 2015-11-05 04:24
  • 1505

java io字符流和字节流实例

字节流,一般用于处理二进制数据,包括图片,视频,音频等 package com.javaio.myinputstream; import java.io.BufferedInputStream; ...
  • pingnanlee
  • pingnanlee
  • 2013-07-19 14:10
  • 2500

java IO之字节流和字符流比较

1、 比特、字节和字符的定义      这个很基础,但是在开头说一下还是有必要的      比特:bit(binarydigit),信息的基本单元。只有两种取值:0或者1.    &#...
  • Allenalex
  • Allenalex
  • 2016-03-08 18:05
  • 775

【Java基础知识】IO流--字节流读写数据以及复制文件的几种方式

1、IO的分类A、按照流向【参照物JVM】 输入流 : 读取数据 输出流 : 写出数据 B、按照数据类型 (1)字节流 a、字节输入流 读取数...
  • zhuwenchao90
  • zhuwenchao90
  • 2017-01-18 15:55
  • 2284

Java基础知识IO流(字节流的缓存区并自定义)

字节流缓存区 自定义字节流缓存区 read()和write()方法的特点 字节流缓存区字节流也有缓存区 BufferedInputStream BufferedInputStream 为另一个输入...
  • u013951760
  • u013951760
  • 2016-04-27 16:34
  • 2120

Java中IO体系字节流与字符流之适配器模式

在java 的IO体系中,除了常用到的装饰模式外,还有一个常用的设计模式:适配器设计模式,主要用来实现字节流和字符流类的适配转换工作。相比装饰模式而言,适配器模式就相对简单多了,完成一个适配器模式需要...
  • qq838642798
  • qq838642798
  • 2017-01-03 11:50
  • 330

关于IO的6个课上小实验

实验1 package testIo; //在D盘目录下创建HelloWorld.java //使用字节流的方式进行文件的读取并打印至控制台 //计算所读取到的字节数,并在控制台打印 impo...
  • qq_30950703
  • qq_30950703
  • 2015-09-22 19:24
  • 152

IO流----文件字节流、文件字符流

流的分类 •按流向分: ◦输入流:程序从数据源读取数据的流 ◦输出流:程序向数据源写入数据的流 •按数据传输单位分: ◦字节流:以字节为单位传输数据的流 ◦字符流:以字符为单位传输数据的流 •...
  • u010037865
  • u010037865
  • 2016-05-09 20:34
  • 1606
    个人资料
    • 访问:41641次
    • 积分:777
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:112篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论