
本文共 1881 字,大约阅读时间需要 6 分钟。
IO流
一、字节流
字节流用于处理文件中的各种二进制数据,如图片、音乐、视频等。下面从输入流和输出流两方面进行介绍。
输入流 InputStream抽象类
InputStream是处理字节输入的基础抽象类,其常用子类包括FileInputStream。主要方法如下:
int read()
:从输入流读取一个字节,每次读取后指针向前移动一位。int read(byte[] b)
:从输入流读取一定数量的字节,将结果存放到字节数组b中,返回实际读取的字节数。int read(byte[] b, int off, int len)
:从输入流读取len个字节到字节数组b的指定位置off开始。输出流 OutputStream抽象类
OutputStream是处理字节输出的基础抽象类,其常用子类包括FileOutputStream。主要方法如下:
void write(int b)
:将指定的单个字节写入输出流。void write(byte[] b)
:将字节数组b中的所有字节写入输出流。void write(byte[] b, int off, int len)
:将字节数组b中的len个字节,从指定位置off开始写入输出流。二、字符流
字符流专用于处理文本和字符串相关的流操作。字符流在读取和写入文本时可以使用指定的编码方式,避免乱码问题。
输入流 Reader抽象类
Reader是处理字符输入的基础抽象类,其常用子类包括FileReader。主要方法如下:
int read()
:从字符流中读取一个字符。int read(byte[] b)
:从字符流中读取字符,将其转换为字节数组形式返回。int read(char[] cbuf, int off, int len)
:从字符流中读取字符,将其存放到字符数组cbuf中,并指定开始位置和长度。输出流 Writer抽.abstract类
Writer是处理字符输出的基础抽象类,其常用子类包括FileWriter。主要方法如下:
void write(char[] cbuf, int off, int len)
:将字符数组cbuf中的字符按顺序写入输出流。void write(String str, int off, int len)
:写入字符串str中的字符,并指定开始位置和长度。void append(char c)
:将字符c追加到输出流中。三、关流方式
使用Java 7引入的try-with-resources语法可以更简洁地处理IO流,确保流在一定范围内自动关闭。语法如下:
try ( InputStream is = new FileInputStream("file.txt");) { // 读取文件内容} catch (IOException e) { // 处理异常}
四、乱码问题
产生的原因
解决方案
编码与解码
字符编码和解码是字符流的基础操作。使用字符流时,可以灵活指定编码方式。
编码
String str = new String("hello, world!", charsetName);
选择合理的字符集asename(如UTF-8、UTF-16)进行转换。
解码
byte[] bytes = str.getBytes(charsetName);
通过指定字符集名称将字符串转换为字节数组。
转换流(包装流)
为了更方便地读写文本文件,可以使用转换流将字节流和字符流相互包装。
输入转换流
InputStreamReader tiedInputStreamReader(InputStream is, String charsetName)
通过InputStreamReader可以兼容字节流与字符流,读取文本文件时更加高效和简便。
输出转换流
OutputStreamWriter tiedOutputStreamWriter(OutputStream os, String charsetName)
OutputStreamWriter同样提供了字符流与字节流之间的桥梁功能,适用于高效地写入文本文件。
通过以上方法,可以有效避免乱码问题,并确保文件的读写顺畅。
发表评论
最新留言
关于作者
