
Java学习之IO流
发布日期:2021-05-09 03:33:02
浏览次数:17
分类:博客文章
本文共 9987 字,大约阅读时间需要 33 分钟。
简单介绍
•概念
按照流的方向分为 输入流(InputStream) 与 输出流(OuputStream);
- 输入流:只能读取数据,不能写入数据
- 输出流:只能写入数据,不能读取数据
因为程序是运行在内存中,以内存角度来理解输入输出概念:
- 输入与输出是一个相对概念,数据写入文件,对于程序来说是输出流,对文件来说是输入流
- 但一般是以程序作为中心,所以从程序写入数据到其他位置,是输出流,将数据读入程序中,则是输入流
简单的说就是:读取数据就是输入流,写入数据就是输出流。
•分类
- 字节流:操作的数据单元是 8位 的字节,以 InputStream , OutputStream 作为抽象基类。
- 字符流:操作的数据单元是字符,以 Reader , Writer 作为抽象基类
- 字节流可以处理所有数据文件,若处理的是纯文本数据,建议使用字符流
字节流
•InputStream
常用方法
- InputStream.read() : 从输入流中读取数据的下一个字节
- InputStream.read(byte[] b) : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
- InputStream.read(byte[] b, int off, int len) : 将输入流中最多 len 个数据字节读入从偏移量 off 开始的 byte 数组 b 中
- InputStream.close() : 关闭此输入流并释放与该流关联的所有系统资源
•FileInputStream
我在 E 盘下新建了一个 test.txt 文本,该文本中仅包含一行文本 "ABCDEFG",接下来的操作都将围绕该文本进行。
构造方法
- FileInputStream(File file) : 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的File对象 file 指定
- FileInputStream(String name) : 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径 name 指定
InputStream.read()
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); InputStream input = new FileInputStream(file); int x = 0; while((x = input.read()) != -1) { //字符在底层存储的是存储的数值,即字符对应的ASCII码 //所以需要通过(char)进行强制类型转换 System.out.print((char)x+" "); } //IO流使用完毕一定要关闭 input.close(); }}运行结果
InputStream.read(byte[] b)
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); InputStream input = new FileInputStream(file); int x = 0; byte[] b = new byte[2]; while((x = input.read(b)) != -1) { System.out.print(new String(b,0,x)+" "); } //IO流使用完毕一定要关闭 input.close(); }}运行结果
InputStream.read(byte[] b, int off, int len)
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); InputStream input = new FileInputStream(file); int x = 0; byte[] b = new byte[100]; for(int i = 0;i < 100;i++) {//初始化 b 数组 b[i] = '#'; } while((x = input.read(b,1,3)) != -1) { System.out.println(new String(b,0,10)); } //IO流使用完毕一定要关闭 input.close(); }}运行结果
上述三种代码,语句 InputStream input = new FileInputStream(file); 可改为 InputStream input = new FileInputStream("E://test.txt"); ;
•BufferedInputStream
字节缓冲输入流,提高了读取效率;
构造方法
- BufferedInputStream(InputStream in) : 创建一个 BufferedInputStream 并保存其参数,即输入流in,以便将来使用
- BufferedInputStream(InputStream in, int size) : 创建具有指定缓冲区大小的 BufferedInputStream并保存其参数,即输入流in以便将来使用
BufferedInputStream(InputStream in)
import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); InputStream input = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(input); byte[] b = new byte[200]; int x = 0; while((x = bis.read(b)) != -1) { System.out.print(new String(b,0,x)); } //IO流使用完毕一定要关闭 input.close(); bis.close(); }}运行结果
•OutputStream
常用方法
- OutputStream.write(byte[] b) : 将 b 数组写入此输出流
- OutputStream.write(byte[] b, int off, int len) : 将 b 数组中从偏移量 off 开始的 len 个字节写入此输出流
- OutputStream.close() : 关闭此输出流并释放与此流有关的所有系统资源
•FileOutputStream
构造方法
- FileOutputStream(File file) : 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
- FileOutputStream(File file, boolean append) : 创建一个向指定 File 对象表示的文件中追加写入数据的文件输出流
- FileOutputStream(String name) : 同 1
- FileOutputStream(String name, boolean append) : 同 2
FileOutputStream(File file)
import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class TestFileOutputStream { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); OutputStream out = new FileOutputStream(file); out.write("ABCDEFG".getBytes()); out.close(); }}观察文本内容
FileOutputStream(File file, boolean append)
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class TestFileOutputStream { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); OutputStream out = new FileOutputStream(file,true); out.write("\r\n".getBytes()); out.write("hello".getBytes()); out.close(); }}观察文本内容
注意
输出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;
输出换行符时一定要写 \r\n 不能只写 \n ,因为不同文本编辑器对换行符的识别存在差异性。
•BufferedOutputStream
字节缓冲输出流,提高了写出效率;
构造方法
- BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
- BufferedOutputStream(OutputStream out, int size) : 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
BufferedOutputStream(OutputStream out)
import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class TestFileOutputStream { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); OutputStream output = new FileOutputStream(file,true); BufferedOutputStream bos = new BufferedOutputStream(output); bos.write("\r\n".getBytes()); bos.write("nice to meet you".getBytes()); bos.flush();//刷新此缓冲的输出流 output.close(); bos.close(); }}观察文本内容
字符流
•Reader
常用方法
- Reader.read() : 读取单个字符
- Reader.read(char[] cbuf) : 将字符读入数组
- Reader.read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分
- Reader.close() : 关闭该流并释放与之关联的所有资源
•InputStreamReader
将 test.txt 的文本内容更改为 "ABCDEFG";
构造方法
- InputStreamReader(InputStream in) : 创建一个使用默认字符集的 InputStreamReader
- InputStreamReader(InputStream in, Charset cs) : 创建使用给定字符集的 InputStreamReader
InputStreamReader(InputStream in)
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class TestInputStreamReader { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); InputStream in = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(in); int x = 0; while((x = reader.read()) != -1){ System.out.print((char)x+" "); } reader.close(); }}运行结果
InputStreamReader(InputStream in, Charset cs)
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class TestInputStreamReader { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); InputStream in = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(in,"utf-8"); int x = 0; while((x = reader.read()) != -1){ System.out.print((char)x+" "); } reader.close(); }}运行结果
•BufferedReader
字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
构造方法
- BufferedReader(Reader in) : 创建一个使用默认大小输入缓冲区的缓冲字符输入流
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class TestBufferedReader { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); InputStream in = new FileInputStream(file); InputStreamReader inputReader = new InputStreamReader(in); BufferedReader reader = new BufferedReader(inputReader); String s; while((s = reader.readLine()) != null) {//一次性读取一行 System.out.println(s); } reader.close(); }}运行结果
•Writer
常用方法
- OutputStreamWriter.write(char[] cbuf) : 写入字符数组
- OutputStreamWriter.write(char[] cbuf, int off, int len) : 写入字符数组的某一部分
- OutputStreamWriter.write(char c) : 写入单个字符
- OutputStreamWriter.write(String str) : 写入字符串
- OutputStreamWriter.write(String str, int off, int len) : 写入字符串的某一部分
- OutputStreamWriter.append(char c) : 将指定字符添加到此 writer
- OutputStreamWriter.append(CharSequence csq) : 将指定字符序列添加到此 writer
- OutputStreamWriter.append(CharSequence csq, int start, int end) : 将指定字符序列的子序列添加到此 writer.Appendable
- OutputStreamWriter.flush() : 刷新该流的缓冲
- OutputStreamWriter.close() : 关闭此流,但要先刷新它
•OutputStreamWrite
构造方法
- OutputStreamWriter(OutputStream out) : 创建使用默认字符编码的 OutputStreamWriter
- OutputStreamWriter(OutputStream out, Charset cs) : 创建使用给定字符集的 OutputStreamWriter
- OutputStreamWriter(OutputStream out, CharsetEncoder enc) : 创建使用给定字符集编码器的 OutputStreamWriter
- OutputStreamWriter(OutputStream out, String charsetName) : 创建使用指定字符集的 OutputStreamWriter
特有方法
- String getEncoding() : 返回此流使用的字符编码的名称
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;public class TestOutputStreamWrite { public static void main(String[] args) throws IOException{ File file = new File("E://test.txt"); OutputStream out = new FileOutputStream(file); OutputStreamWriter writer = new OutputStreamWriter(out); writer.write("abcdefg"); writer.append('@'); writer.append("abc"); writer.flush(); writer.close(); }}观察文本内容
•声明
参考资料
- 【】
- 【】
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月20日 14时06分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
js求阶乘
2021-05-08
python-day3 for语句完整使用
2021-05-08
基于LabVIEW的入门指南
2021-05-08
weblogic之cve-2015-4852
2021-05-08
Java注释
2021-05-08
C++ 函数重载
2021-05-08
使用mybatis-generator生成底层
2021-05-08
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2021-05-08
lvs+keepalive构建高可用集群
2021-05-08
6 个 Linux 运维典型问题
2021-05-08
取消vim打开文件全是黄色方法
2021-05-08
一个系统部署多个tomcat实例
2021-05-08
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2021-05-08
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2021-05-08
GLFW 源码 下载-编译-使用/GLAD配置
2021-05-08
Typescript 学习笔记六:接口
2021-05-08
OpenJDK1.8.0 源码解析————HashMap的实现(一)
2021-05-08
MySQL-时区导致的时间前后端不一致
2021-05-08