File类的用法和InputStream,OutputStream的用法

news/2024/11/16 11:37:29/

这里写自定义目录标题

    • 一、File类
      • 1.构造方法
      • 2.普通方法
    • 二、InputStream
      • 1.方法
      • 2.FileInputStream
      • 3.Scanner类的应用
    • 三、OutputStream
      • 1.方法
      • 2.FileOutputStream
      • 3.PrintWriter类的应用


一、File类

1.构造方法

签名说明
File(File parent, Stringchild)根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, Stringchild)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

2.普通方法

getAbsolutePath()和getCanonicalPath():
getAbsolutePath():返回 File 对象的绝对路径
getCanonicalPath():返回 File 对象的修饰过的绝对路径
假设我们创建一个File file = new File(文件地址),若文件地址是绝对路径,则上述两个方法输出结果相同,均为D:\hello-world.txt;文件地址是相对路径如:File file = new File("..\\hello.txt");则输出会略有不同:
getAbsolutePath()会输出:D:\hello-world.txt;
getCanonicalPath()会输出:D:\.\hello-world.txt;

余下的比较简单,如下:
在这里插入图片描述
想看全部普通方法的可以自行了解api,给大家贴一个链接:File

二、InputStream

1.方法

签名说明
read()读取一个字节的数据,返回 -1 代表已经完全读完了
read(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
read(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
close()关闭字节流

因为InputStream是抽象类,因此我们还需要了解它的具体实现类,在这里我距离文件操作的实现类 FileInputStream。

2.FileInputStream

构造方法:

签名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

案例:
读取ASCII码字符并显示:

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "Hello" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {byte[] buf = new byte[1024];int len;   while (true) {len = is.read(buf);if (len == -1) {// 代表文件已经全部读完break;}for (int i = 0; i < len; i++) {System.out.printf("%c", buf[i]);}}}}
}

读取汉字并显示:为什么要有这两个案例呢?因为汉字在UTF-8 编码下占三个字符,所以我们需要修改输出,细节如下:

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {byte[] buf = new byte[1024];int len;while (true) {len = is.read(buf);if (len == -1) {// 代表文件已经全部读完break;}// 每次使用 3 字节进行 utf-8 解码,得到中文字符// 利用 String 中的构造方法完成// 这个方法了解下即可,不是通用的解决办法for (int i = 0; i < len; i += 3) {String s = new String(buf, i, 3, "UTF-8");System.out.printf("%s", s);}}}}
}

3.Scanner类的应用

上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类,它可以通过传输一个charset类型,通过编码类型对字符进行自动的调整,是数据正常输出。

签名说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取

案例修改:

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNext()) {String s = scanner.next();System.out.print(s);}}}}
}

三、OutputStream

1.方法

签名说明
write(int b)写入要给字节的数据
write(byte[]b))将 b 这个字符数组中的数据全部写入 os 中
write(byte[]b, int off,int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
close()关闭字节流
flush()我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。

因为OutputStream是抽象类,因此我们还需要了解它的具体实现类,在这里我距离文件操作的实现类 FileOutputStream。

2.FileOutputStream

构造方法:

签名说明
FileOutputStream(File file)利用 File 构造文件输出流
FileOutputStream(String name)利用文件路径构造文件输出流

案例:

ASCII码字符案例:

public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {String s = "Nothing";byte[] b = s.getBytes();os.write(b);// 不要忘记 flushos.flush();}}
}

汉字案例:

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {String s = "你好中国";byte[] b = s.getBytes("utf-8");os.write(b);// 不要忘记 flushos.flush();}}
}

3.PrintWriter类的应用

上述,我们其实已经完成输出工作,但总是有所不方便,我们接来下将 OutputStream 处理下,使用PrintWriter 类来完成输出,因为PrintWriter 类中提供了print/println/printf 方法

案例修改:

// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {PrintWriter writer = new PrintWriter(os);writer.print("你想写入的内容");// 不要忘记 flushwriter.flush();}}
}

http://www.ppmy.cn/news/26679.html

相关文章

python 之 海龟绘图(turtle)

注&#xff1a;从个人博客园移植而来 使用简介 python 2.6引入的一个简单的绘图工具&#xff0c;俗称为海龟绘图。3.x以上使用的话&#xff0c;可通过pip进行安装&#xff0c;命令为&#xff1a; pip/pip3 install turtle如果出现如下错误&#xff1a; 解决方式&#xff1a; …

STM32 OTA应用开发——自制BootLoader

STM32 OTA应用开发——自制BootLoader 目录STM32 OTA应用开发——自制BootLoader前言1 环境搭建2 BootLoader工作原理以及常见分区介绍3 BootLoader的制作4 烧录下载配置5 运行测试结束语前言 什么是OTA&#xff1f; 百度百科&#xff1a;空中下载技术&#xff08;Over-the-Ai…

华为OD机试 - 乘积最大值(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】

乘积最大值 题目 给定一个元素类型为小写字符串的数组 请计算两个没有相同字符的元素长度乘积的最大值 如果没有符合条件的两个元素返回0 输入 输入为一个半角逗号分割的小写字符串数组 2 <= 数组长度 <= 100 0 < 字符串长度 <= 50 输出 两个没有相同字符的元…

【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)

前段时间尝试了一款激光雷达和相机标定的代码&#xff0c;总结了博客&#xff1a; 【学习总结】激光雷达与相机外参标定&#xff1a;原理与代码 但总觉得那个代码太差劲&#xff0c;而且精度不行&#xff0c;于是又找了些新的代码&#xff0c;体验比之前的好很多&#xff0c;在…

加入CSDN的一年,我收获了这些……

加入CSDN的一年&#xff0c;我收获了这些……加入CSDN的一年&#xff0c;我收获了这些……加入CSDN的一年&#xff0c;我收获了这些…… &#x1f680;&#x1f680;时光如白驹过隙般&#xff0c;飞逝而过。一转眼&#xff0c;我就已经是一名大二的学生了&#xff0c;也已经在…

2019蓝桥杯真题旋转 C语言/C++

题目描述 图片旋转是对图片最简单的处理方式之一&#xff0c;在本题中&#xff0c;你需要对图片顺时针旋转 90 度。 我们用一个 nm 的二维数组来表示一个图片&#xff0c;例如下面给出一个 34 的 图片的例子&#xff1a; 1 3 5 7 9 8 7 6 3 5 9 7 这个图片顺时针旋转 90 度…

最全面的SpringBoot教程(六)——SpringBoot运行原理分析

前言 本文为 最全面的SpringBoot教程&#xff08;六&#xff09;——SpringBoot运行原理分析 相关知识&#xff0c;下边将对SpringBoot运行原理以及自动配置原理进行详尽的分析介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考…

掌握MySQL分库分表(三)水平分库分表常见策略range、hash

文章目录range策略Range策略延伸基于Range范围分库分表业务场景hash取模案例规则水平分库分表&#xff0c;根据什么规则进行划分&#xff1f; range策略 自增id&#xff0c;根据ID范围进行分表&#xff08;左闭右开&#xff09; 规则案例&#xff1a; 1~1,000,000 是 table…