Java文件与IO流

news2024/9/23 3:19:09

首先我们要清楚什么是流,正如其名,很形象,流就是像水一样的东西,具有方向性,在java中
,流大概就是类
接下来,我们要对输入输出流有一个基本认识,什么是输入输出流呢?
输入输出明显需要一个参照,而这个参照就是主存。
清楚了上面的概念,我们接着看下去吧。
1.png

文件

文件的创建

文件创建共有三种方式
1、

File file = new File(文件的路径);
file.createNewFile();

2、

File file = new File(文件的父目录, 文件名);

3、

File file = new File(文件的父目录, 文件的子目录);

package file;

import org.junit.jupiter.api.Test;
import java.awt.*;
import java.io.File;
import java.io.IOException;

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

    }
    //@Test
    public void create01() throws IOException {
        String filePath = "E:\\new1.txt";
        File file = new File(filePath);
        file.createNewFile();
        System.out.println("文件创建成功");
    }
    //@Test
    public void create02() throws IOException {
        File file1 = new File("E:\\");
        String fileName = "new2.txt";
        File file = new File(file1, fileName);
        file.createNewFile();
        System.out.println("文件创建成功2");
    }
    @Test 
    public void create03()
    {
        String FilePath = "E:\\";
        String FileName = "new3.txt";
        File file = new File(FilePath, FileName);
        try {
            file.createNewFile();
            System.out.println("文件创建成功3");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

文件信息的获取

package file;

import java.io.File;

public class FileInformation {
    public static void main(String[] args) {
        FileInformation fileInformation = new FileInformation();
        fileInformation.info();
    }
    public void info()
    {
        File file = new File("E:\\new1.txt");
        System.out.println("文件名=" + file.getName());
        System.out.println("文件的句=绝对路径" + file.getAbsoluteFile());
        System.out.println("文件的父目录" + file.getParentFile());
        System.out.println("文件的大小" + file.length());
        System.out.println("文件是否存在" + file.exists());
        System.out.println("是否是一个文件" + file.isFile());
        System.out.println("是否是一个目录" + file.isDirectory());
    }
}

2.png

目录文件的创建和删除

删除

package file;

import com.sun.javafx.image.BytePixelSetter;
import org.junit.jupiter.api.Test;

import java.io.File;

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

    }
    @Test
    public void f1()
    {
        String filePath = "E:\\new1.txt";
        File file = new File(filePath);
        if(file.exists())
        {
            if(file.delete()) System.out.println("删除成功");
            else System.out.println("删除成功");
        }else{
            System.out.println("该文件不存在");
        }
    }
}

目录创建

mkdir创建一级目录、mkdirs创建多级目录

@Test
    public void f3()
    {
        String filePath = "D:\\demo\\a\\b\\c";
        File file = new File(filePath);
        if(file.exists())
        {
            System.out.println("目录存在");
        }else {
            if(file.mkdirs()) System.out.println("该目录创建成功");
            else System.out.println("该目录创建失败");
        }
    }

IO流

流的分类

1、按照数据单位不同分为字节流(操作二进制的文件)和字符流(一个字符占多少个字节是不确定的这和编码有点关系,操作文本文件
2、按流向单位不同分为输入流和输出流。
3、按流的角色分:节点流和处理流(这里角色改没有引入下面会介绍)

InputStream和OutStream、Reader、Writer是四个个抽象类,其他类均是实现的这四个Abstract类,均以他们作为后缀名

1.png
2.png

输入流

字节输入流

package inputstream;

import org.junit.jupiter.api.Test;

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

public class FileInputStream_ {
    public static void main(String[] args) {
    }
    //@Test
    public void readFile01() throws IOException {
        String filePath = "D:\\hello.txt";
        FileInputStream fileInputStream = null;
        int readdata = 0;
        try {
            fileInputStream = new FileInputStream(filePath);
           //返回-1表示文件读完了
            while((readdata = fileInputStream.read()) != -1){
                System.out.print((char) readdata);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            //关闭文件流
            fileInputStream.close();
        }
    }
    @Test
    public void readFile02() throws IOException {
        String filePath = "D:\\hello.txt";
        byte[] buf = new byte[8];
        FileInputStream fileInputStream = null;
        int readlen = 0;
        try {
            fileInputStream = new FileInputStream(filePath);
            //返回-1表示文件读完了
            while((readlen = fileInputStream.read(buf)) != -1){
                System.out.print(new String(buf, 0, readlen));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            //关闭文件流
            fileInputStream.close();
        }
    }
}

字节输出流

package outputstream_;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

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

    }
    @Test
    public void writeFile() throws IOException {
        String filePath = "D:\\a.txt";
        FileOutputStream fileOutputStream = null;
        try {
            String str = "Hello World";
            fileOutputStream = new FileOutputStream(filePath);
           //写一个字符
            // fileOutputStream.write('C');
            //写一个字符串
             fileOutputStream.write(str.getBytes());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            fileOutputStream.close();
        }
    }
}
        fileOutputStream = new FileOutputStream(filePath);是覆盖
        fileOutputStream = new FileOutputStream(filePath, true);是追加到源文件后

应用

package outputstream_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) throws IOException {
        //文件拷贝,将D:\\1.png拷贝到C:\\
        //1、创建文件的输入流,将文件读入程序
        //2、创建文件的输出流,将程序中的内容写入文件
        String filePath = "D:\\1.jpg";
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        byte[] buf = new byte[1024];
        int readlen = 0;
        fileInputStream = new FileInputStream(filePath);
        fileOutputStream = new FileOutputStream("E:\\1.jpg");
        while((readlen = fileInputStream.read()) != -1)
        {
            //读取后写入文件,边读边写
            fileOutputStream.write(buf, 0, readlen);
        }
        fileOutputStream.close();
        fileInputStream.close();
    }
}

FileReader

package filereader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReader_ {
    public static void main(String[] args) throws IOException {
        String filePath = "D:\\a.txt";
        FileReader fileReader = null;
        int data = 0;
        try {
            fileReader = new FileReader(filePath);
            while((data = fileReader.read()) != -1)
            {
                System.out.print((char) data);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            fileReader.close();
        }
    }
}

用字符数组来读

package filereader;

import org.junit.jupiter.api.Test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReader_ {
    public static void main(String[] args){
    }
    @Test
    public void readFile01() throws IOException {
        String filePath = "D:\\a.txt";
        int readlen = 0;
        FileReader fileReader = null;
        char [] buf = new char[8];
        try {
            fileReader = new FileReader(filePath);
            while((readlen = fileReader.read(buf)) != -1)
            {
                System.out.print(new String(buf, 0, readlen));
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            fileReader.close();
        }
    }

}

FileWriter

写入数据之后一定要关流或者刷新数据才能被写入

package filewrite;

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

public class FileWriter_ {
    public static void main(String[] args) {
        String path = "D:\\a.txt";
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter(path, true);
            fileWriter.write("aaaa");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                fileWriter.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

节点流和处理流

处理流是连接在已存在的流之上为程序提供更强大的读写功能,包装流更加形象
9.png

BufferedReader & BufferedWriter

package BufferedReader_;

import javax.swing.text.Style;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReader_ {
    public static void main(String[] args) throws IOException {
        String path = "D:\\a.txt";
        BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
        String line;
        try {
            //bufferedReader.readLine();按行读取,当读取到空时,表示读取结束
            while((line = bufferedReader.readLine()) != null) System.out.println(line);;
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            bufferedReader.close();
        }
    }
}
package bufferedreader;

import java.io.*;

public class BufferedReader_ {
    public static void main(String[] args) throws IOException {
        String path = "D:\\a.txt";
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path, true));

        try {
            bufferedWriter.write("阿杜吃饱饱");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            bufferedWriter.flush();
        }

    }
}

视频、图片等是二进制文件用字节流更方便

对象流

使用细节
1、读写顺序要一致
2、要求实现序列化或反序列化对象,需要实现Serializable
3、序列化默认是将所有属性都序列化,但是static和transient不序列化
4、序列化里面的属性也要是现实Serializable接口

标准输入输出流

转换流

转换流应用的情况:
因为字符流不能指定编码格式,而字节流可以指定编码格式,可以先按字节流读入,再用转换流转化,这样就不会乱码了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏斗分析、 python学习路径地图、数据科学技能书知识地图、数据安全治理解决方案、AIGC发展研究、经营的本质…| 本周精华...

▲点击上方卡片关注我,回复“8”,加入数据分析领地,一起学习数据分析,持续更新数据分析学习路径相关资料~(精彩数据观点、学习资料、数据课程分享、读书会、分享会等你一起来乘风破浪~)回复“小飞象”&…

【计算机组成原理】(四)原码补码的加减乘除

各种码的作用: 模运算的性质: -3(-1)*129 90*129 211*129 332*129 -15(-2)*129 我们发现等号右边都是9,相当于等号的左边的数除去12的余数都是9 那我们就说这几个等好左边的数&#xff0…

从零玩转设计模式之原型模式-yuanxingmoshi

title: 从零玩转设计模式之原型模式 date: 2022-12-11 20:05:35.488 updated: 2022-12-23 15:35:44.159 url: https://www.yby6.com/archives/yuanxingmoshi categories: - 设计模式 tags: - 设计模式 - 原型模式 什么是原型模式设计模式? 原型模式是一种软件设计模式&#…

【Rust 日报】2023-05-19 Bevy主分支添加了对WebGPU的支持

cascade-protocol Rust实现的 Cascade information reconciliation protocol for Quantum Key Distribution (QKD) 量子键分布?好像是密码学相关的。 隔行如隔山,小编也不懂这个具体是干啥的。感兴趣的同学可以前去研究。 https://github.com/gftea/casc…

SSR 应用与原 CSR 应用变更同步问题实践

在上一篇介绍《天猫汽车商详页的SSR改造实践》一文中提到过,为免影响线上应用,我们的一体化应用(后面简称称 SSR 应用)是在原 CSR 项目基础上另起的应用仓库。 背景 当商详业务有新需求迭代,CSR 仓库发生了变化&#x…

Java基础学习(18)反射、动态代理

Java基础学习 一、反射1.1 什么是反射1.2 获取class对象 二、综合练习2.1 保存信息2.2 文件的动态创建 三、动态代理3.1 什么是动态代理3.2 创建代理 一、反射 1.1 什么是反射 反射允许对封装类的字段,方法和构造函数的信息进行编程访问 个人理解: 就是…

【JVM】5. 本地方法接口和本地方法栈

文章目录 5.1. 什么是本地方法?5.2. 为什么使用Native Method?5.3. 本地方法栈 5.1. 什么是本地方法? 简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现…

【007】C++数据类型之原码、补码、反码

C数据类型之原码、补码、反码 引言一、原码、补码、反码的概述二、为什么要使用补码?三、对数据的存四、对数据的取总结 引言 💡 作者简介:专注于C/C高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包…

KingbaseES V8R3 集群运维案例--sys_rewind恢复备库节点

​ 案例说明: 在KingbaseES V8R3集群执行failover切换后,原主库被人为误(未配置recovery.conf)启动;或者人为promote备库为主库后。需要将操作节点再重新加入集群,此时节点与主库的timeline将出现分叉,导致节点直接加入…

ChatGLM-6B 本地部署指南!

Datawhale干货 作者:宋志学,Datawhale成员 注意事项-写在最前 显卡需要至少6GB的显存使用GPU部署模型需要自行安装torch和与自己显卡匹配的CUDA、cudnn 下载ChatGLM-6B 在GitHub上下载chatglm-6b的源码,地址如下 https://github.com/THUDM/C…

信息安全-应用安全-SCA技术:SBOM应用实践初探

目录 软件供应链安全治理 供应链安全概述 风险治理重点 何为SBOM SBOM的元素 SBOM的格式 SBOM使用场景 如何使用SBOM 选择SBOM工具 SBOM与风险情报关联 围绕SBOM建立管理流程 关于SBOM的思考 现代软件都是组装的而非纯自研。随着开源组件在数字化应用中的使用比例越…

【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载

文章目录 前言一、运算符重载二、赋值运算符重载1. 赋值运算符重载格式:2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。3. 赋值运算符只能重载成类的成员函数不能重载成全局函数 三、前置与后置 前言 C为…

【Linux】Linux小程序-进度条

目录 一、\r和\n的理解 二、行缓冲区概念 三、进度条源代码 一、\r和\n的理解 \r:回车; \n:换行; 那么请问这两个有什么区别呢? 比如:我们在编写内容的时候,一行没有写完的情况下,需…

【信息安全案例】——软件解密技术(以OllyDbg为例)

目录 🕒 1. 软件解密技术🕘 1.1 概述🕘 1.2 爆破🕘 1.3 跟踪注册🕘 1.4 写出注册 🕒 2. 破解相关问题🕘 2.1 破解程度🕘 2.2 破解线索 🕒 3. 实验:使用 OllyD…

分布式系统原理

高可用是指系统无中断的执行功能的能力,代表了系统的可用程度,是进行系统设计时必须要遵守的准则之一。 而高可用的实现方案,无外乎就是冗余,就存储的高可用而言,问题不在于如何进行数据备份,而在于如何规避…

MacOS Ventura 13.4 (22F66) 带 OC 引导双分区黑苹果镜像

苹果今日向 Mac 电脑用户推送了 macOS 13.4 更新(内部版本号:22F66),本次更新距离上次发布隔了 41 天,主要解决了与Apple Watch自动解锁、蓝牙键盘、屏幕使用时间和VoiceOver相关的问题,推荐大家安装升级。…

Vue 级联组件添加按钮并添加点击事件加传参

我这里采用的是jqvue实现的此功能,首先是要把按钮追加进去,当然头开始写真实dom会导致页面上也追加显示,但是我想实现的是在级联组件上追加所以,选择创建虚拟dom,然后传参这点实在是研究试错了半天,最后选择…

聚观早报|ChatGPT 推出官方 iOS App;大疆称将接收OPPO哲库工程师

今日要闻:ChatGPT 推出官方 iOS App;大疆称将接收OPPO哲库工程师;菜鸟、盒马启动上市计划;苹果公司限制员工使用ChatGPT;张勇:阿里云将分拆上市 ChatGPT 推出官方 iOS App 北京时间 5 月 19 日&#xff0c…

苹果扩充AirTag应用场景,苹果Find My应用更加广泛

根据美国商标和专利局(USPTO)公示的清单,苹果近日获得了一项技术专利,将追踪器附着人体或者服装上,从而监测健康和活动数据。 AirTag 不仅可以追踪某件事物之外,还可以通过安装在人体的不同位置&#xff0c…

人工智能本来是个很简单的事,咋被人们整的这么神秘?

(1) 很多人以为大模型的参数量大是因为数据多。 其实大模型的参数量和超参数的配置相关。主要的超参数有下面几个: 词表大小:Vocab_Size最大位置编码大小:Max_Position_embeddings隐层节点数大小:Hidden_Si…