------- android培训、java培训、期待与您交流! ----------
一.字符流
1.使用FileInputStream和FileOutputStream读写中文
计算机存储任何数据都是以二进制字节形式存储, 那么使用字节流是可以读写字符的. 但是比较麻烦.
FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码
FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码
2.使用InputStreamReader和OutputStreamWriter读写中文
InputStreamReader包装一个InputStream, 可以直接读取字符, 自动解码
OutputStreamWriter包装一个OutputStream, 可以直接写出字符, 自动编码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
* InputStream.read()方法是读一个byte, 而为什么返回一个int? 而且int中全是正数.
* 因为byte取值范围是-128到127, 这些数据在文件中都有可能存在, 如果读到字节直接返回, 那么无法用任何一个值表示文件末尾.
* read()方法内部, 将读取到的所有数据高位补0转为了int, 这样做所有负数都会变为正数, 返回-1就能表示文件末尾了.
* write()方法写出数据时, 会将int数据强转为byte, 再写出. 这样就把read()方法中补的0都去掉了, 得到了文件中原有数据.
*/
public class CharDemo {
public static void main(String[] args) throws IOException {
// readDemo1();
// writeDemo1();
// readDemo2();
// writeDemo2();
// readDemo3();
// writeDemo3();
}
// 写出非平台默认码表的数据, 也是在构造函数中指定码表
private static void writeDemo3() throws IOException {
FileOutputStream fos = new FileOutputStream("utf-8.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); // 指定使用UTF-8码表编码
osw.write("生命在于运动\r\n");
osw.write("生命在于学习\r\n");
osw.close();
}
// 读取非平台默认码表的文件, 在构造函数中指定码表即可
private static void readDemo3() throws IOException {
FileInputStream fis = new FileInputStream("utf-8.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); // 指定用UTF-8码表解码
int b;
while ((b = isr.read()) != -1)
System.out.print((char)b);
isr.close();
}
// 字符流可以直接写出字符, 内部自动编码
private static void writeDemo2() throws FileNotFoundException, IOException {
FileOutputStream fos = new FileOutputStream("file.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos); // 字符输出流
osw.write("生命在于运动\r\n");
osw.write("生命在于学习\r\n");
osw.close();
}
// 字符流每次读取一个字符, 内部自动解码, 遇到英文读1个字节转为字符, 遇到中文读2个字节转为字符
private static void readDemo2() throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream("file.txt");
InputStreamReader isr = new InputStreamReader(fis); // 字符输入流
int b;
while ((b = isr.read()) != -1)
System.out.print((char)b);
isr.close();
}
// 由于FileOutputStream只能写出字节, 如果希望写出字符, 需要人工编码
private static void writeDemo1() throws IOException {
FileOutputStream fos = new FileOutputStream("file.txt");
fos.write("生命在于运动\r\n".getBytes());
fos.write("生命在于学习".getBytes());
fos.close();
}
// 由于FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码
private static void readDemo1() throws IOException {
FileInputStream fis = new FileInputStream("file.txt");
int b;
while ((b = fis.read()) != -1) {
byte b1 = (byte)b;
if (b1 < 0) { // 如果读到了负数(代表遇到中文), 再多读一个, 两个一起转为一个字符
byte b2 = (byte) fis.read();
System.out.print(new String(new byte[]{b1, b2}));
} else { // 如果读到的不是负数, 直接转为字符
System.out.print((char)b);
}
}
fis.close();
}
}
* 3.指定码表读写字符
在使用InputStreamReader和OutputStreamWriter的时候, 如果希望读写非平台 默认码表, 在构造函数中可以指定
* 4.FileReader和FileWriter
FileReader是InputStreamReader的子类, 在读取平台默认码表的文件时, 可以 使用FileReader替代InputStreamReader
FileWriter是OutputStreamWriter的子类, 在写出平台默认码表的文件时, 可以 使用FileWriter替代OutputStreamWriter
* 5.BufferedReader和BufferedWriter
BufferedReader可以包装一个Reader, 提供缓冲功能, 而且提供了readLine()方 法可以读取一行字符
BufferedWriter可以包装一个Writer, 提供缓冲功能, 而且提供了newLine()方 法写出系统对应的换行符号
6.LineNumberReader
是BufferedReader的子类, 带有缓冲功能, 可以读取一行, 并且还能统计行号
------- android培训、 java培训、期待与您交流! ---------- 详细请查看: http://edu.youkuaiyun.com/heima/