IO流(JAVA)

File

File的构造方法
public class dome {
    public static void main(String[] args) {
        File f1 = new File("D:\\Java\\hello");
        System.out.println(f1);

        File f2 = new File("D:","Java\\hello");
        System.out.println(f2);

        File f3 = new File("D:");
        File f4 =new File(f3,"Java\\hello");
        System.out.println(f4);
    }
}
File创建功能
public class dome {
    public static void main(String[] args) throws IOException {

        //如果存在就flast,否则true
        //创建文件
        File f1 = new File("D:\\Java\\hello.txt");
        System.out.println(f1.createNewFile());//不能与目录名相同

        //创建目录
        //如果存在就flast,否则true
        File f2 = new File("D:\\Java\\JavaFile");
        System.out.println(f1.mkdir());

        System.out.println(f2.mkdirs());
    }
}
File的判断以及获取功能
public class dome {
    public static void main(String[] args) throws IOException {
        File f1 = new File("D:\\Java\\JavaFile\\hello.txt");
        System.out.println(f1.isDirectory());   //判断是不是目录
        System.out.println(f1.isFile());        //判断是不是文件
        System.out.println(f1.exists());        //判断路径名是否存在

        System.out.println("-------");
        System.out.println(f1.getAbsolutePath());//返回绝对路径
        System.out.println(f1.getPath());       //返回封装路径
        System.out.println(f1.getName());       //返回文件名称

        System.out.println("-------");
        File f2 = new File("D:\\Java");
        String[] list = f2.list();              //返回此目录中的文件名
        for(String ss : list){
            System.out.println(ss);
        }
        System.out.println("-------");

        File[] files = f2.listFiles();
        for(File f : files){
//            System.out.println(f);        返回绝对路径
//            System.out.println(f.getName());        返回文件名

            //真正用途
            if(f.isFile()){//如果是文件就输出
                System.out.println(f.getName());
            }
        }
    }
}

File的删除

public class dome {
    public static void main(String[] args) throws IOException {
//        D:\Java\JavaFile\hello.txt        绝对路径
//        Java_Code\Filedele                相对路径
        File f = new File("Java_Code\\Filedele.txt");
        f.createNewFile();
        System.out.println(f.delete());

        File f1 = new File("Java_Code\\date");
        f1.mkdir();
        System.out.println(f1.delete());//目录下有内容需要先删文件
    }
}
案例:递归遍历目录
public class dome {
    public static void main(String[] args) throws IOException {
        File f = new File("D:\\WeChat");
//        String[] list = f.list();
//        for(String it : list){
//            System.out.println(it);
//        }
        getAllFilePath(f);

    }
    public static void getAllFilePath(File e){
        File[] files = e.listFiles();
        if(files!=null){
            for(File it : files){
                if(it.isDirectory()){
                    getAllFilePath(it);
                }
                else {
                    System.out.println(it.getPath());
                }
            }
        }
    }
}

字节流

那么这两种流都在什么情况下使用呢?

如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容就使用字符流

否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流

字节流写数据
public class dome {
    public static void main(String[] args) throws IOException {
        //创建字节输出流
        FileOutputStream out = new FileOutputStream("Java_Code\\date\\test.txt");//创建了文件

        out.write(100);//用ALCSS码写进去
        out.write(57);

        //释放资源
        out.close();//关闭此文件的输出流并且释放与此流相关的任何系统资源
    }
}
输入的三种方式
public class dome {
    public static void main(String[] args) throws IOException {
        FileOutputStream out = new FileOutputStream("Java_Code\\Date\\test.txt");
//        out.write(100);
//        out.write(25);
//        byte[] bytes = {100,90,97,98};
//        byte[] bytes = "abcde".getBytes();
//        out.write(bytes);

        byte[] bytes = "abcde".getBytes();
        out.write(bytes,1,3);
        out.close();
    }
}

 输入时的两个小问题

1.追加写入

2.换行

public class dome {
    public static void main(String[] args) throws IOException {
        FileOutputStream f = new FileOutputStream("Java_Code\\Date\\test.txt");
        
        // FileOutputStream f = new FileOutputStream("Java_Code\\Date\\test.txt",true);在末尾追加写入
        for(int i=0;i<=4;i++){
            f.write("hello".getBytes());
            f.write("\t\n".getBytes());
            /*
                    在windows:\r\n
                    在Linux :\n
                    在mac   :\r
             */
        }
        f.close();
    }
}
字节流读数据

一次一个字节

public class dome {
    public static void main(String[] args) throws IOException {
        FileInputStream f = new FileInputStream("Java_Code\\Date\\test.txt");
        int bye;
        while((bye=f.read())!=-1){
            System.out.print((char)bye);
        }
    }
}

一次读入一个字节组

public class dome {
    public static void main(String[] args) throws IOException {
        FileInputStream f = new FileInputStream("Java_Code\\Date\\test.txt");
        byte[] b= new byte[1024];//整数倍
        int len;
        while((len=f.read(b))!=-1){
            System.out.println(new String(b,0,len));
        }
        f.close();
    }
}

复制图片

public class dome {
    public static void main(String[] args) throws IOException {
        FileInputStream f = new FileInputStream("D:\\Java\\domepng.png");
        FileOutputStream f1 = new FileOutputStream("Java_Code\\Date\\test.png");
        byte[] b= new byte[10240];
        int len;
        while((len=f.read(b))!=-1){
            f1.write(b,0,len);
        }
        f.close();
        f1.close();
    }
}
字节缓冲流
public class dome {
    public static void main(String[] args) throws IOException {
//        BufferedOutputStream f = new BufferedOutputStream(new FileOutputStream("Java_Code\\Date\\test.txt"));//字节缓冲输入流
        BufferedInputStream f0 = new BufferedInputStream(new FileInputStream("Java_Code\\Date\\test.txt"));  //字节缓冲输出流
//        f.write("hooo".getBytes());
        byte[] b = new byte[1024];
        int len;
        while((len=f0.read(b))!=-1){
            System.out.println(new String(b,0,len));
        }
//        f.close();
        f0.close();
    }
}

案例:复制视频(字节缓冲流复制一个数组较快)

public class dome {
    public static void main(String[] args) throws IOException {
        long l = System.currentTimeMillis();
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Java_Code\\Date\\text.mp4"));
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("D:\\Java\\domemp4.mp4"));
        int len;
        byte[] b = new byte[20*1024];
        while((len = in.read(b))!=-1){
            out.write(b,0,len);
        }
        out.close();
        in.close();
        long l1 = System.currentTimeMillis();
        System.out.println(l1-l+"毫秒");

    }
}

字符流

编码与解码
public class dome {
    public static void main(String[] args) throws IOException {
        String s = "中国";//默认UTF-8编码
        byte[] bys = s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
//        byte[] bys = s.getBytes();//[-28, -72, -83, -27, -101, -67]
//        byte[] bys = s.getBytes("GBK");//[-42, -48, -71, -6]
//        System.out.println(Arrays.toString(bys));
        String res = new String(bys);//中国
//        String res = new String(bys,"GBK");//中国
        System.out.println(res);

    }
}
public class dome {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\dome.txt"));
//        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\dome.txt"),"GBK");
        out.write("中国");
        out.close();

        InputStreamReader in = new InputStreamReader(new FileInputStream("Java_Code\\Date\\dome.txt"));
//        InputStreamReader in = new InputStreamReader(new FileInputStream("Java_Code\\Date\\dome.txt"),"GBK");
        char[] b = new char[1024];
        int len;
        while((len=in.read(b))!=-1){
            System.out.println(new String(b,0,len));
        }
        in.close();
    }
}
字符流写数据的5种方式
public class dome {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\test.txt"));
        //1
        out.write(97);//此时写不进去数据,因为数据最终要通过FileOutputStream写进去,此时还在缓冲区
        out.flush();//通过刷新流写进数据
        out.write(98);
        //2
        char[] c ={97,98,99};
        out.write(c);//也需要刷新流
        //3
        out.write(c,1,2);//也需要刷新流
        //4
        String s = "wtret";
        out.write(s);//也需要刷新流
        //5
        out.write(s,1,3);//也需要刷新流

        out.close();//此时会自动执行一次刷新流,且释放资源后就不能在写数据了

    }
}
字符流读数据的两种方式
public class dome {
    public static void main(String[] args) throws IOException {
        InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\Java\\dometxt.txt"));
//        int c;
//        while((c=in.read())!=-1){
//            System.out.print((char)c);
//        }
        int len;
        char[] c = new char[1024];
        while((len=in.read(c))!=-1){
            System.out.println(new String(c,0,len));
        }
        in.close();
    }
}

案例:

public class dome {
    public static void main(String[] args) throws IOException {
//        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\test.txt"));
//        InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\Java\\dometxt.txt"));
//        int len;
//        char[] c = new char[1024];
//        while((len=in.read(c))!=-1){
//            out.write(c,0,len);
//        }
//        out.close();
//        in.close();
        
        //涉及到编码问题还需要第一张方式
        FileReader fr = new FileReader("Java_Code\\Date\\test.txt");
        FileWriter fw = new FileWriter("D:\\Java\\dometxt.txt");
        int len;
        char[] c = new char[1024];
        while((len=fr.read(c))!=-1){
            fw.write(c,0,len);
        }
        fr.close();
        fw.close();
    }
}
字符缓冲流
public class dome {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
        bw.write("hello\r\n");
        bw.write("你好\r\n");
        bw.flush();
        BufferedReader br = new BufferedReader(new FileReader("Java_Code\\Date\\test.txt"));
        int len;
        char[] c = new char[1024];
        while((len=br.read(c))!=-1){
            System.out.println(new String(c,0,len));
        }
        br.close();
        bw.close();
    }
}
字符缓冲流的特有功能
public class dome {
    public static void main(String[] args) throws IOException {
//        BufferedWriter bw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
//        for(int i=0;i<=10;i++){
//            bw.write("hello"+i);
//            bw.newLine();//输入一个又系统决定的换行符,例如windows的\r\n
//        }
//        bw.close();
        BufferedReader br = new BufferedReader(new FileReader("Java_Code\\Date\\test.txt"));
        String s;
        while((s=br.readLine())!=null){//一次读入一行数据,如果没有,则输出null,不包括换行
            System.out.println(s);
        }
        br.close();
    }
}

总结

 需要学习的案例

单级文件夹复制

public class dome {
    public static void main(String[] args) throws IOException {
        File fd = new File("D:\\javatest");
        String dname = fd.getName();
        File fsrc = new File("Java_Code\\Date",dname);
        if(!fsrc.exists()){
            fsrc.mkdir();
        }
        File[] files = fd.listFiles();
        for(File it :files){
            String s = it.getName();
            File fsrc1 = new File(fsrc,s);
            cop(it,fsrc1);
        }
    }
    public static void cop(File boot,File src) throws IOException {
        BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(src));
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(boot));
        int len ;
        byte[] b = new byte[1024];
        while((len=br.read(b))!=-1){
            bo.write(b,0,len);
        }
        bo.close();
        br.close();
    }
}

多级文件夹复制

public class dome {
    public static void main(String[] args) throws IOException {
        dir(new File("D:\\Javatest"),new File("Java_Code\\Date"));
    }
    public static void dir(File boot,File src)throws IOException{
        File f = new File(src,boot.getName());
        if(!f.exists()){
            f.mkdir();
        }
        File[] files = boot.listFiles();
        for(File it : files){
            File ff = new File(f,it.getName());
            if(!it.isFile()){
                dir(it,f);
            }
            else cop(it,ff);
        }
    }
    public static void cop(File boot,File src)throws IOException{
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(src));
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(boot));
        int len;
        byte[] b = new byte[20*1024];
        while((len=in.read(b))!=-1){
            out.write(b,0,len);
        }
        out.close();
        in.close();
    }
}

异常处理

public class dome {
    public static void main(String[] args) {

    }
    //JDK9处理异常
    public static void show3() throws IOException{
        BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
        BufferedWriter fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
        try(fr;fw){
            int len;
            char[] a = new char[1024];
            while ((len = fr.read(a)) != -1) {
                fw.write(a, 0, len);
            }
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
    //JDK7处理异常--通常用这个
    public static void show2() {
        try(BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
            BufferedWriter fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));){
            int len;
            char[] a = new char[1024];
            while ((len = fr.read(a)) != -1) {
                fw.write(a, 0, len);
            }
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
    //处理异常
    public static void show1() {
        BufferedReader fr=null;
        BufferedWriter fw = null;
        try {
            fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
            fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
            int len;
            char[] a = new char[1024];
            while ((len = fr.read(a)) != -1) {
                fw.write(a, 0, len);
            }
        }
        catch (IOException e){
            e.printStackTrace();
        }finally {
            fr.close();
            fw.close();
        }
    }
    //抛出异常
    public static void show() throws IOException{
        BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
        BufferedWriter fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
        int len;
        char[] a = new char[1024];
        while((len=fr.read(a))!=-1){
            fw.write(a,0,len);
        }
        fr.close();
        fw.close();
    }
}

特殊操作流

标准输入输出流
public class dome {
    public static void main(String[] args) {
        BufferedReader fr = new BufferedReader(new InputStreamReader(System.in));//从键盘输入数据,标准输入流
        //和Scanner一样
        PrintStream out = System.out;
        out.printf("你好");
        System.out.printf("你好");//标准输出流
    }
}
字节打印流与字符打印流
public class dome {
    public static void main(String[] args) throws IOException {
//        //字节打印流
//        PrintStream ps = new PrintStream("Java_Code\\Date\\test.txt");
//
//        //字节输出流的方法
//        ps.write(97);
//
//        //特有方法
//        ps.print("hello");
//        ps.println("20");
//        ps.close();


        //字符打印流
        PrintWriter pw = new PrintWriter(new FileWriter("Java_Code\\Date\\test.txt"),true);//如果true,则自动刷新
        pw.println("aa");
        /*
                pw.write("aa");
                pw.write("\r\n");
                pw.flush();
         */
        pw.close();
    }
}

案例:字符打印流复制文件

public class dome {
    public static void main(String[] args) throws IOException {
        BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
        PrintWriter pw = new PrintWriter(new FileWriter("Java_Code\\Date\\test.txt"));
        String s;
        while((s=fr.readLine())!=null){
            pw.println(s);
        }
        fr.close();
        pw.close();
    }
}
对象序列化流与反序列化流
public class dome {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //对象序列化流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Java_Code\\Date\\test.txt"));
        Student s = new Student("张三",2,3,4);//对象序列化需要类继承Serializable
        oos.writeObject(s);
        oos.close();

        //对象反序列化流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Java_Code\\Date\\test.txt"));
        Object o = ois.readObject();
        Student ss = (Student)o;
        System.out.println(ss.getName());
        ois.close();
    }
}
IO框架

特殊文本,日志技术

Properties
public class dome {
    public static void main(String[] args) throws Exception {
        //创建一个Properties对象
        Properties properties = new Properties();

        //将文件加载进properties中
        properties.load(new FileReader("Java_Code\\Date\\test.properties"));

//        System.out.println(properties);
        //从文件中寻找数据
        String s1 = properties.getProperty("王伟伟");
        System.out.println(s1);

        Set<String> strings = properties.stringPropertyNames();
        for(String it : strings){
            System.out.println(it+"----->"+properties.getProperty(it));
        }

        //存储进数据
        properties.setProperty("李华","121323");
        properties.store(new FileWriter("Java_Code\\Date\\test.properties"),"此文本储存的是密码");
    }
}
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释-->
<!-- 上面的生命必须放在第一行,必须存在-->
<users>
    <users id = "1">
        <name>李华</name>
        <age>12</age>
        <sex>男</sex>
        <![CDATA[
            3 < 2
        ]]>
        <!-- 特殊数据区,可以写任何数据-->
    </users>
    <users id = "2">
        <name>张三</name>
        <age>13223</age>
        <sex>女</sex>
    </users>
    <!--
     &lt;  代替 <
     &gt;  代替 >
     &amp; 代替 &
     &apos;代替 '
     &quot;代替 "
     -->
</users>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值