java的输入输出建立在4个抽象类的基础上:InputStream、OutputStream、Reader、Writer。InputSream和OutputStream被设计成字节流类,而Reader和Writer被设计成字符流类。一般来说,处理字符或者字符串时应该使用字符流类,处理字节或者二进制对象时应该使用字节流类。
一般在操作文件流时,不管是字节流还是字符流,都可以按照以下的方式进行。
1、使用File类找到一个文件
2、通过File类实例化字节流或字符流
3、进行字节(字符)的读写操作
4、关闭文件流
下面是2个例子,向文件中写入字符串并读出。
以字节流方式:
package zdxtest;
import java.io.*;
public class TestFile1 { public static void main(String[] args) {
// TODO Auto-generated method stub
//字节流输入输出,向一个文件写入内容然后读出
File f = new File("d:\\1.txt");
FileOutputStream fos = null;
FileInputStream foi = null;
String sin = "今天是七月最后一天";
//创建文件,如果目录下存在文件,先删除再创建
if (f.exists()) {
f.delete();
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//实例化字节流子类:FileOutputStream
try {
fos = new FileOutputStream(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//以字节的方式写入文件并关闭流
byte[] b = sin.getBytes();
try {
fos.write(b);
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//实例化字节流子类:FileInputStream
try {
foi = new FileInputStream(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//以字节的方式读取文件并关闭流
byte[] c = new byte[1000];
int l=0;
try {
/*l = foi.read();
while(l!=-1){
System.out.println(String.valueOf(l));
l=foi.read();
}*/
l = foi.read(c);
foi.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String o = new String(c);
System.out.println(o); //打印文件内容
System.out.println(l); //打印读取的字节数 } }
运行后输出:
今天是七月最后一天
27
为什么是27个字节呢,因为我eclipse的默认编码方式是UTF-8,在UTF-8编码方式中,一个汉字是占有三个字节的,一共9个汉字,所以是27个字节。
再来看以字符流的方式实现:
package zdxtest;
import java.io.*; public class FileTest2 { public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("d:\\2.txt");
FileReader fr = null;
FileWriter fw = null;
String s = "明天是八月第一天";
//创建文件,如果目录下存在文件,先删除再创建
if(f.exists())
{
f.delete();
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//实例化字符流子类:FileWriter,以字符的方式写入文件并关闭流
try {
fw = new FileWriter(f);
fw.write(s);
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//实例化字符流子类:FileReader,以字符的方式读取文件并关闭流
char [] b = new char[1000];
int l = 0;
try {
fr = new FileReader(f);
l = fr.read(b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(new String(b)); //打印文件内容
System.out.println(l); //打印读取的字符数
} }
运行输出:
明天是八月第一天
8
一共8个汉字,一个char存储一个汉字,所以是8个字符