字节流:
FileInputStream
FileOutputStream
字节流每次读取一个字节,好处是什么类型文件都可以读取,坏处是处理纯文本时可能出现问题(中文每个字占2个字节,可能导致读取错误出现乱码)。
字符流:
FileReader, FileWriter
只能操作纯文本文件(右键记事本可以打开而且不影响内容),txt,html等。
字节流用byte接收数据,byte是8位
字符流用char接受数据,char是16位
汉字占用两个字节,也就是16位
所以字节流有可能乱码,而字符流不会。
两者用房上基本相同,只是参数一个是byte一个是char
FileReader:
package io;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args){
FileReader fr = null;
FileInputStream fis = null;
try {
fr = new FileReader("C:\\Users\\Administrator\\Desktop\\test\\filereadertest.txt");
fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\filereadertest.txt");
char[] c = new char[5];
int count = fr.read(c);
while(count != -1){
System.out.println("---|" + new String(c) + "|---");
count = fr.read(c);
}
//---|你好世界,|---
//---|
//你好I|---
//---|/O。好I|---
byte[] b = new byte[5];
count = fis.read(b);
while(count != -1){
System.out.println("---|" + new String(b) + "|---");
count = fis.read(b);
}
//---|你好?|---
//---|澜纾?|---
//---|
//你?|---
//---|肐/O?|---
//---|/O?|---
//字节型出现了乱码,字符型没有
//因为字符型每次读取了一个char是16位的,而字节型只能使用byte读取,每次是8位,每个汉字是16位,所以字节型会出现乱码
}catch(Exception e){
e.printStackTrace();
}finally { //使用fianlly保证流能关闭
if (fr != null) {
try {
fr.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
FileWriter
package io;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args){
FileWriter fw = null;
FileOutputStream fos = null;
try {
fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\test\\fileWriterTest.txt"); //没有这个文件的话会新建一个
fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test\\fileWriterTest.txt", true);//第二个参数是是否在原有的后面添加,默认是false也就是覆盖,FileWriter同理
fw.write("你好啊世界,\r\n你好难啊I/O。\r\n"); //windows中txt的换行是\r\n\,如果想在文本中添加字符串“\r\n”,要用“\\r\\n”则会输出“\r\n”。
fw.flush();//以前必须写,现在新版本会自动推送- -不过为了适应各种版本最好都写上
//你好啊世界,
//你好难啊I/O。
fos.write("你好啊世界,\r\n你好难啊I/O。\r\n".getBytes()); //把String转化为byte[]数组,然后可以用字节流存取。
fos.flush();//以前必须写,现在新版本会自动推送- -不过为了适应各种版本最好都写上
//你好啊世界,
//你好难啊I/O。
//因为是一次性全部存入不用分割所以貌似问题不大- -,可能更复杂的情况下需要分批输入的时候才有效果
}catch(Exception e){
e.printStackTrace();
}finally { //使用fianlly保证流能关闭
if (fw != null) {
try {
fw.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}