Java基础笔记,file类练习题,Io流练习题递归

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();

    }
}

哪里写的不好,请各位大佬指点!!

猜你喜欢

转载自blog.csdn.net/CV_Ming/article/details/112219140