java的输入输出建立在4个抽象类的基础上:InputStream、OutputStream、Reader、Writer。InputSream和OutputStream被设计成字节流类,而Reader和Writer被设计成字符流类。一般来说,处理字符或者字符串时应该使用字符流类,处理字节或者二进制对象时应该使用字节流类。
一般在操作文件流时,不管是字节流还是字符流,都可以按照以下的方式进行。
1、使用File类找到一个文件
2、通过File类实例化字节流或字符流
3、进行字节(字符)的读写操作
4、关闭文件流
下面是2个例子,向文件中写入字符串并读出。
以字节流方式:
1 package zdxtest;
2 import java.io.*;
3 public class TestFile1 {
4
5 public static void main(String[] args) {
6 // TODO Auto-generated method stub
7 //字节流输入输出,向一个文件写入内容然后读出
8 File f = new File("d:\\1.txt");
9 FileOutputStream fos = null;
10 FileInputStream foi = null;
11 String sin = "今天是七月最后一天";
12 //创建文件,如果目录下存在文件,先删除再创建
13 if (f.exists()) {
14 f.delete();
15 try {
16 f.createNewFile();
17 } catch (IOException e) {
18 // TODO Auto-generated catch block
19 e.printStackTrace();
20 }
21 }
22 else{
23 try {
24 f.createNewFile();
25 } catch (IOException e) {
26 // TODO Auto-generated catch block
27 e.printStackTrace();
28 }
29 }
30 //实例化字节流子类:FileOutputStream
31 try {
32 fos = new FileOutputStream(f);
33 } catch (FileNotFoundException e) {
34 // TODO Auto-generated catch block
35 e.printStackTrace();
36 }
37 //以字节的方式写入文件并关闭流
38 byte[] b = sin.getBytes();
39 try {
40 fos.write(b);
41 fos.close();
42 } catch (IOException e) {
43 // TODO Auto-generated catch block
44 e.printStackTrace();
45 }
46 //实例化字节流子类:FileInputStream
47 try {
48 foi = new FileInputStream(f);
49 } catch (FileNotFoundException e) {
50 // TODO Auto-generated catch block
51 e.printStackTrace();
52 }
53 //以字节的方式读取文件并关闭流
54 byte[] c = new byte[1000];
55 int l=0;
56 try {
57 /*l = foi.read();
58 while(l!=-1){
59 System.out.println(String.valueOf(l));
60 l=foi.read();
61 }*/
62 l = foi.read(c);
63 foi.close();
64 } catch (IOException e) {
65 // TODO Auto-generated catch block
66 e.printStackTrace();
67 }
68 String o = new String(c);
69 System.out.println(o); //打印文件内容
70 System.out.println(l); //打印读取的字节数
71
72 }
73
74 }
运行后输出:
今天是七月最后一天
27
为什么是27个字节呢,因为我eclipse的默认编码方式是UTF-8,在UTF-8编码方式中,一个汉字是占有三个字节的,一共9个汉字,所以是27个字节。
再来看以字符流的方式实现:
1 package zdxtest;
2 import java.io.*;
3
4 public class FileTest2 {
5
6 public static void main(String[] args) {
7 // TODO Auto-generated method stub
8 File f = new File("d:\\2.txt");
9 FileReader fr = null;
10 FileWriter fw = null;
11 String s = "明天是八月第一天";
12 //创建文件,如果目录下存在文件,先删除再创建
13 if(f.exists())
14 {
15 f.delete();
16 try {
17 f.createNewFile();
18 } catch (IOException e) {
19 // TODO Auto-generated catch block
20 e.printStackTrace();
21 }
22 }
23 else{
24 try {
25 f.createNewFile();
26 } catch (IOException e) {
27 // TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 }
31 //实例化字符流子类:FileWriter,以字符的方式写入文件并关闭流
32 try {
33 fw = new FileWriter(f);
34 fw.write(s);
35 fw.close();
36 } catch (IOException e) {
37 // TODO Auto-generated catch block
38 e.printStackTrace();
39 }
40 //实例化字符流子类:FileReader,以字符的方式读取文件并关闭流
41 char [] b = new char[1000];
42 int l = 0;
43 try {
44 fr = new FileReader(f);
45 l = fr.read(b);
46 } catch (IOException e) {
47 // TODO Auto-generated catch block
48 e.printStackTrace();
49 }
50 System.out.println(new String(b)); //打印文件内容
51 System.out.println(l); //打印读取的字符数
52 }
53
54 }
运行输出:
明天是八月第一天
8
一共8个汉字,一个char存储一个汉字,所以是8个字符
来源:https://www.cnblogs.com/Eric-zhao/p/5724275.html