文本和文本文件的区别:
文本:
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)。
文件:
文件是byte byte byte…的数据序列。
文本文件:
文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果。
字符流(Reader,Writer)
操作的是文本文件。对于mp3,二进制文件是字节文件不适合用字符流读取,因为读取出来的是char,没有意义。
字符的处理,一次处理一个字符
字符的底层仍然是基本的字节序列
字符流(字节字符转换流)的基本实现:
InputStreamReader:
完成byte流解析为char流,按照编码解析
OutStreamWriter:
提供char流到byte流,按照编码处理
字符流的基本方法的使用:
package com.test.FileInputStreamReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class FileInputStreamReaderTest {
public static void main(String[] args){
try {
String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt";
ReadFile1(filename);
ReadFile2(filename);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 单字符读取
* 返回的是读到字节转换成int类型(最后8位)的值
* @param fis
*/
public static void ReadFile1(String filename) throws IOException{
System.out.println("单字节读取的方式:");
InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//默认的是项目的编码(这里是gbk)
// InputStreamReader isr = new InputStreamReader(fis, "gbk");
int i;
while((i = isr.read())!=-1){
System.out.print((char)i);
}
isr.close();
}
/**
* 批量读取
* 放入buf这个字符数组中,从第0个位置开始放置,最多放buf.length个
* 返回的是读到字符的个数
* @param fis
* @throws IOException
*/
public static void ReadFile2(String filename) throws IOException{
System.out.println();
System.out.println("批量读取的方式:");
InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//默认的是项目的编码(这里是gbk)
char[] buf = new char[2*1024];
int i;
while((i = isr.read(buf, 0, buf.length))!=-1){
// //第一种转换成字符的方式
// for(int j = 0;j<i;j++){
// System.out.print((char)buf[j]);
// }
//第二种转换成字符串的方式
String str = new String(buf,0,i);
System.out.println(str);
}
isr.close();
}
}
结果截图:
注意:在操作字符流的时候要注意编码的问题。这里读取的文件是gbk编码格式的,所以在读取的时候要采用gbk编码的读取方式。否则就会出现乱码。
FileWriter和FileReader:
其实上边的代码中的:
InputStreamReader isr = new InputStreamReader(new FileInputStream(String filename));
这部分代码完全可以使用
FileReader fr = new FileReader(String filename);
来替代。
FileReader和FileWriter的基本方法的使用:
package com.test.FileReaderAndFileWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderAndFileWriterTest{
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt");//缺点:不过这里只能识别项目默认的编码不能设置其他的编码,如果读取的文件编码不是项目默认的编码,读取时就会出现乱码
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\写出的测试文件.txt");
char[] buf = new char[2*1024];
int i;
while((i = fr.read(buf, 0, buf.length))!=-1){
fw.write(buf, 0, i);
fw.flush();
}
fr.close();
fw.close();
}
}
注意:FileReader和FileWriter与之前的代码中通过InputStreamReader包装FileInputStream相比,虽然简洁,但是不能设置采用什么编码读取文件,只能使用项目默认的编码读取文件。
字符流的过滤器:
BufferedReader——>readLine 一次读一行
BufferedWriter/PrintWriter———>写一行
package com.test.BufferedReaderAndBufferedWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class BufferedReaderTest {
public static void main(String[] args){
String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt";
try {
BufferedWriter(filename);
PrintWriter(filename);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 使用BufferedWriter写出
* @throws IOException
*/
public static void BufferedWriter(String filename) throws IOException{
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(
filename)));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\javaIO\\测试文件1.txt")));
String line;
while((line = br.readLine())!=null){//但是这里的readLine并不识别换行符
System.out.println(line);
// bw.write(line);//写出的文件内容没有进行换行
// bw.write(line+"\r\n");//这里再写出文件的时候要单独写出换行操作
bw.write(line);
bw.newLine();//换行操作
bw.flush();
}
br.close();
bw.close();
}
/**
* 使用PrintWriter写出
* @param filename
* @throws IOException
*/
public static void PrintWriter(String filename) throws IOException{
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(
filename)));
PrintWriter pw = new java.io.PrintWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\测试文件2.txt");
String line;
while((line = br.readLine())!=null){
pw.println(line);
pw.flush();
}
br.close();
pw.close();
}
}
上边这两种写出文件的方法的效果是一样的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013991521/article/details/47375783