黑马程序员_IO流_字符流,转换流
来源:互联网 发布:安卓版r语言软件 编辑:程序博客网 时间:2024/06/02 00:04
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
IO流学习第二天,有了前一天的基础,今天对字符流,转换流,文件的拷贝操作等有了更深入的理解.
字符流的抽象父类时Reader和Writer,直接操作文件的子类是FileReader和FileWriter,
值得注意的是,输入流中记录字符的是int型而不是char型,这是因为换行符是以\r\n或\n存在,如果返回的是字符,那么就会把换行符当做字符读出,不能判断文本的结束.字符流操作文本更简单,每读出一次会根据字符的大小一次操作1-3个字节,字节流读出时一次只读一个字节,这便是字符优于字节的地方.在关流时,close()会自动调用flush()方法,在拷贝多媒体文件时用字符流可能会失败,这是因为在拷贝的过程中,数据以字节的形式存在于硬盘中,要转成字符存入内存,从内存中输出又要将字符转成字节,字节转字符有的1个,有的2个,有些则3个,造成字符转换错误,而无法正常读出.
为了更深刻的了解字符流读取原理,模仿了一个BufferedReader类.如下:
public class MyBufferedReader {
private char[] arr = new char[8192]; //定义一个字符数组做缓存
private int pos;
private int len; //记录有效数据
private Reader r;
public MyBufferedReader(Reader r) { //对Reader进行包装
this.r = r;
}
public int read() throws IOException {
if(pos == len){
len = r.read(arr);
pos = 0; //当读出的数据达到arr.length()-1时,将指针重置为0,进行第二轮的读取
}
return len == -1 ? -1 : arr[pos++]; //当读取到结尾时返回-1,未到则继续将记录的数据返回
}
public String readLine() throws IOException { //重写readline方法
StringBuilder sb = new StringBuilder();
int ch;
while((ch = read())!= -1) {
if(ch == '\r') {
continue;
}else if(ch == '\n') {
return sb.toString();
}else {
sb.append((char)ch);
}
}
if(sb.length() > 0) {
return sb.toString();
}
return null;
}
public void close() throws IOException {
r.close();
}
}
系统中会有默认的码表读文件,当我们需要制定码表来读写时,就需要用到字符字节流的转化桥梁---InputStreamReader和OutputStreamReader,从后缀名上看,他们属于字符流,将制定的GBK编码文件转成UTF-8文件以事例说明:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public static void main(String[] args) throws IOException {
try(
//通过从里向外的顺序将输入字节流转成输入字符流,指定编码表为GBK
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("day20笔记txt","GBK"));
//通过从里向外的顺序将输出字节流转成输出字符流,制定编码表为UTF-8
BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("demo.txt"),"UTF-8"));
){
String line;
while((line=br.readLine())!=null) { //判断是否读到末尾
bw.write(line);
bw.newLine(); //换行
}
}
}
}
注意:转换格式必须提前设置,入上例转成UTF-8的文件必须先新建一个以UTF-8编码的文件,否则转码后会出现乱码.
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
- 黑马程序员_IO流_字符流,转换流
- 黑马程序员_IO流2_(字符缓冲区,字节缓冲区,字节字符转换流)
- 黑马程序员_Java语言_IO流_
- 黑马程序员_IO流之字符流
- 黑马程序员_IO流字符流
- 黑马程序员_IO流之字符流
- 黑马程序员_IO流字符流-缓冲区
- 黑马程序员_Java基础_IO流_字符流,带缓冲区的字符流,文本文件读写
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- 黑马程序员_IO流
- [leetcode刷题系列]Minimum Path Sum
- Struts工作原理
- uva 10112
- http协议之压缩
- 去掉word 2007中可恶的信息检索
- 黑马程序员_IO流_字符流,转换流
- Content-Disposition的使用方法
- UVa694 The Collatz Sequence
- 特殊容器的共性与特性
- 图片搜索的一般原理
- 多文件上传控件uploadify介绍
- dom4j解析xml
- Linux 驱动开发中常用的内存分配方法浅析
- 批处理中的%1 -- %9