Io流练习
*按照流向分为:输入流,输出流
按照文件类型分为:字节流,字符流
Io流操作步骤:
1.处理异常
2.具体读写
3.关流
常用流:
输入字节流:InputStream
输出字节流:OutputStream
文件输入字节流:FileInputStream
文件输出字节流:FileOutputStream
缓冲区输入字节流:BufferedInputStream
缓冲区输出字节流:BufferedOutputStream
输入字符流:FileReader
输出字符流:FilieWriter
缓冲区输入字符流:BufferedReader
缓冲区输出字符流:BufferedWriter
对象输入流:ObjectInputStream
对象输出流:ObjectOutputStream
常用方法:
read()取出电脑磁盘中的文件
write()将值或文件存入电脑磁盘
close()关流
newLine换行
对象存入文件和取出要进行序列化和反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。(常见的就是存文件)
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
只有实现了Serializable和Externalizable接口的类的对象才能被序列化
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("E:\\A\\student.txt");
// 输出对象流
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student s1 = new Student(1, "张三", 18, 16.0);
// 以序列化的形式,将对象写到文件 二进制文件
oos.writeObject(s1);
oos.close();
fos.close();
System.out.println("结束" );
}
练习1
从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("E:\\A\\student.java");
// 输入对象流
ObjectInputStream ois = new ObjectInputStream(fis);
// 读取一个对象: 将字节反序列化为对象
Student o = (Student) ois.readObject( );
System.out.println(o );
ois.close();
}
练习2
创建一个学生对象:属性sid sage sname score
// 写一个方法addOne(Student s,String file)把s的信息写到目的文件file中
每个学生一行:1001-韩梅梅-18-98.5
写一个方法deleteOne(int sid,String file) 把file中 指定sid的行数据删除
注意文件不能同时关联输入流和输出流
创建一个中间文件 把从源文件读取的信息 修改后写到中间文件中
删除源文件 重命名中间文件即可
写一个方法addOne(Student s,String file)把s的信息写到目的文件file中
private static void addOne(Students s, String file) throws IOException {
//创建输出流
BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));
bw.write(s.getSid()+"-"+s.getSage()+"-"+s.getSname()+"-"+s.getScore());
bw.newLine();
//关流
bw.close();
}
练习3
//写一个方法deleteOne(int sid,String file) 把file中 指定sid的行数据删除
private static void deleteOne(int i, String file) throws IOException {
File file1 = new File(file);
//输出流
BufferedReader br = new BufferedReader(new FileReader(file1));
//创建一个临时文件
File file2 = new File("E://A//f.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(file2 ,true));
String c = null;
while ((c = br.readLine())!= null){
String s = c;
//根据给定字符拆分
String[] split = s.split("-");
System.out.println("拆分后字符串:"+ split[0]);
int a = Integer.parseInt(split[0]);
if (a==i){
continue;
}
bw.write(c);
bw.newLine();
}
//关流
br.close();
bw.close();
//删除原有的数据
boolean delete = file1.delete( );
System.out.println(delete );
//临时文件重命名
file2.renameTo(new File(file));
}
练习4:
设计方法,传入文件/文件夹路径,删除该文件/文件夹
//设计方法,传入文件/文件夹路径删除该文件,文件夹
public static void test(File file) {
//判断是否存在
if (file.exists()) {
//得到文件数组
File[] files = file.listFiles();
//遍历所有的子目录和文件
for (File f : files) {
//判断此抽象路径名表示的文件是否是一个标准文件。
if (f.isFile()) {
f.delete();//是文件就删除
} else {
test(f);//如果是文件夹就递归这里进入子文件夹中
}
}
file.delete();//删除文件夹
}
}
练习5
//作业: 设计方法,传入一个整数n,返回其阶乘的结果
public static int jc(int n){
if (n==1){
return 1;
}else {
return n * jc(n - 1);
}
}
练习6
写一个方法获取参数文件/文件夹字节大小
public static void getLength(File file) {
//判断是否是标准文件
if(!(file.exists())){
//不是标准文件
System.out.println("文件路径错误");
}
//判断是否是文件夹
if(file.isDirectory()){
//得到文件数组
File[] files = file.listFiles();
//遍历文件数组
for (File f:files){
//递归
getLength(f);
}
}
a+=file.length();
}
练习7
设计方法:
列出A文件夹下的所有记事本文件 (判断字符串后缀)
//全局静态属性,集合用来存储所有的文件名
static ArrayList<String> arrs = new ArrayList<>();
public static ArrayList job1(File file){
if(file.exists()) {
//获取文件数组
File[] files = file.listFiles();
//遍历文件数组,获得文件名
for (File f : files) {
//判断名字是不是。txt结尾
if (f.getName().endsWith(".txt")) {
arrs.add(f.getName());
} else {
job1(f);
}
}
return arrs;
}
System.out.println("文件路径错误");
return null;
}
练习8
删除A文件夹下的所有文件
private static void job2(File file) {
//判断该文件是否存在
if (file.exists()){
//得到文件数组
File[] files = file.listFiles();
//遍历所有子目录和文件
for(File f:files) {
//判断文件是不是一个标准文件
if (f.isFile()) {
//是的话删除该文件
f.delete();
} else {
//不是文件就递归到子文件夹里,进行删除文件
job2(f);
}
}
return;
}
System.out.println("文件路径错误");
}
练习9
删除指定文件夹
private static void job3(File file) {
//判断该文件是否存在
if (file.exists()){
//得到文件数组
File[] files = file.listFiles();
//遍历所有子目录和文件
for(File f:files){
//判断文件是不是一个标准文件
if (f.isFile()){
//是的话删除该文件
f.delete();
}else {
//不是文件就递归到子文件夹里,进行删除文件
job3(f);
}
}
//删除文件夹
file.delete();
return;
}
System.out.println("文件路径错误");
}
练习10
使用字符流把a文件中的数据转换后写到b文件中 大写转换为小写 小写转换为大写 删除数字
public static void changeFile(String filea,String fileb) throws Exception {
//缓冲字符输入流
BufferedReader br = new BufferedReader(new FileReader(filea));
//缓冲区字符输出流
BufferedWriter bw = new BufferedWriter(new FileWriter(fileb,true));
int c=-1;
while ((c=br.read())!= -1){
if(65<=c&&c<=90){
c+=32;
bw.write(c);
continue;
}else if(97<=c&& c<=122){
c-= 32;
bw.write(c);
continue;
}else if(48<=c && c<= 57){
continue;
}
bw.write(c);
}
br.close();
bw.close();
}
}
哪里写的不好,请各位大佬指点!!