Java-IO

I:input O: output

File

文件遍历、添加或删除

import java.io.File;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {

        File e = new File("C:\\Users\\Administrator\\Desktop\\Test");
        File[] files = e.listFiles();
        listFiles(files);

    }
    public static void listFiles(File[] files){
        if(files!=null && files.length>0){
            //遍历目录内所有文件
            for(File f:files){
                //判断是否是文件
                if(f.isFile()){
                    //判断是否是avi文件
                    if(f.getName().endsWith(".avi")){
                        //判断文件大小是否大于200MB
                        if(f.length()>100*1024*1024){
                            //删除文件
                            f.delete();
                            //打印删除信息
                            System.out.println(f.getAbsolutePath()+"已删除");

                        }
                    }
                //文件夹
                }else{
                    //进行迭代,打印出所有内层的avi文件
                    File[] f2 = f.listFiles();
                    listFiles(f2);
                }

            }
        }

    }
}

文件过滤器

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File e = new File("C:\\Users\\Administrator\\Desktop\\YUZHAO");
        listFiles(e);

    }
    public static void listFiles(File file){
        //1. 创建一个过滤器 并描述规则
        FileFilter filter = new AVIfileFilter();
        //2. 通过文件获取子文件夹
        File[] files = file.listFiles(filter);
        if(files!=null && files.length!=0){
            for (File f: files){
                if(f.isDirectory()){
                    listFiles(f);
                }else{
                    System.out.println("发现了一个avi"+f.getAbsolutePath());
                }
            }
        }
    }
    
    static class AVIfileFilter implements FileFilter {

        @Override
        public boolean accept(File pathname) {
            if(pathname.getName().endsWith(".avi") || pathname.isDirectory()){
                return true;
            }
            //return true 表示保留,return false表示不保留
            return false;
        }
    }
}

使用匿名内部类

public static void listFiles(File file){
        //1. 创建一个过滤器 并描述规则
        //匿名内部类
        FileFilter filter = new FileFilter(){
            @Override
            public boolean accept(File pathname) {
                if(pathname.getName().endsWith(".avi") || pathname.isDirectory()){
                    return true;
                }
                //return true 表示保留,return false表示不保留
                return false;
            }
        };
        //2. 通过文件获取子文件夹
        File[] files = file.listFiles(filter);
        if(files!=null && files.length!=0){
            for (File f: files){
                if(f.isDirectory()){
                    listFiles(f);
                }else{
                    System.out.println("发现了一个avi"+f.getAbsolutePath());
                }
            }
        }
    }

匿名内部类使用方法二:

 public static void listFiles(File file){
        //1. 创建一个过滤器 并描述规则
        
        //2. 通过文件获取子文件夹
        File[] files = file.listFiles(new FileFilter(){
            @Override
            public boolean accept(File pathname) {
                if(pathname.getName().endsWith(".avi") || pathname.isDirectory()){
                    return true;
                }
                //return true 表示保留,return false表示不保留
                return false;
            }
        });
        if(files!=null && files.length!=0){
            for (File f: files){
                if(f.isDirectory()){
                    listFiles(f);
                }else{
                    System.out.println("发现了一个avi"+f.getAbsolutePath());
                }
            }
        }

    }

相对路径和绝对路径
1.绝对路径,是一个以盘符起始的完整路径
2.相对路径,是一个不完整的便捷路径,在java中是相对于项目目录路径

IO流

字节流:

  1. 输入流: InputStream
  2. 输出流: OutputStream

字符流:

  1. 输入流:Reader
  2. 输出流:Writer

流使用完毕一定要关闭。

OutputStream

一切皆字节:计算机中任何数据(文本、图片等)都是以二进制的形式存储的
在数据传输时 也都是以二进制存储的
不再使用时一定要关闭流。

FileOutputStream

每一个FileOutPutStream对象都可以被看作向某个文件中输出的流。

FileOutputStream​(File file)
创建文件输出流以写入由指定的 File对象表示的文件。 默认为清空重写
FileOutputStream​(File file, boolean append)
创建文件输出流以写入由指定的 File对象表示的文件。

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        System.out.println("============Demo1==========");
         FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test\\a.txt");
         fos.write(65);//A
         byte[] bytes = {66,67,68,69,70};//A
         fos.write(bytes);//AABCDEF
         fos.close();
        System.out.println("============Demo2==========");
        FileOutputStream fos2 = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test\\a2.txt");
        byte[] bytes2 = "ABCDEF".getBytes();
        fos2.write(bytes2);//ABCDEF
        fos2.write(bytes2,1,2);//BC



    }
}

FileInputStream

读取一个字节的内容

import java.io.FileInputStream;
import java.io.IOException;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\a.txt");
        byte b = (byte)fis.read();
        System.out.println(b);//65
        System.out.println((char)b);//A

        fis.close();
    }
}

读取一组字节的内容**(常用)**
目的:减少IO使用频率
读取到旧数据

public class Demo4 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\a.txt");
        byte[] bytes = new byte[10];
        fis.read(bytes);
        System.out.println(new String(bytes));//AABCDEFSFE
        fis.read(bytes);
        System.out.println(new String(bytes));//WWFXCVDSad
        fis.read(bytes);
        System.out.println(new String(bytes));//qdqwwrDSad
        fis.read(bytes);
        System.out.println(new String(bytes));//qdqwwrDSad

    }
}

为了避免这个问题。使用String类的三参构造器设定范围
String​(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。

import java.io.FileInputStream;
import java.io.IOException;

public class Demo4 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\a.txt");
        byte[] bytes = new byte[10];
        while(true){
            int len = fis.read(bytes);
            if(len==-1){
                break;
            }
            System.out.println(new String(bytes,0,len));

        }
        fis.close();
    }
}

文件加密和解密工具

import java.io.*;
import java.util.Scanner;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        System.out.println("请输入文件存储路径");
        Scanner scanner = new Scanner(System.in);
        String fileName = scanner.nextLine();
        //源文件
        File oldFile = new File(fileName);
        //加密存储的新文件 文件名"en-文件名"
        File newFile = new File(oldFile.getParent(),"en-"+oldFile.getName());

        FileInputStream fis = new FileInputStream(oldFile);
        FileOutputStream fos = new FileOutputStream(newFile);
        while(true){
            int content = fis.read();
            if(content==-1){
                break;
            }
            fos.write(content^10);
        }
        System.out.println("加密完毕");
        
    }
}

文字编码

字符流

字符流可以解决在读取文件时程序读取一半的问题
在操作字符输出流时,当缓存不被刷新时,字符是不会被写入到文件中的。close()关闭同样可以刷新缓存。

import java.io.FileWriter;
import java.io.IOException;

public class Demo6 {
    public static void main(String[] args) throws IOException {
        FileWriter wr = new FileWriter("C:\\Users\\Administrator\\Desktop\\test\\字符流.txt");
        wr.write("测试");
        wr.append("字符流").append("结果").append("如此");//测试字符流结果如此
        wr.close();
    }
}

字节流装饰为字符流

import java.io.*;

public class Demo7 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\a.txt");
        InputStreamReader isr = new InputStreamReader(fis,"gbk");//指定编码名称
        while(true){
            int i = isr.read();
            if(i == -1){
                break;
            }
            System.out.println((char)i);
        }

    }
}

字节\字符 输出打印流

import java.io.*;

public class Demo8 {
    public static void main(String[] args) throws IOException {
        PrintStream ps = new PrintStream("C:\\Users\\Administrator\\Desktop\\test\\字节输出打印流.txt");
        ps.println("测试1");
        ps.println("测试2");
        ps.println("测试3");
        ps.close();
        PrintWriter pw = new PrintWriter("C:\\Users\\Administrator\\Desktop\\test\\字符输出打印流.txt");
        pw.println("测试1");
        pw.println("测试2");
        pw.println("测试3");
        ps.flush();
        ps.close();
        FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test\\字符输出打印流2.txt");
        PrintWriter pw2 = new PrintWriter(fos);
        pw2.println("测试1");
        pw2.println("测试2");
        pw2.println("测试3");
        pw2.flush();
        FileReader fw = new FileReader("C:\\Users\\Administrator\\Desktop\\test\\缓存读取流.txt");
        BufferedReader br = new BufferedReader(fw);
        String text = br.readLine();
        System.out.println(text);


    }

}

生成异常文件

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo9 {
    public static void main(String[] args) throws IOException {
        try{
            String s = null;
            s.toString();
        }catch(NullPointerException e){
            PrintWriter pw = new PrintWriter("C:\\Users\\Administrator\\Desktop\\test\\异常日志.txt");
            SimpleDateFormat simpledate = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            pw.println(simpledate.format(new Date()));
            e.printStackTrace(pw);
            pw.close();
        }

    }
}

Properties

将程序中的map集合存储到文件里。
写入

import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public class Demo10 {
    public static void main(String[] args) throws IOException {
        Properties p = new Properties();
        FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\test\\Properties存储.txt");
        p.put("name","小红");
        p.put("age","19");
        p.store(fw,"Person");
        fw.close();
    }
}

读取

public class Demo10 {
    public static void main(String[] args) throws IOException {

            Properties p = new Properties();
            Reader r = new FileReader("C:\\Users\\Administrator\\Desktop\\test\\Properties存储.txt");
            p.load(r);
            System.out.println(p.getProperty("name"));//小红
            System.out.println(p.getProperty("age"));//19
    }
}

序列化

避免对象在程序关闭时消失,将对象存入文件的过程
对象的以及其下的属性必须要实现接口Serializable才可以被序列化

import java.io.*;

public class Demo11 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
    //序列化
        Book b = new Book("指环王","中土世界");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\YUZHAO\\test\\序列化.txt"));
        oos.writeObject(b);
        oos.close();
	//反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(("C:\\Users\\Administrator\\Desktop\\YUZHAO\\test\\序列化.txt")));
        Book o = (Book) ois.readObject();
        System.out.println(o.getInfo());

    }
    //Serializable接口是一种标记 此接口中没有声明的方法
    static class Book implements Serializable {
        private String name;
        private String info;

        public Book(String name, String info) {
            this.name = name;
            this.info = info;
        }
	
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getInfo() {
            return info;
        }

        public void setInfo(String info) {
            this.info = info;
        }
    }

防止文件不存在或读取空文档

 public void loadExpress() throws IOException {
        String location ="src/com/ExpressManagement/EXPRESS.txt";
        File file = new File(location);
        if(file.exists() && file.length()!=0) {
            FileInputStream fis = new FileInputStream(location);
            ObjectInputStream objIn = new ObjectInputStream(fis);
            try (fis; objIn) {
                while (true) {
                    Express e = (Express) objIn.readObject();
                    if (e == null) {
                        break;
                    }
                    eList.add(e);
                }

            } catch (EOFException | ClassNotFoundException e) {


            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值