OutputStreamWriter(字符流通向字节流的桥梁)
1.程序中的字符 先使用转换流 根据转换流想查询码表
格式去查询
2.如果查的是GBK格式 那么一个中文字符
就查到两个字节的 字节编码
3.这个字节最后给到了 构建转换流是传入的字节流
4.通过这个字节流 按字节写入到文件中
转换流:可以查询对应编码表
默认UTF-8格式写文件 拿到Windows系统上读取
windows会默认使用GBK格式来读取文件 乱码
转换流可以根据你想要的编码格式进行读写
读写时可以设置编码格式
构造方法(不传编码格式 默认使用的系统的编码格式)
1.需要字节输出流
2.编码格式的名字(UTF-8 ,GBK 不区分大小写)
InputStreamReader(读取文件 字节流通向字符流的桥梁)
1.按字节读取文件 将字节编码给到转换流
2.如果是UTF-8需要3个字节
3.使用字符流读取到程序中
public static void main(String[] args) throws IOException {
// 测试
// getUTF8();
// GBK();
// readUTF8();
readGBK();
}
// 按操作系统默认格式(UTF-8)写一个文件
public static void getUTF8() throws IOException {
// 创建一个字节输出流
FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/test/UTF8.txt");
// 创建一个转换流
OutputStreamWriter osw = new OutputStreamWriter(fos);
// 写文件
osw.write("嘻嘻");
// 注意:
// 1.一般只关外层 的流就可以
// 2.自己创建的流自己关 获取系统的流 不用关
osw.close();
}
// 按GBK格式写入文件
public static void GBK() throws IOException {
FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/test/GBK.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
osw.write("嘻嘻");
osw.close();
}
// 按默认UTF8格式读文件
public static void readUTF8() throws IOException {
FileInputStream fis = new FileInputStream("/Users/lanou/Desktop/test/UTF8.txt");
InputStreamReader isr = new InputStreamReader(fis);
int len = 0;
char[] c =new char[1024];
while ((len = isr.read(c)) != -1) {
System.out.println(new String(c,0,len));
}
isr.close();
}
// 按GBK格式读文件
public static void readGBK() throws IOException {
FileInputStream fis = new FileInputStream("/Users/lanou/Desktop/test/GBK.txt");
InputStreamReader isr = new InputStreamReader(fis,"GBK");
int len = 0;
char[] c =new char[1024];
while ((len = isr.read(c)) != -1) {
System.out.println(new String(c,0,len));
}
isr.close();
}
基本的编码格式
* Mac 默认所有UTF-8格式(通用编码格式)
* 一个中文字符 占3个字节
* Windows 默认使用GBK格式(简体中文格式)
* 一个中文字符 占2个字节
*
* 字符流
* Writer (写文件) 字符输出流
* Reader (读文件) 字符输入流
* 上面两个类 是所有字符流的父类(抽象类)
public static void main(String[] args) throws IOException {
// 创建一个文件字符输出流
File file = new File("/Users/lanou/Desktop/test/ee.txt");
FileWriter fw = new FileWriter(file);
// 写
fw.write(65);
// 刷新
// 相当于 写入的时候 有一个缓冲区
// 写的字符实际上 是先写入到缓冲区
// 刷新的时候 才会将写的字符全部 写入到文件中
// 建议:写一次刷新一次
fw.flush();
// 利用字符数组写入
char[] c = {'x','x','f'};
fw.write(c);
fw.flush();
// 利用字符串写入
fw.write("汉皇重色思倾国,御宇多年求不得。\n" +
"杨家有女初长成,养在深闺人未识。\n" +
"天生丽质难自弃,一朝选在君王侧。\n" +
"回眸一笑百媚生,六宫粉黛无颜色。\n" +
"春寒赐浴华清池,温泉水滑洗凝脂。\n" +
"侍儿扶起娇无力,始是新承恩泽时。\n" +
"云鬓花颜金步摇,芙蓉帐暖度春宵。\n" +
"春宵苦短日高起,从此君王不早朝。\n" +
"\n" +
"承欢侍宴无闲暇,春从春游夜专夜。\n" +
"后宫佳丽三千人,三千宠爱在一身。\n" +
"金屋妆成娇侍夜,玉楼宴罢醉和春。\n" +
"姊妹弟兄皆列土,可怜光彩生门户。\n" +
"遂令天下父母心,不重生男重生女。\n" +
"骊宫高处入青云,仙乐风飘处处闻。\n" +
"缓歌慢舞凝丝竹,尽日君王看不足。\n" +
"渔阳鼙鼓动地来,惊破霓裳羽衣曲。\n" +
"\n" +
"九重城阙烟尘生,千乘万骑西南行。\n" +
"翠华摇摇行复止,西出都门百余里。\n" +
"六军不发无奈何,宛转蛾眉马前死。\n" +
"花钿委地无人收,翠翘金雀玉搔头。\n" +
"君王掩面救不得,回看血泪相和流。\n" +
"黄埃散漫风萧索,云栈萦纡登剑阁。\n" +
"峨嵋山下少人行,旌旗无光日色薄。\n" +
"蜀江水碧蜀山青,圣主朝朝暮暮情。\n" +
"\n" +
"行宫见月伤心色,夜雨闻铃肠断声。\n" +
"天旋地转回龙驭,到此踌躇不能去。\n" +
"马嵬坡下泥土中,不见玉颜空死处。\n" +
"君臣相顾尽沾衣,东望都门信马归。\n" +
"归来池苑皆依旧,太液芙蓉未央柳。\n" +
"芙蓉如面柳如眉,对此如何不泪垂。\n" +
"春风桃李花开日,秋雨梧桐叶落时。");
fw.flush();
// 关闭流资源
// 关闭流资源之前会自动刷新缓冲区
fw.close();
}
缓冲流
* 内部自带缓冲区(字节数组)
* BufferedOutputStream(写文件) 缓冲字节输出流
* BufferedInputStream(读文件) 缓冲字节输入流
public static void main(String[] args) throws IOException {
// fun1();
FileInputStream fis = new FileInputStream("/Users/lanou/Desktop/test/feng.txt");
// 读
BufferedInputStream bis = new BufferedInputStream(fis);
int len = 0;
byte[] b = new byte[1024];
while ((len = bis.read(b)) != -1) {
System.out.println(new String(b,0,len));
}
bis.close();
}
private static void fun1() throws FileNotFoundException, IOException {
FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/test/feng.txt");
// 构建一个缓冲流写文件
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 写
bos.write("feng".getBytes());
// 关闭资源
bos.close();
}