ifile类的作用:
File类对象可封装要操作的文件,可通过File类的对象对文件进行操作,如查看文件的大小、判断文件是否隐藏、判断文件是否可读等。
局限:File类的相关操作,并不涉及文件内容相关的操作,这是单独依靠File类对象无法实现的操作,此时需要借助I/O流完成。
I/O流可以类比成输入输出的两个管子
分类:
方向:输入流,输出流
处理单元:字节流,字符流
功能:节点流,处理流
输入字符流:
//读取文件内容
public class Test {
public static void main(String[] args) throws IOException {
//将文件封装为file类的对象
File f = new File("d:\\test.txt");
//管子=流=输入字符流 将管子加到文件上
FileReader fr = new FileReader(f);
//开始读取
int n = fr.read();
while (n != -1) {
System.out.println(n);
n = fr.read();
}
//流关闭操作
fr.close();
}
}
i输出字符流
//将程序中的内容输出到文件中去
public class test1 {
public static void main(String[] args) throws IOException {
//程序的字符串
String str = "abc你好";
//文件
File f = new File("d://demo.text");
//字符输出流
FileWriter fw = new FileWriter(f);
//输出
fw.write(str);
//流关闭
fw.close();
}
}
I/O流应用
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
while (true) {
System.out.println("欢迎来到小王书城");
System.out.println("1.展示书籍");
System.out.println("2.上新书籍");
System.out.println("3.下架书籍");
System.out.println("4.退出应用");
//借助Scanner类:
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要的功能序号");
//利用键盘录入序号:
int choice = sc.nextInt();//键盘录入必须回车才能录入
//根据choice录入进行判断
if (choice == 1) {
System.out.println("小王书城>>>>1.展示书籍");
//从文件中读取list
File f = new File("d://demo.txt");
//对f判断
if (f.exists() == true) {
//流
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
//将集合读取
ArrayList list = (ArrayList) (ois.readObject());//从文件中读取的集合
//对集合遍历查看
for (int i = 0; i < list.size(); i++) {
Book b = (Book) (list.get(i));
System.out.println(b.getbNo() + "-" + b.getbName() + "-" + b.getbAuthor());
}
} else {
System.out.println("请上新书籍");
}
}
if (choice == 2) {
System.out.println("小王书城>>>>2.上新书籍");
//请输入书籍编号
System.out.println("请输入书籍编号");
int bNo = sc.nextInt();
System.out.println("请输入书籍名字");
String bName = sc.next();
System.out.println("请输入书籍作者");
String bAuthor = sc.next();
//每上新一本书籍,就要创建一个对象
Book b = new Book();
b.setbNo(bNo);
b.setbName(bName);
b.setbAuthor(bAuthor);
//从文件中读取list
File f = new File("d://demo.txt");
//对f判断
if (f.exists() == true) {//证明集合中有书籍
//流
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
//将集合读取
ArrayList list = (ArrayList) (ois.readObject());//从文件中读取的集合
//对集合读取,并追加新的书籍
list.add(b);
//将集合写出去
//需要流
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
//将list写出
oos.writeObject(list);
//关闭流
oos.close();
} else {
//用集合存放相同个体,书籍对象list放在循环外面
ArrayList list = new ArrayList();//空集合
list.add(b);//添加个体到集合中去
//需要流
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
//将list写出
oos.writeObject(list);
//关闭流
oos.close();
}
}
if (choice == 3) {
System.out.println("小王书城>>>>3.下架书籍");
// //录入你要下载书籍编号
// System.out.println("请输入你要下架的书籍编号");
// int delNo = sc.nextInt();
// //下架该书籍
// for(int i = 0; i < list.size() ; i++){
// Book b = (Book)(list.get(i));
// if(b.getbNo() == delNo){//遍历书籍编号与录入书籍号一致,则移除
// list.remove(b);
// System.out.println("书籍下架成功");
// break;//下架停止
// }
// }
}
if (choice == 4) {
System.out.println("小王书城>>>>4.退出应用");
break;//退出
}
}
}
}