Java IO(三)——字节流
一、流类
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盘下的Files文件夹里并没有"stream.txt"这个文件:
package com.demo; import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream; public class FileOutputStreamTest { public static void main(String[] args) throws Exception{
File file = new File("D:/Files/stream.txt");
OutputStream out = new FileOutputStream(file);
byte b[] = "Hello World!!!".getBytes(); //操作字节流,要转换成字节
out.write(b);
out.close();
}
}
此时打开"stream.txt":

到D盘下的Files文件夹里多了"stream.txt",且文件中的内容和我们写入的一致,同样这个例子也证明了FileOutputStream并不依赖指定路径下的文件是否存在。那如果指定路径下本来就有文件,那么写将会覆盖而不是追加,很好证明:
package com.demo; import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream; public class FileOutputStreamTest { public static void main(String[] args) throws Exception{
File file = new File("D:/Files/stream.txt");
OutputStream out = new FileOutputStream(file);
byte b[] = "abcdefghijklmnopqrstuvwxyz".getBytes(); //操作字节流,要转换成字节
out.write(b);
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盘下的Files文件夹生成的"stream.txt":
package com.demo; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream; public class FileInputStreamTest { public static void main(String[] args) throws Exception{
File file = new File("D:/Files/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)); }
}
运行结果为:
26
abcdefghijklmnopqrstuvwxyz
要区分清楚,OutputStream的作用是将内容由Java内存输出到文件中、InputStream是将内容由文件输入到Java内存中。read(byte b[])方法之前讲明了,表示"试图读取buffer.length个字节到buffer中,并返回实际读取的字节数",返回的是实际字节的大小。
Java IO(三)——字节流的更多相关文章
- Java IO(三)--字节流基本使用
I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通 ...
- Java IO: 其他字节流(上)
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackInputStream,SequenceInputS ...
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...
- java IO(三):字符流
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- java IO流——字节流
字节流主要操作byte类型数据,以byte数组为准,主要操作类有InputStream(字节输入流).OutputSteam(字节输出流)由于IputStream和OutputStream都是抽象类, ...
- java IO的字节流和字符流及其区别
1. 字节流和字符流的概念 1.1 字节流继承于InputStream OutputStream, 1.2 字符流继承于InputStreamReader OutputStre ...
- [Java IO]02_字节流
概要 字节流有两个核心抽象类:InputStream 和 OutputStream.所有的字节流类都继承自这两个抽象类. InputStream 负责输入,OutputStream 负责输出. 字节流 ...
- Java IO之字节流
Java中的输入是指从数据源等读到Java程序中,这里的数据源可以是文件,内存或网络连接,输出则是指从Java程序中写到目的地. 输入输出流可以分为以下几种类型(暂时不考虑File类) 类名 中文名 ...
- Java IO流-字节流
2017-11-05 17:48:17 Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流.字符流的出现是为了简化文本数据的读入和写出操作. 如果操作的文件是文本文件,那么使用字符流会大 ...
- Java—IO流 字节流
IO流(输入流.输出流),又分为字节流.字符流. 流是磁盘或其它外围设备中存储的数据的源点或终点. 输入流:程序从输入流读取数据源.数据源包括外界(键盘.文件.网络…),即是将数据源读入到程序的通信通 ...
随机推荐
- Python函数式编程(一):高级函数
首先有一个高级函数的知识. 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(x, y, f): return f(x) + f(y) 当我们调用add(-, , abs ...
- Android为TV端助力 eclipse出现感叹号的解决办法
当eclipse导入项目出现红叉但无提示错误时,去看:1>菜单路径----Window/Show View/Console2>菜单路径----Window/Show View/Error ...
- gitlab汉化
是上一片,我已经介绍了,如何安装gitlab 这篇文章讲解一下如何安装使用汉化gitlab 如需要查看如何安装gitlab,请访问:https://www.cnblogs.com/ws17345067 ...
- Caused by:org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type "" available: expected at least 1 bean which qualifies as autowire candidate
项目使用spring, mybatis.因为分了多个模块,所以会这个模块引用了其它模块的现在,结果使用Junit测试的时候发现有两个模块不能自动注入dao和service问题.解决后在此记录一下. 解 ...
- Essential pro angular and asp.net core 笔记
1. dotnet ef相关命令 删除数据库(适合只有一个数据库的情形) dotnet ef database drop --force 更新数据库(适合只有一个数据库的情形) dotnet ef d ...
- SogouCloud.exe进程导致SQL Server服务无法启动
早上打开笔记本想开启SQL Server服务时报错,于是根据提示查看windows日志: 依次点开报错发现第一条是1433端口被占用,于是找相关的进程: 于是杀掉此进程: taskkill /pid ...
- NLog简单使用
一.安装 二.安装后会在根目录出现NLog.config配置文件,简单修改配置文件为写入文件记录日志: <?xml version="1.0" encoding=" ...
- c/c++ vector,map,set,智能指针,综合运用的小例子
标准库,智能指针,综合运用的小例子 功能说明:查询单词在文件中出现的次数,如果在同一行出现多次,只算一次. 比如查询单词:你好 输出的结果: 你好 出现了:2次 (行号 2)xxxxxxx 你好 (行 ...
- 第八章 Hyper-V 2012 R2 故障转移群集
和终端用户相比,企业用户对于业务的连续性和可靠性更为在意.相对而言,企业一般不会将追逐单一硬件的性能排在第一位. 如何衡量业务是否持续可用,一般使用"x 个 9"这种方式来定义.如 ...
- 第十四届智能车队员培训 I/O的使用 数据方向寄存器和数据寄存器的配置 MC9S12D64处理器
I/O的使用 数据方向寄存器和数据寄存器的配置 I/O输入输出的使用: 数据方向寄存器与数据寄存器 寄存器的概念: 寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成.在集成电路设计中,寄存 ...