Java学习之IO流
简单介绍
•概念
按照流的方向分为 输入流(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(); } }观察文本内容
•声明
参考资料