Java-IO流基础知识

news2024/11/27 14:49:30

目录

1.File类与路径知识

1.File类

2.Java中的路径知识

3.创建File类的实例

4.File类的方法使用

5.File类使用的注意点

2.IO流知识

1.IO流原理

2.文件的读入

3.read()的重载方法:难点

4.文件的写出

1.写出的说明

2.写出操作的具体步骤

5.文件的复制:先读出在写入

6.字节流FileInputStream和FileOutputStream的使用

7.处理流之一:缓冲流

8.处理流之二:转换流

9.标准输入输出流

10.打印流:PrintStream/PrintWriter

11.数据流:DateInputStream/DateOutputStream

12.对象流

13.RandomAccessFile的使用

14.NIO的使用

3.字符集


1.File类与路径知识

1.File类

1.File的对象可以表示一个文件或文件目录

2.要在java程序中表示一个真实存在的文件或目录,必须有一个File对象,但是java程序中的一个File对象,可能没有一个真实存在的文件或目录。

3.File类声明在java.io包下

2.Java中的路径知识

1.相对路径:相较于某个路径下指明的路径

2.绝对路径:包含盘符在内的文件路径

3.路径中的每级目录之间用一个路径分隔符隔开

4.路径分隔符和系统有关:

windows和Dos系统默认使用 \ 表示

Unix和URL使用 / 表示

5.IDEA中的路径问题

        如果开发中使用JUnit的单元测试方法,相对路径即为当前Module下。

        如果开发中使用main方法测试,相对路径即为当前的Project

3.创建File类的实例

1.File(String filePath)

2.File(String parentPath,String childPath)

3.File(File parentFile,String childPath)

File file1 = new File("hello.txt");
File file2 = new File("D:\\code\\java", "hi");
File file3 = new File(file2, "h.txt");

此时没有对应文件也不会报错,因为此时只是造了内存层面的几个对象而已。

4.File类的方法使用

1.renameTo(File dest):把文件重命名为指定的文件路径:要想返回true,必须file1在硬盘中存在,file2不能存在。

2.getAbsolutePath():获取绝对路径

5.File类使用的注意点

1.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。

2.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的终点

3.要想删除成功,文件目录下不能有子目录或文件,

2.IO流知识

1.IO流原理

1.I/O流用于处理设备之间的数据传输;在java中,数据的输入输出操作以流(stream)的方式进行。

2.流的分类

按照数据单位不同:字节流(8 bit),字符流(16bit),一个字符a等于两个字节01

按照流向不同:输入流,输出流

按照流的角色不同:节点流(直接作用在文件上),处理流(包住节点流的流就是处理流)

3.流的体系

2.文件的读入

1.实例化File类的对象,指明要操作的文件

2.提供具体的流

3.数据的读入:read();返回读入的一个字符,如果达到文件末尾,返回-1;

4.关闭流

代码示例:为突出读入文件的步骤,没有使用try-catch-finally结构,而是throws来处理异常

@Test
public void test2() throws IOException {
    //实例化File类的对象,指明要操作的文件
    File file = new File("hello.txt");
    //2.提供具体的流
    FileReader fr = new FileReader(file);
    //3.数据的读入:read();返回读入的一个字符,如果达到文件末尾,返回-1;
    char[] cbuf = new char[5];
    int len;
    while ((len = fr.read(cbuf)) != -1) {
        for (int i = 0; i < len; i++) {
            System.out.print(cbuf[i]);
        }
    }
    //4.关闭流
    fr.close();
}

5.为了保证流资源一定执行关闭操作。需要使用try-catch-finally处理

6.读入的文件一定要存在,否则会报FileFoundException。

示例代码:使用try-catch-finally处理异常

@Test
public void testFileReader(){
    FileReader fr = null;
    try {
        //1.实例化File类的对象,指明要操作的文件
        File file = new File("hello.txt");
        //2.提供具体的流
        fr = new FileReader(file);
        //3.文件的读入
        char[] cbuf = new char[5];
        int len;
        while ((len = fr.read(cbuf))!= -1){
            for (int i = 0;i < len; i++){
                System.out.println(cbuf[i]);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fr != null){
            //4.关闭流
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
   
}

3.read()的重载方法:难点

1.read(char[] cbuf):返回每次读入cbuf数组中的个数。如果达到文件末尾,返回-1

2.读入操作的难点:while循环中的len不可血多或血少,否则都无法取得文件中的所有值

//3.数据的读入:read();返回读入的一个字符,如果达到文件末尾,返回-1;
char[] cbuf = new char[5];
int len;
while ((len = fr.read(cbuf)) != -1) {
    for (int i = 0; i < len; i++) {
        System.out.print(cbuf[i]);
    }
}

4.文件的写出

1.写出的说明

1.输出操作,对应的File可以不存在。

2.file不存在时,会自动创建文件。

3.若存在,若流使用的构造器是FileWriter(file,false),则覆盖原有文件。

                若FileWriter(file,true),则添加在原有文件后

2.写出操作的具体步骤

1.提供file的对象,指明写出到的文件

2.提供FileWriter的对象,用于数据的写出

3.写出

4.流的关闭

示例代码:两种处理异常的方式都有

@Test
    public void testFileWriter() throws Exception {
        //1.提供file的对象,指明写出到的文件
        File file = new File("hello.txt");
        //2.提供FileWriter的对象,用于数据的写出
        FileWriter fw = new FileWriter(file);
        //3.写出
        fw.write("java");
        //4.流的关闭
        fw.close();
    }
    
    @Test
    public void testFileWriterTwo(){
        FileWriter fw = null;
        try {
            //1.提供file的对象,指明写出到的文件
            File file = new File("hello.txt");
            //2.提供FileWriter的对象,用于数据的写出
            fw = new FileWriter(file);
            //3.写出
            fw.write("java");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw != null){
                //4.流的关闭
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
       
    }

5.文件的复制:先读出在写入

1.创建File类的对象,指明读入和写出的文件

2.创建输入输出流的对象

3.数据的读入和写出

4.关闭流资源

注意:字符流只能用于文件的复制,不能用于图片的复制。图片需要字节流。

@Test
    public void test2() throws IOException {
        //1.创建File类的对象,指明读入和写出的文件
        File srcfile = new File("hello.txt");
        File destfile = new File("hello1.txt");

        //2.创建输入输出流的对象
        FileReader fr = new FileReader(srcfile);
        FileWriter fw = new FileWriter(destfile);
        
        //3.数据的读入和写出
        char[] cbuf = new char[5];
        int len;//记录每次读入到cbuf数组中的字符的个数
        while ((len = fr.read(cbuf)) != -1) {
            //每次写出len个字符
            fw.write(cbuf,0,len);
        }
        //4.关闭流
        fr.close();
    }

6.字节流FileInputStream和FileOutputStream的使用

1.没有try- catch- finally时

@Test
public void test2() throws IOException {
    //实例化File类的对象,指明要操作的文件
    File file = new File("hello.txt");
    //2.提供具体的流
    FileInputStream fis = new FileInputStream(file);
    //3.数据的读入:read();返回读入的一个字符,如果达到文件末尾,返回-1;
    byte[] buffer = new byte[5];
    int len;
    while ((len = fis.read(buffer)) != -1) {
        for (int i = 0; i < len; i++) {
            System.out.print(buffer[i]);
        }
    }
    //4.关闭流
    fis.close();
}

2.对于文本文件(txt,java,c,cpp),使用字符流

3.对于非文本文件(.jpg,mp3,mp4,avi,.doc,.ppt),使用字节流

7.处理流之一:缓冲流

1.处理流:套接在已有的流的基础上

缓冲流的作用:提高文件的读写效率

 

2.使用步骤:造流时:先造节点流,后造处理流-缓冲流

 

3.资源关闭时,先关外层的流,在关内层流

4.关闭外层流的同时,内层流也会自动的进行关闭,因此内层流的关闭可以省略。

5.提高读写速度的原因:内部提供了一个缓冲区。

6.使用BufferdReader和BufferedWriter

7.读写方法总结 

8.处理流之二:转换流

1.InputStreamReader:字节的输入流转换为字符的输入流

2.OutputStreamWriter:字符的输出流转换为字节的输出流

3.提供了字符流和字节流之间的转换

4.字符集

在造流时,第二个形参指明了字符集,具体使用哪个字符集,取决于文件dbcp.txt保存时使用的字符集。

5.字节输入流到字符输入流

6.将utf-8文件转换为gbk文件

7.编码决定了解码;文件编码的方式,决定了解析时使用的字符集。

9.标准输入输出流

1.标准输入流:System.in;键盘输入

2.标准输出流:System.out;控制台输出

10.打印流:PrintStream/PrintWriter

1.提供了一系列的print()重载方法;

2.System.out.println:标准打印流从控制台输出;

11.数据流:DateInputStream/DateOutputStream

作用:用于读取或写出基本数据类型的变量或字符串

12.对象流

可以存储和读取基本数据类型或对象的处理流

1.ObjectInputStream:反序列化:将磁盘文件中的对象还原为内存中的一个Java对象。

2.ObjectOutputStream:序列化:把内存中的Java对象保存到磁盘或通过网络传输出去。

3.对象的序列化机制:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,或通过网络把这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

 

4.Java对象要想序列化,需要满足两个要求:当前类实现接口:Serializable

当前类提供一个全局常量:serialVersionUID

除了当前类需要实现Serializable接口外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)

5.对象流不能序列化static和transient修饰的成员变量。

13.RandomAccessFile的使用

1.直接继承于Object类;实现了DateInput和DateOutput接口

2.既可以作为输入流,又可以作为输出流

3.创建实例时需要指定一个mode参数,该参数指定访问模式

4.如果作为输出流时,写出到的文件不存在,则在执行过程中自动创建;如果写出的文件存在,则会对原有文件内容进行覆盖,默认情况下是从头覆盖。

5.通过相关操作,实现插入数据的效果。

6.提供了一个seek(int pos)方法,能够在指定pos位置进行覆盖(插入)

7.这个类可以实现一个多线程断点下载的功能;下载前会建立两个临时文件,一个是与被下载文件大小相同的空文件,一个是记录文件指针的位置文件,每次暂停都会保存上一次的指针,在断点下载时,会继续从上一次的地方下载,从而实现断点下载功能。

14.NIO的使用

1.NiO是从1.4版本引入的一套心IO API,作用相同;但NIO是面向缓冲区的(IO是面向流的)、基于通道的IO操作。NIO可以更加高效的进行文件的读写操作。

2.jdk7对NiO进行了扩展,称为NIO.2

3.字符集

1.ASCII:美国标准信息交换码;一个字节的七位表示一个字符

2.ISO8859-1:欧洲码表,一个字节的八位表示

3.GB2312:中国的中文编码表;最多两个字节编码所有字符

4.GBK:中国的中文编码表升级,融合了更多的中文文字符号,最多两个字节编码

5.Unicode:国际标准码:融合了人类所有字符,为每个字符分配唯一的字符码;所有文字可以用两个字节编码

6.UTF-8:变长的编码方式,可用1-4个字节表示一个字符

7.为什么Unicode无法落地:因为Unicode也用两个字节编码,但如果第一位用0/1来表示一个字节表示一个字符还是两个字节表示一个字符,那就只剩2^15次方个不够用了。因此UTF-8使用变长方式解决此问题,根据前几个字符的改变来决定几个字节表示一个字符。

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

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

相关文章

测试工程师如何有效的编写bug报告?

为什么要求有效的缺陷报告&#xff1f; 缺陷报告是测试过程中最重要的部分&#xff0c;对产品的质量有较大的影响&#xff0c;是测试人员价值的终极体现。好的缺陷报告可以减少研发部门的二次缺陷率、提高研发修改缺陷的速度、提高测试部门的信用度、增强测试和研发部门的协作…

Resful API是什么

文章目录 摘要1、RESTful API是什么&#xff1f;2、RESTful是什么&#xff1f;参考资料 摘要 RESTful是整个网络应用程序设计风格和开发方式。而RESTful API是其中API的设计风格。 1、RESTful API是什么&#xff1f; API接口在设计命名时&#xff0c;由版本/操作资源名称/操…

【Spring Boot 初识丨六】依赖注入

上一篇讲了 Spring Boot 的beans 本篇来讲一讲 依赖注入 Spring Boot 初识&#xff1a; 【Spring Boot 初识丨一】入门实战 【Spring Boot 初识丨二】maven 【Spring Boot 初识丨三】starter 【Spring Boot 初识丨四】主应用类 【Spring Boot 初识丨五】beans 依赖注入 一、 定…

攻防世界-Crypto-easychallenge

题目描述&#xff1a;将文件下载下来&#xff0c;只有一个pyc文件 1. 思路分析 先向chatgpt问下什么是pyc文件&#xff1a; OK&#xff0c;这里简单总结下&#xff1a; 1. pyc文件是python源码编译后的生成的二进制文件 2. 通过一些库可以逆向出pyc的源代码 那么我们需要做…

数组题目总结 -- 单调栈问题

目录 零. 单调栈一. Next Greater Element(单调栈问题模板)题目简述&#xff1a;思路和代码&#xff1a;I. 思路II. 代码 二. Next Warmer Weather题目简述&#xff1a;思路和代码&#xff1a;I. 思路II. 代码 三. Next Greater Elements&#xff08;循环数组&#xff09;题目简…

UG\NX二次开发 装配下的点坐标

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UF_CURVE_create_point 创建一个点 UF_CSYS_create_temp_csys 创建临时坐标系 以上两个函数都有一个点坐标输入,而且都是输入的绝对坐标系下的点坐标值。下面验证在装配下两个绝对坐标值具体指 “当…

【三维视觉】空间点集的最小包围盒计算

0 问题描述 假设有一个空间点集&#xff0c;不重合的点数有N个。 N1时&#xff0c;最小包围盒是一个点&#xff1a;中心为其本身&#xff0c;半径无穷小 N2时&#xff0c;最小包围盒是一个圆&#xff1a;中心为连线中点&#xff0c;半径为边长一半 N3时&#xff0c;不共线的三…

【C#】并行编程实战:任务并行性(上)

在 .NET 的初始版本中&#xff0c;我们只能依赖线程&#xff08;线程可以直接创建或者使用 ThreadPool 类创建&#xff09;。ThreadPool 类提供了一个托管抽象层&#xff0c;但是开发人员仍然需要依靠 Thread 类来进行更好的控制。而 Thread 类维护困难&#xff0c;且不可托管&…

优惠券超发问题该怎么测试?

在拼夕夕面试中&#xff0c;面试官问了一连串经典的问题&#xff1a;“优惠券库存是怎么扣减的&#xff1f;开发为了解决超发优惠券问题而设计的方案&#xff0c;你了解过吗&#xff1f;你又是如何测试的呢&#xff1f;” 当时听到这些问题还挺懵的&#xff0c;没遇到过超发问…

MidJourney教程02

1.主体内容&#xff1a;高数AI你需要画什么&#xff1f;比如说&#xff0c;一个男生在电脑前画画&#xff1f; 2.环境北京&#xff1a;例如给某些地点或者物件&#xff0c;比如桌子上&#xff0c;足球场&#xff0c;水面有倒影等&#xff1f; 3.构图镜头&#xff1a;比如说强…

springboot项目外卖管理 day07-功能补充

文章目录 前端补充功能1、历史订单功能1.1、梳理过程1.2历史订单展示1.3、效果展示 2、修改/删除地址2.1、回显数据梳理过程 代码展示 2.2、修改地址梳理过程代码 2.3、删除地址梳理过程代码展示 3、再来一单功能3.1、梳理过程3.2、具体实现思路&#xff08;参考一下当初我们怎…

Linux操作系统——第四章 进程间通信

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区别 命名管道的打开规则 system V共享内存 共享内存示意…

【SpringBoot】解决依赖版本不一致报错问题

哈喽大家好&#xff0c;我是阿Q。今天在开发代码的过程中&#xff0c;由于手抖&#xff0c;不知道引入了什么包依赖&#xff0c;导致项目启动一直报错&#xff0c;特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 问题描述 报错信息如下…

vite中使用 vite- aliases 插件报错

vite 中使用 vite-aliases 插件报错 vite-aliases 介绍报错内容解决方法 vite-aliases 介绍 vite-aliases 可以帮助我们自动生成别名: 检测你当前目录下包括 src 在内的所有文件夹, 并帮助我们去生成别名。 下载 npm i vite-aliases -D 使用 import { defineConfig } from vi…

VALSE 2023 无锡线下参会个人总结 6月11日-2

VALSE2023无锡线下参会个人总结 6月11日-2 6月11日会议日程安排Workshop&#xff1a;目标检测与分割程明明&#xff1a;粒度自适应的图像感知技术张兆翔&#xff1a;基于多传感器融合的视觉物体检测与分割 Workshop&#xff1a;ChatGPT与计算机视觉白翔&#xff1a;再谈ChatGPT…

290. 单词规律

290. 单词规律 C代码&#xff1a;别人手搓的 bool wordPattern(char * pattern, char * s){char arr[301][3001];char *p strtok(s, " ");int pos 0;while(p ! NULL) {sprintf(arr[pos], "%s", p);p strtok(NULL, " ");}int len strlen(pat…

Linux环境安装Jdk图文步骤

准备工作&#xff1a; a、jdk安装包&#xff1a;百度网盘 请输入提取码&#xff0c;提取码&#xff1a;jdk8 b、远程工具&#xff0c;xshell&#xff0c;&#xff0c;electerm&#xff0c;&#xff0c;MobaXterm&#xff0c;&#xff0c;fxp&#xff0c;docker&#xff0c;宝…

软件测试V、W和H模型的优缺点汇总,零基础必看哦

目录 V模型 W模型 H模型 总结&#xff1a; 软件测试有三种模型&#xff0c;分别是V模型&#xff0c;W模型和H模型。每种模型都有自己的优点和缺点。 V模型 V模型如下图所示&#xff1a; V模型的优点 V模型明确地标识出了在开发过程中一般应完成的测试级别&#xff0c;以及…

STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号 一. 问题描述二. 方法一——使用HAL_UART_Receive_DMA三. 方法二——使用HAL_UARTEx_ReceiveToIdle_DMA四. 方法三——使用HAL_UARTEx_ReceiveToIdle_IT&#xff08;不使用DMA&#xff09;五. 总结 一. 问题描述 能够点…

java springboot整合MyBatis-Plus 多用点Plus支持一下国人开发的东西吧

文章java springboot整合MyBatis做数据库查询操作讲述了boot项目整合MyBatis的操作方法 但现在就还有一个 MyBatis-Plus Plus是国内整合的一个技术 国内的很多人会喜欢用 特别是一些中小型公司 他们用着会比较舒服 好 然后我们打开idea 创建一个项目 选择 Spring Initializr…