Java IO. 字符操作
字符流
使用字节流读取文本文件时,有时会出现问题。比如遇到中文字符,可能会出现乱码,因为存储这些字符需要占用多个字节。Java IO中提供了字符流类,以字符(java中字符是Unicode编码,一个字符占2 bytes)为单位读写数据,用于处理文本文件。
Writer
Writer是一个抽象类,是表示字符输出流的所有类的基类,将指定的字符信息写出到目的地。它定义了字符输出流的基本功能方法。
- void write(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(): 关闭该流,但要先刷新它。
FileWriter
FileWriter 是Writer一个很典型的实现类,用于写出字符到文件。构造时使用系统默认的字符编码和默认字节缓冲区。
构造方法:
- FileWriter(File file) : 创建一个新的 FileWriter对象,传入要读取的File对象。
- FileWriter(String name) : 创建一个新的 FileWriter对象,传入要读取文件的名称。
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterTest {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
//写入一个字符可以使用其编码或者直接写入字符本身
writer.write(97);//结果a
writer.write('b');//结果a,b
//写入字符数组
char[] text = {'c', 'd'};
writer.write(text);//结果a,b,c,d
//写入字符串
String str = "床前明月光,\n" +
"疑是地上霜。\n" +
"举头望明月,\n" +
"低头思故乡。";
writer.write(str);
writer.close();
}
加上异常处理后代码:
public static void main(String[] args) {
Writer writer = null;
try {
writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
//写入一个字符可以使用其编码或者直接写入字符本身
writer.write(97);//结果a
writer.write('b');//结果a,b
//写入字符数组
char[] text = {'c', 'd'};
writer.write(text);//结果a,b,c,d
//写入字符串
String str = "床前明月光,\n" +
"疑是地上霜。\n" +
"举头望明月,\n" +
"低头思故乡。";
writer.write(str);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Reader
Reader是一个抽象类,是表示字符输入流的所有类的基类,可以读取字符信息到内存中。它定义了字符输入流的基本功能方法。
- public void close() :关闭该流并释放相关联的系统资源。
- public int read() : 从输入流读取一个字符。如果读取到eof(文件最后)返回-1。
- public int read(char[] cbuf) : 从输入流中每次读取cbuf长度个字符,并将它们存储到字符数组 cbuf中。返回读取到的有效字符个数,如果读取到eof(文件最后)返回-1。
FileReader
FileReader类是Reader的一个实现类。构造时使用系统默认的字符编码和默认字节缓冲区。
构造方法:
- FileReader(File file) : 创建一个新的 FileReader 对象,传入要读取的File对象。
- FileReader(String fileName) : 创建一个新的 FileReader对象 ,传入要读取文件的名称。
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderTest {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
//按单个字符读取
// int ch;
// while ((ch = reader.read()) != -1) {
// char text = (char) ch;
// System.out.print(text);
// }
//按字符数组读取
char[] chars = new char[5];
int len;
StringBuilder sb = new StringBuilder();
while ((len = reader.read(chars)) != -1) {
String text = new String(chars, 0, len);
sb.append(text);
}
System.out.println(sb);
reader.close();
//输出结果
/*
abcd床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
*/
}
}
加上异常处理后代码:
public class ReaderTest {
public static void main(String[] args){
Reader reader = null;
try {
reader = new FileReader("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
//按单个字符读取
// int ch;
// while ((ch = reader.read()) != -1) {
// char text = (char) ch;
// System.out.print(text);
// }
//按字符数组读取
char[] chars = new char[5];
int len;
StringBuilder sb = new StringBuilder();
while ((len = reader.read(chars)) != -1) {
String text = new String(chars, 0, len);
sb.append(text);
}
System.out.println(sb);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (reader != null)
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//输出结果
/*
abcd床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
*/
}
}