1.FileWriter类
IO流的流入、流出是以Java程序为基准,进入程序为Input,出程序为Output。
1.1.构造方法
构造方法 |
参数 |
说明 |
public FileWriter(String fileName) | 表示与系统有关的文件名 | 根据给定的文件名,构造一个 FileWriter 对象。 |
public FileWriter(String fileName, boolean append) | append如果为 true, 数据写入文件末尾 | 往给定的文件名中,追加数据 |
1.2.成员方法
父类继承 |
成员方法 |
参数 |
说明 |
java.io.Writer; | public void write(String str) | str是要写入的字符串 | 根据给定的文件名,构造一个 FileWriter 对象。 |
java.io.OutputStreamWriter; | public void flush() | 刷新该流对象的缓冲 | |
java.io.OutputStreamWriter; | public void close() | 关闭流对象 | |
java.io.OutputStreamWriter; | public String getEncoding() | 返回流使用的字符编码名称 |
简单实例:往文件中保存“hello world.”字符串,文件不存在时创建该文件,文件存在时覆盖原有文件内容。
1 FileWriter fw = new FileWriter("ioflow.txt"); 2 fw.write("hello"); 3 fw.write(" "); 4 fw.write("world"); 5 fw.write("."); 6 7 fw.flush(); 8 String encode = fw.getEncoding(); 9 System.out.println(encode); //GBK 10 fw.close();
流关闭后,调用了getEncoding()方法,返回null。
1 fw.close(); 2 encode = fw.getEncoding(); 3 System.out.println(encode); //null
父类继承 |
成员方法 |
参数 |
说明 |
java.io.Writer; | public void write(String str) | 要写入的字符串 | 写入字符串 |
java.io.Writer; | public void write(char[] cbuf) | 要写入的字符数组 | 写入字符数组 |
java.io.OutputStreamWriter; | public void write(String str, int off, int len) | 字符串的起始下标,长度 | 写入字符串的一部分 |
java.io.OutputStreamWriter; | public void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 | |
java.io.OutputStreamWriter; | public void write(int c) | 要写入字符的int | 写入单个字符 |
2.FileReader类
2.1.构造方法
构造方法 |
说明 |
public FileReader(String fileName) | 在给定文件名的情况下,创建一个新的FileReader对象。 |
2.2.成员方法
父类继承 |
成员方法 |
返回 |
说明 |
java.io.InputStreamReader; | public int read() | 读取字符的个数 | 读取单个字符 |
读取一个文件
1 FileReader fr = new FileReader("Reader.txt"); 2 3 int ch; 4 while ((ch = fr.read()) != -1) { 5 System.out.print((char)ch); 6 } 7 8 fr.close();
父类继承 |
成员方法 |
参数 |
返回 |
说明 |
java.io.Reader; | public int read(char[] cbuf) | 保存从对象读取的字符,数组的长度影响了循环次数 | 读取到的字符数 | 将字符读入数组 |
读取一个文件
1 FileReader fr = new FileReader("Reader.txt"); 2 char[] chs = new char[1024]; 3 int len; 4 while ((len = fr.read(chs)) != -1) { 5 String str = new String(chs, 0, len); 6 System.out.print(str); 7 }
3.缓冲流 BufferedReader
3.1.构造方法
构造方法 |
说明 |
public BufferedReader(Reader in) | 创建一个默认大小输入缓冲区的缓冲字符输入流。可以使用FileReader对象来完成。 |
1 BufferedReader br = new BufferedReader(new FileReader(filename));
3.2.成员方法
父类继承 |
成员方法 |
参数 |
返回 |
说明 |
自有 | public int read() | 空 | 读入的字符 | 读取单个字符 |
自有 | public int read(char[] cbuf, int off, int len) | cbuf接收读取字符的字符数组,offset写入字符数组的起始下标,len写入的长度 | 读取的字符数,到达流末尾返回-1 | 将字符读入数组的某一部分 |
自有 | public String readLine() | 空 | 不含终止符的行内容,到达流末尾返回null | 读取一个文本行 |
1 String line; 2 while ((line = br.readLine()) != null) { 3 bw.write(line); 4 bw.newLine(); 5 } 6 7 bw.close(); 8 br.close();
扫描二维码关注公众号,回复:
95002 查看本文章
4.缓冲流 BufferedWriter
4.1.构造方法
构造方法 |
说明 |
public BufferedWriter(Writer out) | 创建一个默认大小输出缓冲区的缓冲字符输出流。可以使用FileWriter对象来完成。 |
1 BufferedWriter bw = new BufferedWriter(new FileWriter(fileName, true)); // 追加写入 2 BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); // 覆盖原有内容
4.2.成员方法
父类继承 |
成员方法 |
参数 |
返回 |
说明 |
自有 | public void newLine() | 写入一个行分割符 | ||
自有 | public void write(String s, int off, int len) | 写入字符串的某一部分 | ||
java.io.Writer; | public void write(char[] cbuf) | 要写入的字符数组 | 写入字符数组 | |
java.io.Writer; | public void write(String str) | 要写入的字符串 | 写入字符串 |
5.综合练习
5.1.综合练习1
使用学习过的写入文件、读取文件的5种方法,完成字符文件的复制操作。
1 package day10; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileNotFoundException; 6 import java.io.FileReader; 7 import java.io.FileWriter; 8 import java.io.IOException; 9 import java.io.Writer; 10 11 public class FiveMethodCopyFile04 { 12 public static void main(String[] args) throws IOException { 13 String src = "dir10\\fivePlus\\src.txt"; 14 String des = "dir10\\fivePlus\\des"; 15 16 copy1(src, des + 41 + ".txt"); 17 copy2(src, des + 42 + ".txt"); 18 copy3(src, des + 43 + ".txt"); 19 copy4(src, des + 44 + ".txt"); 20 copy5(src, des + 45 + ".txt"); 21 } 22 23 // 高效流,每次获取一行 24 public static void copy5(String src, String des) throws IOException { 25 BufferedReader br = new BufferedReader(new FileReader(src)); 26 BufferedWriter bw = new BufferedWriter(new FileWriter(des)); 27 28 String line; 29 while ((line = br.readLine()) != null) { 30 bw.write(line); 31 bw.newLine(); 32 } 33 34 bw.close(); 35 br.close(); 36 } 37 38 // 高效流,一次获取的是字符数组 39 public static void copy4(String src, String des) throws IOException { 40 BufferedReader br = new BufferedReader(new FileReader(src)); 41 BufferedWriter bw = new BufferedWriter(new FileWriter(des)); 42 43 char[] chs = new char[4096]; 44 int len; 45 while ((len = br.read(chs)) != -1) { 46 bw.write(chs, 0, len); 47 } 48 49 bw.close(); 50 br.close(); 51 } 52 53 // 高效流,一次获取一个字符 54 public static void copy3(String src, String des) throws IOException { 55 BufferedReader br = new BufferedReader(new FileReader(src)); 56 BufferedWriter bw = new BufferedWriter(new FileWriter(des)); 57 58 int ch; 59 while ((ch = br.read()) != -1) { 60 bw.write(ch); 61 } 62 63 bw.close(); 64 br.close(); 65 } 66 67 // 普通流,一次获取一个字符串 68 public static void copy2(String src, String des) throws IOException { 69 FileReader fr = new FileReader(src); 70 FileWriter fw = new FileWriter(des); 71 72 char[] chs = new char[4096]; 73 int len; 74 while ((len = fr.read(chs)) != -1) { 75 fw.write(chs, 0, len); 76 } 77 78 fw.close(); 79 fr.close(); 80 } 81 82 // 普通流, 一次获取一个字符 83 public static void copy1(String src, String des) throws IOException { 84 FileReader fr = new FileReader(src); 85 FileWriter fw = new FileWriter(des); 86 87 int ch; 88 while ((ch = fr.read()) != -1) { 89 fw.write(ch); 90 } 91 92 fw.close(); 93 fr.close(); 94 } 95 }
5.2.综合练习2
使用IO重写学生管理管理系统。除了两个类文件,还需要一个保存sn序号的文件和一个保存信息的文件。
主类
1 public class StudentManager { 2 public static String SCHOOL = "heima"; 3 public static int sn; 4 public static Scanner sc = new Scanner(System.in); 5 public static String filename = "day11_smIO\\st.txt"; 6 public static String snPath = "day11_smIO\\sn.txt"; 7 8 public static void main(String[] args) throws IOException { 9 ArrayList<Student> al = new ArrayList<Student>(); 10 11 String op = "0"; 12 while (true) { 13 // Runtime.getInstance().exec("cls"); 14 System.out.println("----------学生管理系统----------"); 15 System.out.println("1,查看全部学生信息"); 16 System.out.println("2,添加学生信息"); 17 System.out.println("3,删除学生信息"); 18 System.out.println("4,修改学生信息"); 19 System.out.println("5,查看某个学生"); 20 System.out.println("6,退出程序"); 21 System.out.print("选择相应操作: "); 22 op = sc.nextLine().trim(); 23 switch (op) { 24 case "1": // 查看全部学生信息 25 selectAllStudent(al); 26 break; 27 case "2": // 添加学生信息 28 addStudent(al); 29 break; 30 case "3": // 删除学生信息 31 delStudent(al); 32 break; 33 case "4": // 修改学生信息 34 updateStudent(al); 35 break; 36 case "5": // 查看某个学生 37 selectStudent(al); 38 break; 39 case "6": // 退出程序 40 System.out.println("欢迎使用"); 41 System.exit(0); 42 break; 43 default: 44 System.out.println("选择错误"); 45 break; 46 } 47 } 48 49 } // main over 50 51 // 初始化sn 52 public static int getSN(String snPath) throws IOException{ 53 BufferedReader br = new BufferedReader(new FileReader(snPath)); 54 String tmp = br.readLine().trim(); 55 int sn = Integer.parseInt(tmp); 56 br.close(); 57 return sn; 58 } 59 60 // 保存sn 61 public static void setSN(int sn, String snPath) throws IOException{ 62 BufferedWriter bw = new BufferedWriter(new FileWriter(snPath)); 63 bw.write(String.valueOf(sn)); 64 65 bw.flush(); 66 bw.close(); 67 } 68 69 // 初始化集合 70 public static void readFile(String filename, ArrayList<Student> al) throws IOException { 71 al.clear(); 72 73 BufferedReader br = new BufferedReader(new FileReader(filename)); 74 String[] tmp; 75 Student stu; 76 ; 77 String line; 78 while ((line = br.readLine()) != null) { 79 tmp = line.split(","); 80 // stu = new Student(sid, name, age, priv) 81 stu = new Student(tmp[0].trim(), tmp[1].trim(), tmp[2].trim(), tmp[3].trim()); 82 al.add(stu); 83 } 84 85 br.close(); 86 } 87 88 // 集合信息存盘 89 public static void writeFile(String filename, ArrayList<Student> al) throws IOException { 90 BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); 91 StringBuilder tmp = new StringBuilder(""); 92 for (int i = 0; i < al.size(); i++) { 93 tmp.append(al.get(i).getSid()).append(", "); 94 tmp.append(al.get(i).getName()).append(", "); 95 tmp.append(al.get(i).getAge()).append(", "); 96 tmp.append(al.get(i).getPriv()); 97 bw.write(tmp.toString()); 98 bw.newLine(); 99 bw.flush(); 100 tmp.delete(0, tmp.length()); 101 } 102 103 bw.close(); 104 } 105 106 // print student 107 public static void printStudent(int i, ArrayList<Student> al) { 108 String name = al.get(i).getName(); 109 String age = al.get(i).getAge(); 110 String sid = al.get(i).getSid(); 111 String priv = al.get(i).getPriv(); 112 113 System.out.println(name + "\t" + age + "\t" + sid + "\t\t" + priv); 114 } 115 116 // 添加学生 117 public static void addStudent(ArrayList<Student> al) throws IOException { 118 // 初始化集合 119 readFile(filename, al); 120 121 System.out.print("姓名: "); 122 String name = sc.nextLine().trim(); 123 System.out.print("年龄: "); 124 String age = sc.nextLine().trim(); 125 System.out.print("籍贯: "); 126 String priv = sc.nextLine().trim(); 127 128 // 初始化sn 129 sn = getSN(snPath); 130 sn++; 131 String sid = SCHOOL + sn; 132 sid = sid.replace("heima25", "heima00"); 133 134 Student ss = new Student(sid, name, age, priv); 135 al.add(ss); 136 137 System.out.println("当前系统中学生总数: " + al.size() + " ,新添加学生编号 " + sid); 138 // 保存sn 139 setSN(sn, snPath); 140 writeFile(filename, al); 141 } 142 143 // 删除学生 144 public static void delStudent(ArrayList<Student> al) throws IOException { 145 // 初始化集合 146 readFile(filename, al); 147 148 System.out.print("输入需要删除的学生编号:"); 149 String sid = sc.nextLine().trim(); 150 for (int i = 0; i < al.size(); i++) { 151 if (al.get(i).getSid().equalsIgnoreCase(sid)) { 152 System.out.println("即将删除学生信息,编号 " + al.get(i).getSid()); 153 al.remove(i); 154 System.out.println("删除学生信息: 编号" + sid + ",已清除"); 155 156 // 存盘 157 writeFile(filename, al); 158 return; 159 } 160 } 161 162 System.out.println(sid + "没有找到。"); 163 } 164 165 // 修改学生信息 166 public static void updateStudent(ArrayList<Student> al) throws IOException { 167 // 初始化集合 168 readFile(filename, al); 169 170 System.out.print("输入即将修改的学生编号: "); 171 String sid = sc.nextLine().trim(); 172 int i; 173 for (i = 0; i < al.size(); i++) { 174 if (al.get(i).getSid().equalsIgnoreCase(sid)) { 175 break; 176 } 177 if (al.size() - 1 == i) { 178 System.out.println("输入的学生编号不存在!"); 179 return; 180 } 181 } 182 183 String op = ""; 184 System.out.println("选择修改的范围:"); 185 System.out.println("\t1,修改姓名"); 186 System.out.println("\t2,修改年龄"); 187 System.out.println("\t3,修改籍贯"); 188 System.out.println("\t4,以上全部修改"); 189 System.out.println("\t5,放弃修改"); 190 System.out.print("选择操作的序号:"); 191 op = sc.nextLine().trim(); 192 193 String name = null; 194 String age = null; 195 String pri = null; 196 switch (op) { 197 case "1": // 修改姓名 198 System.out.print("新的姓名"); 199 name = sc.nextLine().trim(); 200 break; 201 case "2": // 修改年龄 202 System.out.print("新的年龄"); 203 age = sc.nextLine().trim(); 204 break; 205 case "3": // 修改籍贯 206 System.out.print("新的籍贯"); 207 pri = sc.nextLine().trim(); 208 break; 209 case "4": // 全部修改 210 System.out.print("新的姓名"); 211 name = sc.nextLine().trim(); 212 System.out.print("新的年龄"); 213 age = sc.nextLine().trim(); 214 System.out.print("新的籍贯"); 215 pri = sc.nextLine().trim(); 216 break; 217 case "5": // 放弃修改 218 System.out.println("退出修改"); 219 break; 220 default: 221 System.out.println("选择错误"); 222 break; 223 } 224 225 if (null != name) { 226 al.get(i).setName(name); 227 } 228 if (null != age) { 229 al.get(i).setAge(age); 230 } 231 if (null != pri) { 232 al.get(i).setPriv(pri); 233 } 234 235 // 存盘 236 writeFile(filename, al); 237 } 238 239 // 选择一个学生 240 public static void selectStudent(ArrayList<Student> al) throws IOException { 241 // 初始化集合 242 readFile(filename, al); 243 244 System.out.print("输入学生编号: "); 245 String sid = sc.nextLine().trim(); 246 int i = 0; 247 248 for (i = 0; i < al.size(); i++) { 249 if (al.get(i).getSid().equalsIgnoreCase(sid)) { 250 printStudent(i, al); 251 return; 252 } 253 } 254 255 System.out.println(sid + " 学生编号没有找到"); 256 } 257 // 查看所有学生 258 public static void selectAllStudent(ArrayList<Student> al) throws IOException { 259 // 选择所有学生,打印输出 260 readFile(filename, al); 261 262 if (0 == al.size()) { 263 System.out.println("当前系统保存的学生总数: " + al.size()); 264 return; 265 } 266 267 System.out.println("姓名\t年龄\t编号\t\t\t籍贯"); 268 for (int i = 0; i < al.size(); i++) { 269 printStudent(i, al); 270 } 271 } 272 }
学生类
1 public class Student { 2 private String sid; 3 private String name; 4 private String age; 5 private String priv; 6 7 public Student() { 8 } 9 public Student(String sid, String name, String age, String priv) { 10 this.sid = sid; 11 this.name = name; 12 this.age = age; 13 this.priv = priv; 14 } 15 public String getSid() { 16 return sid; 17 } 18 public void setSid(String sid) { 19 this.sid = sid; 20 } 21 public String getName() { 22 return name; 23 } 24 public void setName(String name) { 25 this.name = name; 26 } 27 public String getAge() { 28 return age; 29 } 30 public void setAge(String age) { 31 this.age = age; 32 } 33 public String getPriv() { 34 return priv; 35 } 36 public void setPriv(String priv) { 37 this.priv = priv; 38 } 39 }