流类

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) throwsException

{

File file= new File("D:/stream.txt");

OutputStream out= newFileOutputStream(file);;byte b0[] = "abcdefghijklmnopqrstuvwxyz".getBytes(); //操作字节流,要转换成字节out.write(b0);

out.close();

}

此时打开"stream.txt":

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

public static void main(String[] args) throwsException

{

File file= new File("D:/stream.txt");

OutputStream out= newFileOutputStream(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) throwsException

{

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));

}

运行结果为:

20Hello World!!!

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

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

java lo流_javaIO:字节流相关推荐

  1. lo流知识(字节流 字符流)

    概述:lo流分为字节流字符流 字节流分为:输出流和输入流 输入流:从文件到控制台(把数据从其他设备输到内存中去)读操作 输出流:从控制台到文件(把数据从内存上输出到别的地方)写操作 按数据类型分: 字 ...

  2. 黑马程序员——Java字符流、字节流IO流

    黑马程序员--Java字符流.字节流Io流 ---------------------- <a href="http://www.itheima.com"target=&qu ...

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

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  4. java字符流和字节流的区别_java字符流与字节流的区别是什么

    java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...

  5. java字符流和字节流的区别

    理解Java中字符流与字节流的区别 1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个&qu ...

  6. Java—字符流和字节流

    字符流和字节流的区别 二进制文件只能使用字节流进行复制 文本文件的复制既可以使用字符流也可以使用字节流

  7. java字符流和字节流写入读取文件

    FileOutputStream类使用字节流操作文件,文件每次读取/写入以字节为单位 import java.io.*;public class FileByte{public static void ...

  8. java -- IO流之字节流

    Java类库中的IO类,可以从不同的角度将其进行不同的分类.比如按数据的流向可分分为输入流和输出流:按数据处理单位的不同,又可将其分为字节流和字符流.但不管怎样分,其本质都是一样的.本人更倾向将其分成 ...

  9. java字符流和字节流转换_java中字符流和字节流的转换

    看到InputStreamReader和OutputStreamWriter的一些说法, 说InputStreamReader是将字节流转换成字符流,而OutputStreamWriter则相反,是将 ...

最新文章

  1. Bmu计算机,高性能定点DSP位处理单元BMU的 - 处理器/DSP - 电子发烧友网
  2. 如何防止apk程序被反编译
  3. 如何使用'git reset --hard HEAD'恢复到之前的提交? [重复]
  4. Tensorflow快餐教程(8) - 深度学习简史
  5. 【转】在生产环境中部署前端代码
  6. 实验15:通过注解分别创建Dao、Service、Controller★
  7. 云鲸扫拖一体机器人说明书_比老公更好用的扫拖一体机—自动洗拖布的云鲸扫拖机器人使用体验...
  8. 游国色天香中国馆有感
  9. oracle挂载到空闲进程,Oracle部分后台进程
  10. 新手如何制作专业的思维导图
  11. android手机charles证书下载
  12. 王石:中国楼市泡沫必破 目前只是时间问题
  13. Method annotated with @Bean is called directly. Use dependency injection instead.
  14. 一个程序员的时间管理(GTD)
  15. Spark 内存管理内存空间分配_大数据培训
  16. CJ20N - 项目定义屏幕增强(SMOD: CNEX0006)
  17. honts/htonl等大小端转换函数的原理
  18. 计算机校园网网络工程论文,关于网络工程研究及校园网设计的论文
  19. 阿里巴巴2014校招笔试题-2013年9月14日
  20. 玩转华为ENSP模拟器系列 | 通过STelnet登录其他设备举例(ECC)

热门文章

  1. MySQL5.7 - 基于GTID复制模式搭建主从复制
  2. 24. Swap Nodes in Pairs
  3. 云端迁移需谨遵四大关键步骤
  4. oracle 12c多租户下的日常操作变化
  5. 动态路由协议RIP的基本原理与配置
  6. VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
  7. nova-scheduler详解 openstack-ice版
  8. getGeneratedKeys自动获取主键的方法
  9. 谈谈机器学习模型的部署
  10. [算法]华为笔试题——拼音与英文转换