JavaI/O流汇总
Java中常见流学习汇总
流的含义
流在Java中是指计算中流动的缓冲区。
从外部设备流向中央处理器的数据流成为“输入流”,反之成为“输出流”。
字符流和字节流的主要区别:
1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
常用流的总纲
字节流
字节输入流InputStream
FileInputStream、BufferedInputStream和DataInputStream
1.FileInputStream
FileInputStream(File file)
链接一个文件来创建字节输入流,即读取File所链接的文件FileInputStream(String name)
直接链接name(路径地址)所指定的文件常用方法
void close()
,关闭该输入流
2. BufferedInputStream缓冲输入
BufferedInputStream(InputStream in)
使用一个输入流作为参数创建缓冲输入流,例如BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:/Users/chang/Pictures/小火龙.jpg"));
BufferedInputStream(InputStream in,int size)
:创建一个具有指定缓冲区大小的缓冲输入流常用方法
void close()
;关闭此输入流int read()
;从输入流中读取数据的下一个字节int read(byte[] b,int off,int len)
:从此字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中。
byte[] b= new byte[1024*8];
int len;
while((len=bis.read(b))!=-1){
bos.write(b,0,len);
}
//读取数据示例
3. DataInputStream
DataInputStream(InputStream in)
- 常用方法
int read(byte[] b)
:从包含的输入流中读取一定数量的字节并将它们存储到缓冲区数组b中int read(byte[] b,int off,int len)
:从包含的输入流中将最多len个字节读入一个byte数组中
字节输出流OutputStream
FileOutputStream、BufferedOutputStream和DataOutputStream
1. FileOutputStream
FileOutputStream(File file)
:创建一个向指定File对象表示的文件中写入数据的文件输出流。FileOutputStream(String name)
:创建一个向具有指定名称的文件中写入数据的输出文件流。常用方法:
void close()
:关闭此文件输出流并释放与此流有关的所有系统资源。void write(byte[] b)
:将b.length个字节从指定byte数组写入此文件输出流中。void write(byte[] b,int off,int len)
:将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。void write(int b)
:将指定字节写入此文件输出流。
2.BufferedOutputStream缓冲
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流BufferedOutputStream(OutputStream out,int size)
:创建一个新的缓冲输出流,来将具有指定缓冲区大小的数据写入指定的底层输出流。- 常用方法
void flush()
:刷新此缓冲的输出流void write(byte[] b,int off,int len)
:将指定byte数组中从偏移量off开始的len个字节写入此缓冲的输出流。void write(int b)
:将指定的字节写入此缓冲的输出流。
public class BufferedDemo {
public static void main(String[] args) throws FileNotFoundException {
// 记录开始时间
long start = System.currentTimeMillis();
// 创建流对象
try (
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));
){
// 读写数据
int len;
byte[] bytes = new byte[8*1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0 , len);
}
} catch (IOException e) {
e.printStackTrace();
}
// 记录结束时间
long end = System.currentTimeMillis();
System.out.println("缓冲流使用数组复制时间:"+(end - start)+" 毫秒");
}
}
3.DataOutputStream
DataOutputStream(OutputStream out)
:创建一个新的数据输出流,将数据写入指定基础输出流。- 常用方法
void flush()
:清空此数据输出流void write(byte[] b,int off,int len)
:将指定byte数组中从偏移量off开始的len个字节写入基础输出流。
字符流
字符输入流Reader
1.FileReader
FileReader(File file)
: 创建一个新的 FileReader ,给定要读取的File对象。FileReader(String fileName)
: 创建一个新的 FileReader ,给定要读取的文件的名称。
public class FileReaderConstructor throws IOException{
public static void main(String[] args) {
// 使用File对象创建流对象
File file = new File("a.txt");
FileReader fr = new FileReader(file);
// 使用文件名称创建流对象
FileReader fr = new FileReader("b.txt");
}
}
常用方法
int read()
每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1
int read(char[] cbuf)
每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1
public class FRRead {
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileReader fr = new FileReader("read.txt");
// 定义变量,保存数据
int b ;
// 循环读取
while ((b = fr.read())!=-1) {
System.out.println((char)b);
}
// 关闭资源
fr.close();
}
}
public class FISRead {
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileReader fr = new FileReader("read.txt");
// 定义变量,保存有效字符个数
int len ;
// 定义字符数组,作为装字符数据的容器
char[] cbuf = new char[2];
// 循环读取
while ((len = fr.read(cbuf))!=-1) {
System.out.println(new String(cbuf,0,len));
}
// 关闭资源
fr.close();
}
}
2.BufferedReader缓冲
BufferedReader(Reader in)
:创建一个使用默认大小输入缓冲区的缓冲字符输入流。BufferedReader(Reader in,int sz)
:创建一个使用指定大小输入缓冲区的缓冲字符输入流。常用方法
void close()
:关闭该流并释放与之关联的所有资源。void mark(int readAheadLimit)
:标记流中的当前为止。boolean markSupported()
:判断此流是否支持mark()操作。int read()
:读取单个字符。int read(char[] cbuf,int off,int len)
:将字符读入数组的某一部分。String readLine()
:读取一个文本行。
字符输出流Writer
FileWriter
FileWriter(File file)
:根据给定的File对象构造一个FileWriter对象FileWriter(String filename)
:根据给定的文件名构造一个FileWriter对象常用方法
void writer(int c)
写入单个字符void write(char[] cbuf)
写入字符数组abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分,off数组的开始索引,len写的字符个数void write(String str)
写入字符串。void write(String str, int off, int len)
写入字符串的某一部分,off字符串的开始索引,len写的字符个数。void flush()
刷新该流的缓冲。void close()
关闭此流,但要先刷新它。
public class FWWrite {
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 写出数据
fw.write(97); // 写出第1个字符
fw.write('b'); // 写出第2个字符
fw.write('C'); // 写出第3个字符
fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。 /*
【注意】关闭资源时,与FileOutputStream不同。
如果不关闭,数据只是保存到缓冲区,并未保存到文件。
*/
// fw.close();
}
}
2.BufferedWriter缓冲
public BufferedReader(Reader in)
:创建一个 新的缓冲输入流。public BufferedWriter(Writer out)
: 创建一个新的缓冲输出流。// 创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
// 创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
特有方法
public void newLine()
: 写一行行分隔符,由系统属性定义符号。
public class BufferedWriterDemo throws IOException {
public static void main(String[] args) throws IOException {
// 创建流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
// 写出数据
bw.write("黑马");
// 写出换行
bw.newLine();
bw.write("程序");
bw.newLine();
bw.write("员");
bw.newLine();
// 释放资源
bw.close();
}
}
Java输入/输出流常用流分类
摘抄自<<Java疯狂讲义>>
注:下表中带斜体的是抽象类,不能创建对象。粗体部分是节点流,其他就是常用的处理流。
流分类 | 使用分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer | |
节点流 | 访问文件 | FileInputStream | FileOutStream | FileReader | FileWriter |
访问数值 | ByteArrayInputStream | ByteArrayOutStream | CharArrayReader | CharArrayWriter | |
访问管道 | PipedInputStream | PipedOutStream | PipedReader | PipedWriter | |
访问字符串 | StringReader | StringWriter | |||
处理流 | 缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | |||
对象流 | ObjectInputStream | ObjectOutputStream | |||
抽象基类(过滤) | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
打印流 | PrintStream | PrintWriter | |||
推回输入流 | PushbackInputStream | PushbackReader | |||
特殊流 | DataInputStream | DataOutputStream |
参考链接:https://www.cnblogs.com/lca1826/p/6427177.html
参考链接:https://www.cnblogs.com/moonpool/p/5488463.html
参考链接:https://www.cnblogs.com/xiohao/p/8997401.html
参考资料:《Java疯狂讲义》、黑马程序员课程讲义
最新文章
- 【PCB】【AD使用】多图纸设计
- 读取nutch爬取内容方法
- 每天一个linux命令(4):mkdir命令
- ubuntu 12.04亮度无法调节和无法保存屏幕亮度解决办法(echo_brightness)
- c3p0配置详解
- 学习笔记:js、css、html判断浏览器的各种版本
- 准备学一学go-lang啦 ~~ 学习Go应该用什么姿势? !
- Request/Server模式
- MON166 FAQ
- UIWebView与JS的深度交互-b
- 专题二、ArrayList序列化技术细节详解
- SPSS19.0实战之聚类分析
- [iOS]C语言技术视频-14-指针变量高级用法(函数指针)
- 在centos6上实现LAMP的FPM模式
- 项目总结2——mybatis配置的理解
- Day 23 面向对象(二)
- 使用C#+PowerShell进行Windows系统间文件传输
- ELK部署详解--kibana
- delphi 大文件的读写 使用 MapviewOffile
- ABP框架源码中的Linq扩展方法
热门文章
- 从RocketMQ的Broker源码层面验证一下这两个点
- Srping源码之BeanFactory.getBean
- Android Studio配置colors.xml
- docker部署skywalking
- 如何快速创建odoo模块,使用脚手架快速创建自己的odoo应用app
- EFCore3.1+编写自定义的EF.Functions扩展方法
- BBR拥塞算法的简单解释
- Fastbin attack 总结
- Java与Python中的‘%’运算符意义一样么?
- 1.设置和验证MySQL数据库的隔离级别