java IO按照读写单位将流分为了两类:
1.字节流:InputStream,OutputStream读写单位为字节;
2.字符流:Reader,Writer读写单位为字符
在使用字节流读取写入数据的时候,要将对应的字符转换为相关的字节数据,涉及到GBK,UTF-8等字符集的问题
但如果使用了字符流来操作数据时,就不用考虑这些问题了。
字节流转换字符流输出
我们所获取的IO对象通常是字节流
要想获得字符流,首先一定要将其转换,而使用转换流将字节流转换为字符流是一种常见操作。具体操作如下:
package com.tedu.io;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* 转换流是字符流的一对实现类,是一对高级流
* 转换流不会作为终端流使用,但是对于我们读取文本数据时
* 在流连接中时非常重要的一环
* @author Wildmess
*
*/
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("osw.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
/*
* osw写出字符的方法中
* 会按照实例化对象时指定的字符集转换成字节再输出
*/
String data = "中华人民共和国";
osw.write(data);
System.out.println("程序结束!");
osw.close();
}
}
字节流转换字符流输入
同理,输出可以字节流转换为字符流输出,输入也要字节流转换字符流输入。
具体代码如下:
package com.tedu.io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
/**
* 使用转换流将输入字节流转换成字符流
* @author Wildmess
*
*/
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("osw.txt");
InputStreamReader isr = new InputStreamReader(fis, "utf-8");
int d;
while((d = isr.read())!=-1) {
System.out.print((char)d);
}
System.out.println("\n程序结束!");
isr.close();
}
}
缓冲字符流
在字符流的基础上加入缓冲机制,能在字符流对字符处理适用性好的基础上,再增加运行效率
直接使用缓冲字符流
字符缓冲流可以直接实例化对象,需要参数为文件路径和字符集
package com.tedu.io;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
/**
* 缓冲字符流
* java.io.BufferedWrite
* java.io.BufferedReader
* 使用缓存对文件的内容进行读写,提高读写效率
*
* java.io.PriterWriter
* 是BufferedWriter基础上的又一次加工
* 具有自动刷新换行的功能
*
* @author Wildmess
*
*/
public class PriterWriterDemo {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter("pw.txt","utf-8");
pw.println("我爱你!");
pw.println("祖国!");
System.out.println("程序结束!");
pw.close();
}
}
低级流转换成字符缓冲流
如果持有对象为低级流,那么就可以转换为字符缓冲流输出了
package com.tedu.io;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
/**
* 使用字节流转换到PW
* @author Wildmess
*
*/
public class PriterWriterDemo2 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("pw.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
pw.println("我爱你!");
pw.println("黄河!");
System.out.println("程序结束!");
pw.close();
}
}
缓冲字符输入流
可以在字符输入流的基础上,加上缓冲,于是就有了缓冲字符输入流
package com.tedu.io;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 缓冲字符输入流
* @author Wildmess
*
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("pw.txt");
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
}