【Java】 认识I O(代码示例,超详解释)_javai o代码演示

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:xhs1999xhs (备注Java)
img

正文

文章目录

前言

在计算机中,通常使用各种各样的文件来保存数据,如何在Java程序中操作这些文件呢?java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。首先学习使用File类操作文件和目录。

File

  1. File对象可以表示文件或目录,程序中一个File对象可以代表一个文件或目录。可以利用他对文件或目录进行基本操作。如查看名称、最后修改日期、文件大小等。
  2. File类构造方法:
方法说明
File(String pathname)用指定文件路径构造文件
File(String dir,String subpath)指定文件路径下创建指定文件名的文件
File(File parent,String subpath)指定文件对象中创建指定文件名文件
  1. File类常见方法
方法说明
boolean exists()文件是否存在,存在返回true
String getAbsolutePath()返回此对象表示的文件的绝对路径名
String getName()返回吃对象表示的文件的名称
String getParent()返回此File对象的路径名的上一级,没有则返回null
boolean delete()删除此对象指定的文件
boolean isDirectory()是否是目录
boolean mkdir()创建目录,路径由当前File对象指定
boolean mkdirs()创建包括父目录的目录

代码示例:

public static void main(String[] args) throws IOException {
        //构造文件对象
        File file=new File("C:/Users/29616/desktop/1.txt");
        //判断是否存在
        if(file.exists()){
            //存在,判断是否是文件
            if(file.isFile()){
                System.out.println("文件存在");

                //定义str字符串
                String str="好好学习,天天向上\t";
                //字符流 写入 true表示向文件追加内容 false表示覆盖
                FileWriter fw=new FileWriter("C:/Users/29616/desktop/1.txt",true);
                //写入
                fw.write(str);
                //关比字符流,不关闭会导致长期占用资源,并且安全性低
                fw.close();

                //字符流 读取
                FileReader fr=new FileReader("C:/Users/29616/desktop/1.txt");
                //定义一个字符数组,用于存储读到字符
                char[] datas=new char[1024];
                //把读取的内容存到数组里,读到的是字符个数
                fr.read(datas);
                System.out.println(datas);
                fr.close();
                //文件大小
                long length=file.length();
                System.out.println(length);
                //文件路径
                String path=file.getPath();
                System.out.println(path);
                //文件绝对路径
                String abspath=file.getAbsolutePath();
                System.out.println(abspath);
                //最后修改时间
                long time=file.lastModified();
                //System.out.println(time);
                //格式化时间
                Date date=new Date(time);
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println(simpleDateFormat.format(date));

                //删除文件
                if(file.delete()){
                    System.out.println("删除成功");
                }
                //不是文件
            }else{
                System.out.println("文件夹");

            }
        }else{
            //文件不存在
            System.out.println("不存在,创建");
            //创建新文件
            file.createNewFile();
            System.out.println("创建成功" );
        }
    }

Java流

​ 前面讲解的java.io包中的File类对文件或目录的属性进行操作,但File类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据。下面介绍文件的读写操作。

​ 读文件是指把文件中的数据读取到内容中,反之,写文件是指把内存中的数据写入到文件中。通过“流”可以实现读写文件的操作。

流的分类

数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。

  • 按照流的方向主要分为输入流和输出流两大类。
  • 数据流按照数据单位的不同分为字节流和字符流。
  • 按照功能可以划分为节点流和处理流。
1.输入流和输出流

​ 输入/输出流是相对于计算机内存来说的,输入流表示数据输入到内存,输出流表示从内存中输出。Java的输出流主要由OutputStream和Write作为基类,输入流由InputStream和Reader作为基类。

#mermaid-svg-Bsw0UeMpFs86YdXX {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .error-icon{fill:#552222;}#mermaid-svg-Bsw0UeMpFs86YdXX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Bsw0UeMpFs86YdXX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Bsw0UeMpFs86YdXX .marker.cross{stroke:#333333;}#mermaid-svg-Bsw0UeMpFs86YdXX svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Bsw0UeMpFs86YdXX .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster-label text{fill:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster-label span{color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .label text,#mermaid-svg-Bsw0UeMpFs86YdXX span{fill:#333;color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .node rect,#mermaid-svg-Bsw0UeMpFs86YdXX .node circle,#mermaid-svg-Bsw0UeMpFs86YdXX .node ellipse,#mermaid-svg-Bsw0UeMpFs86YdXX .node polygon,#mermaid-svg-Bsw0UeMpFs86YdXX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Bsw0UeMpFs86YdXX .node .label{text-align:center;}#mermaid-svg-Bsw0UeMpFs86YdXX .node.clickable{cursor:pointer;}#mermaid-svg-Bsw0UeMpFs86YdXX .arrowheadPath{fill:#333333;}#mermaid-svg-Bsw0UeMpFs86YdXX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Bsw0UeMpFs86YdXX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Bsw0UeMpFs86YdXX .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Bsw0UeMpFs86YdXX .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster text{fill:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster span{color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Bsw0UeMpFs86YdXX :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

按流向区分

输出流

输出流

OutputStream和Write作为基类

InputStream和Reader作为基类

输入输出流

2.字节流和字符流

​ 输入/输出流又按照处理数据单元的不同分为字节流和字符流。

​ 字节流是8位通用字节流,其基本单位是字节,字节流的基类是InputStream类(常用子类FileInputStream)和OutPutStream类(常用子类FileOutputStream),他们是抽象类。

​ 字符流是16位Unicode字符流,基本单位是Unicode字符。字符流最适合用来处理字符串和文本,支持国际上大多数的字符集和语言。字符流的基类是Reader类(常用子类BufferedReader)和Writee(常用子类BufferedWriter)类,也是抽象类。

​ 注:所有方法再出现错误时,都会抛出IOExcpetion。

#mermaid-svg-FVuAQoiEai5EtIUf {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .error-icon{fill:#552222;}#mermaid-svg-FVuAQoiEai5EtIUf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FVuAQoiEai5EtIUf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FVuAQoiEai5EtIUf .marker.cross{stroke:#333333;}#mermaid-svg-FVuAQoiEai5EtIUf svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FVuAQoiEai5EtIUf .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster-label text{fill:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster-label span{color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .label text,#mermaid-svg-FVuAQoiEai5EtIUf span{fill:#333;color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .node rect,#mermaid-svg-FVuAQoiEai5EtIUf .node circle,#mermaid-svg-FVuAQoiEai5EtIUf .node ellipse,#mermaid-svg-FVuAQoiEai5EtIUf .node polygon,#mermaid-svg-FVuAQoiEai5EtIUf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FVuAQoiEai5EtIUf .node .label{text-align:center;}#mermaid-svg-FVuAQoiEai5EtIUf .node.clickable{cursor:pointer;}#mermaid-svg-FVuAQoiEai5EtIUf .arrowheadPath{fill:#333333;}#mermaid-svg-FVuAQoiEai5EtIUf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FVuAQoiEai5EtIUf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FVuAQoiEai5EtIUf .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-FVuAQoiEai5EtIUf .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster text{fill:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster span{color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FVuAQoiEai5EtIUf :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

按处理数据单元划分

字节流

字符流

字节输入流InputStream作为基类

字节输入流OutputStream作为基类

字符输入流Reader作为基类

字符输出流Writer作为基类

字节流与字符流

读写文本文件
1.使用字节流读写文本文件
  1. 使用字节流FileInputStream读文本文件
package exam;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest {

    /\*\*
 \* 字节流读文件
 \* @param args
 \* @throws IOException
 \*/
    public static void main(String[] args) throws IOException {
        File file=new File("C:/Users/29616/desktop/1.txt");
        //创建流对象
        FileInputStream fis=new FileInputStream(file);
        int data;
        System.out.println("可读取的字节数:"+fis.available());
        System.out.println("文件内容为:");
        //循环读数据
        while ((data=fis.read())!=-1){
            System.out.println(data+"");
        }
        fis.close();
    }
}


  1. 使用字字节流FileOutputStream写文本文件
package exam;

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

/\*\*
 \* 字节流写文件
 \*/
public class FileOutputStreamTest {
    public static void main(String[] args) throws IOException {
        try{
            String str="java";
            byte[] b=str.getBytes();//字节数组
            FileOutputStream fos=new FileOutputStream("C:/Users/29616/desktop/1.txt",true);
            fos.write(b,0,b.length);
            System.out.println("文件已更新");
            fos.flush();
            fos.close();
        }catch (IOException obj){
            System.out.println("创建文件时出错");
        }
    }
}


2.使用字符流读写文本文件
  1. 使用字符流BufferedReander和FileReader读文本文件
package exam;

import java.io.\*;

/\*\*
 \* 字符流读文件
 \*/
public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
        File file=new File("C:/Users/29616/desktop/1.txt");
        FileReader fr=new FileReader(file);
        BufferedReader br=new BufferedReader(fr);
        String line=br.readLine();
        while(line!=null){
            System.out.println(line);
            line=br.readLine();
        }
        br.close();
        fr.close();
    }
}


  1. 使用字符流BufferedWriter和FileWriter写文本文件
package exam;

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

/\*\*
 \* 字符流写文件
 \*/
public class BufferedWriterTest {
    public static void main(String[] args) throws IOException {

        BufferedWriter bw=new BufferedWriter(new FileWriter("C:/Users/29616/desktop/1.txt",true));
        bw.write("java");
        bw.newLine();
        System.out.println("写入成功!");
        bw.flush();
        bw.close();
    }
}

读写二进制文件

读写二进制文件常用的类有DataInputStream和DataOutputStream。

代码示例:

package exam;

import java.io.\*;

/\*\*
 \* 读取二进制文件1.class中数据,复制到另一个二进制文件2.class文件中
 \*/
public class ReadAndWriteClass {
    public static void main(String[] args) throws IOException {
        File file=new File("C:/Users/29616/desktop/1.class");
        File copyfile=new File("C:/Users/29616/desktop/2.class");
        file.createNewFile();
        copyfile.createNewFile();

        //字节流读文件
        FileInputStream fis=new FileInputStream(file);
       //字节流读二进制文件
        DataInputStream dis=new DataInputStream(fis);

        //字节流写文件
        FileOutputStream fos=new FileOutputStream(copyfile,true);
        //字节流写二进制文件
        DataOutputStream dos=new DataOutputStream(fos);
        int temp;
        while ((temp=dis.read())!=-1){ //读数据
            dos.write(temp);  //把读取数据写入到2.clss中
        }
        System.out.println("读写成功");
        fis.close();
        fos.close();
        dis.close();
        dos.close();
    }
}


重定向标准I/O

Java提供了两个标准输入/输出流:System.in和System.out,主要用于从键盘接受数据以及向屏幕输出数据。

使用重定向标准I/O可以使用System.in读取文件中的数据以及使用System.out向文件中写入数据。

System类提供3个重定向标准I/O的方法:

方法说明
static void setErr(PrintStream err)重定向标准错误输出流
static void setIn(InputStream in)重定向标准输入流
static void setOut(PrintStream out)重定向标准输出流

代码示例:

package demo1;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Test3 {
    public static void main(String[] args) {
        //创建PrintStream输入流
        try {
            PrintStream ps=new PrintStream(new FileOutputStream("C:/Users/29616/desktop/1.txt"));
            //将标准输出流重定向到文件
            System.setOut(ps);
            //向文件中输出内容
            System.out.print("重定向测试");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
        }

    }


}

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs(备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ew PrintStream(new FileOutputStream(“C:/Users/29616/desktop/1.txt”));
//将标准输出流重定向到文件
System.setOut(ps);
//向文件中输出内容
System.out.print(“重定向测试”);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
    }

}

}







# **读者福利**

**由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴**

[外链图片转存中...(img-pnniX2on-1713614053401)]

[外链图片转存中...(img-gQAVJC4g-1713614053402)]

[外链图片转存中...(img-xVGIjbUu-1713614053402)]

**更多笔记分享**

[外链图片转存中...(img-vFQ4sRKk-1713614053403)]


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs(备注Java)**
[外链图片转存中...(img-Sw38XVcc-1713614053403)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值