JAVA基础|File,IO流

File类只能对文件本身进行操作,不能读写文件里面存储的数据

IO流就是对文件进行读写的

一. File类

(一)创建对象

import java.io.File;public class FileTest1 {public static void main(String[] args) {// 1. 创建一个File对象,指代某个具体文件File f1 = new File("/Users/guan/Desktop/ab.txt");System.out.println(f1.length());// 2. 路径分隔符File f2 = new File(File.separator + "Users" + File.separator +"guan" + "Desktop" + "ab.txt");// 3. 指代某个文件夹File f3 = new File("/Users/guan/Desktop/");System.out.println(f3.length());    //此处的大小取的是文件夹本身的大小,不会记录文件夹中所有文件的大小// 4. File对象可以去指向一个不存在的文件File f4 = new File("/Users/guan/Desktop/aaaaaa.txt");System.out.println(f4.length());    //由于文件不存在,所以大小为0System.out.println(f4.exists());    //返回false,判断文件是否存在// 5. 我现在要定位的文件是在模块中,应该怎么定位呢File f5 = new File("guan.txt");    //相对路径}
}

(二)常用方法1:判断文件类型,获取文件信息

import java.io.File;
import java.text.SimpleDateFormat;public class FileTest2 {public static void main(String[] args) {// 1. 创建文件对象,指代某个文件File f1 = new File("/Users/guan/Desktop/ab.txt");// 2. 判断当前文件对象,对应的文件路径是否存在,存在返回trueSystem.out.println(f1.exists());// 3. 判断当前文件对象指代的是否是文件,是文件返回true,反之。System.out.println(f1.isFile());// 4. 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之System.out.println(f1.isDirectory());// 5. 获取文件的名称(包含后缀)System.out.println(f1.getName());// 6. 获取文件的大小,返回字节个数System.out.println(f1.length());// 7. 获取文件的最后修改时间long time = f1.lastModified();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(sdf.format(time));// 8. 获取创建文件对象时使用的路径File f2 = new File("/Volumes/Guan/学习/JAVA/JAVA学习/class p152/class p152/src/d1_file/guan.txt")File f3 = new File("guan.txt");System.out.println(f2.getPath());System.out.println(f3.getPath());// 9. 获取绝对路径System.out.println(f2.getAbsolutePath());System.out.println(f3.getAbsoluteFile());}
}

(三)常用方法2:创建文件,删除文件

import java.io.File;
import java.io.IOException;public class FileTest3 {public static void main(String[] args) throws IOException {// 1. 创建一个新文件(文件内容为空),创建成功返回true,反之File f1 = new File("test_file");System.out.println(f1.createNewFile());// 2. 用于创建文件夹,注意:只能创建一级文件夹File f2 = new File("aaa/bbb/ccc");System.out.println(f2.mkdir()); //会返回false,因为mkdir()只能创建一级文件夹// 3. 用于创建文件夹,注意:可以创建多级文件夹File f3 = new File("aaa/bbb/ccc/ddd/eee");System.out.println(f3.mkdirs());// 4. 删除文件,或者空文件,注意:不能删除非空文件夹System.out.println(f1.delete());System.out.println(f3.delete());}
}

(四)常用方法3:遍历文件夹

import java.io.File;public class FileTest4 {public static void main(String[] args) {// 1. public String[] list(): 获取当前目录下所有的“一级文件名称”到一个字符串数组中去返回File f1 = new File("/Users/guan/Desktop");String[] names = f1.list();for (String name : names) {System.out.println(name);}// 2. public File[] listFiles(): (重点)获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点)File[] files = f1.listFiles();for (File file : files) {System.out.println(file.getAbsolutePath());}}
}

(五)案例:

改变某个文件夹下视频的序号,要求从19开始

import java.io.File;public class Test {public static void main(String[] args) {File dir = new File("/Videos");// 1. 拿到下面全部的视频,一级文件对象File[] videos = dir.listFiles();// 2. 一个一个的找for (File video : videos) {// 3. 拿到他的名字,改成新名字String name = video.getName();String index = name.substring(0,name.indexOf("."));String lastName = name.substring(name.indexOf("."));String newName = (Integer.valueOf(index)+18)+"."+lastName;// 4. 正式改名video.renameTo(new File(dir, newName));}}
}

二. 案例(文件搜索):

import java.io.File;public class RecursionTest2 {public static void main(String[] args) {searchFile("D:/","QQ.exe");}/*** 去目录下搜索某个文件* @param dir 目录* @param fileName 要搜索的文件名称*/public static void searchFile(File dir,String fileName) {//1. 把非法的情况都拦截住if (dir == null || !dir.exists() || !dir.isDirectory()) {return; //代表无法搜索}//2. dir不是null,存在,一定是目录对象File [] files = dir.listFiles();//3. 判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象if (files != null && files.length > 0) {//4. 遍历全部一级文件对象for (File file : files) {//5. 判断文件是文件还是文件夹if (file.isFile()) {//是文件,判断这个文件名是否是我找的if (file.getName().contains(fileName)) {System.out.println("找到了:" + file.getAbsolutePath());}} else {// 是文件夹,继续重复这个过程searchFile(file,fileName); }}}}
}

三. IO流

 

(一)字节流

1. 文件字节输入流

作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。

import java.io.*;public class FileInputStreamTest1 {public static void main(String[] args) throws IOException {// 1. 创建文件字节输入流管道,与源文件接通//简化写法,无需自己创建对象:InputStream is =  new FileInputStream("src/text.txt");// 2. 开始读取文件的字节数据int b1 = is.read();System.out.println((char)b1);int b2 = is.read();System.out.println((char)b2);int b3 = is.read();System.out.println((char)b3);// 3. 使用循环改造上述代码int b;  //用于记住读取的字符while ((b = is.read()) != -1) {System.out.println((char)b);}// 读取数据的性能很差// 读取汉字会输出乱码!无法避免的!// 流使用完毕之后,必须关闭!释放系统资源!!is.close();}
}

 2. 文件字节输入流:每次读取多个字节

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class FileInputStreamTest2 {public static void main(String[] args) throws IOException {// 1.创建一个字节输入流对象代表字节输入流管道与源文件接通InputStream inputStream = new FileInputStream("src/text.txt");// 2. 开始读取文件中的字节数据,每次读取多个字节byte[] buffer = new byte[3];int len = inputStream.read(buffer);String rs = new String(buffer);System.out.println(rs);System.out.println("当次读取的字节数量: " + len);int len2 = inputStream.read(buffer);//注意: 第一次读了多少,就倒出多少String rs2 = new String(buffer,0,len2);System.out.println(rs2);System.out.println("当次读取的字节数量: " + len2);}
}

read()方法每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1

对上面的代码进行优化,使用循环:

//3. 使用循环改造:byte[] buffer = new byte[3];int len;    //记住每次读取了多少个字节while ((len = inputStream.read(buffer)) != -1) {// 注意:读取多少,倒出多少String rs = new String(buffer, 0, len);System.out.println(rs);}

3. 文件字节输入流:一次读取完全部字节

我们会发现在上面两个方法中都不能很好的读取汉字,因为汉字的字节比英文字母要更多,既不能一个字节一个字节的读取,又不能一次读取固定字节,这样都有可能出现问题。而最好的避免的方法便是一次读取完全部字节。

方式一:自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读取完文件的全部字节。

import java.io.*;public class FileInputStreamTest03 {public static void main(String[] args) throws IOException {InputStream is = new FileInputStream("src/text.txt");// 1. 准备一个字节数组,大小与文件的大小正好一样大File f = new File("src/text.txt");long size = f.length();byte[] buffer = new byte[(int) size];int len = is.read(buffer);System.out.println(new String(buffer));System.out.println(size);System.out.println(len);}
}

方式二:Java官方为InputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回

import java.io.*;public class FileInputStreamTest03 {public static void main(String[] args) throws IOException {InputStream is = new FileInputStream("src/text.txt");byte[] buffer = is.readAllBytes();System.out.println(new String(buffer));}
}

为了防止文件太大超过了内存大小,那么他会抛出异常。

学了这么多,其实字节流只适合做数据的转移,如文件的复制等。读写文本内容更适合用字符流!

4. 文件字节输出流:写字节出去

作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class FileOutputStream01 {public static void main(String[] args) throws IOException {// 1. 创建一个字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("src/text1.txt");// 2. 开始写字节数据出去了os.write(97);   //97就是一个字节,代表aos.close();}
}

要注意,如果直接在write方法中放一个中文是会输出乱码的,如果想要输出中文,需要这么写:

将中文内容通过getBytes()方法封装成字节数组,然后再输出这个数组即可。

还可以控制输出其中的部分内容:

os.write(bytes,0,15);

例如,我们如果只要输出“我爱你中国”五个字,每个字是3个字节,5*3=15.

需要注意的是,默认的输出管道只是覆盖原文件中的内容,如果想要追加内容只需要在创建输出流的时候这么写:

OutputStream os = new FileOutputStream("src/text1.txt",true);

在路径后面加上true即可。

如何换行输出?

os.write("\r\n".getBytes());

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

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

相关文章

将AVI转换为高质量的MPEG方法!

第 1 部分:使用牛学长转码大师将AVI快速转换为MPEG。 牛学长转码大师是市场上第一款可用于将 AVI 转换为 MPEG 而不会造成质量损失的转换器。该工具具有大量功能,使其在用户中如此受欢迎。以下是一些值得一提的功能。 牛学长转码大师的主要特点&#x…

Reddit是什么?跨境独立站卖家如何用Reddit营销?

在互联网时代,社交媒体营销已成为品牌推广的重要手段。Reddit,作为一个充满活力的社区平台,正逐渐受到越来越多跨境独立站卖家的关注。如果你在独立站引流方面遇到瓶颈,不妨了解一下Reddit这个平台。本文将介绍Reddit是什么&#…

计算机电子书籍资源转载分享

这篇会很简略,一个博主的宝藏,被我发现了,而且是去年2023年更新的,里面计算机网络的第八版书籍都有(谢希仁编著) 这是该博主的github上面发布的:zhangyachen/ComputerArchitectureAndCppBooks:…

鸿蒙ArkUI-X跨语言调用说明:【平台桥接开发指南(Android)Bridge API】

arkui-x.bridge.d.ts (平台桥接) 本模块提供ArkUI端和Android或iOS平台端消息通信的功能,包括数据传输、方法调用和事件调用。需配套平台端API使用,Android侧请参考[BridgePlugin],iOS侧参考[BridgePlugin]。 说明: 开发前请熟悉…

Jmeter 安装教程:简单易懂

随着互联网的不断发展,网站和应用程序的性能测试变得越来越重要。Apache JMeter 是一款广泛使用的性能测试工具,它强大且使用广泛,适用于各种性能测试需求。不论你是刚刚接触性能测试的新手,还是一位有经验的测试工程师&#xff0…

通过花生壳对git服务器做内网穿透

很长一段时间内公司的git服务器只能够在公司内网访问,最近出差的同事比较多,通过外网访问git服务器的需求也迫在眉睫,于是选择了贝锐“花生壳”做内网穿透处理。 首先去贝锐官网购买花生壳映射,我选择的是个人标准版本&#xff0c…

内存卡频频提示格式化?数据恢复全攻略

内存卡提示需要格式化 在数字时代,内存卡作为我们存储数据的常用设备,广泛应用于手机、相机、无人机等多种设备中。然而,不少用户在使用过程中会突然遭遇一个令人头疼的问题——内存卡提示需要格式化。这一提示往往伴随着数据的丢失风险&…

采用全自动贴片机来组装和满足回流焊工艺,列产品小,效率高,低输出纹波—— TPVT-W5系列

TPVT-W5系列是一款标准的表面贴装电源模块,完全实现采用全自动贴片机来组装和满足回流焊工艺,大大提高产能和降低人工费用。此系列产品小,效率高,低输出纹波及提供3000V以上的直流电压隔离,SMD封装。

Android framework修改,禁止指定包名的apk安装到设备上(基于Android10.0.0-r41)

文章目录 Android framework修改,禁止指定包名的apk安装到设备上(基于Android10.0.0-r41)1.新增接口提供给上层调用2.在pms中实现新增的接口3.找到preparePackageLI方法。4.测试验证 Android framework修改,禁止指定包名的apk安装到设备上(基于Android10…

钛媒体首发 | 百度沈抖回应大模型价格战:希望大家别再天天拉表格比价格

ITValue “有这个时间,不如去卷场景、卷应用。” 作者|张帅 编辑|盖虹达 首发|钛媒体APP ITValue 钛媒体App 5月28日消息,在2024智能经济论坛上,百度集团执行副总裁、百度智能云事业群总裁沈抖介绍了文心系…

免费,Python蓝桥杯等级考试真题--第16级(含答案解析和代码)

Python蓝桥杯等级考试真题–第16级 一、 选择题 答案:B 解析:(75)//212//26,故答案为B。 答案:B 解析:因为x15,所以range(2,15),i的取值为2-14&a…

Java+mysql酒店管理系统

1.引言 1.1编写的目的 本文档为酒店管理系统需求分析报告,为酒店管理系统的设计的主要依据,主要针对酒店管理系统的概要设计和详细设计人员,作为项目验收的主要依据。 1.2背景 本软件全称为阳光酒店管理系统。 1.3 参考资料 …

云平台教程 | 手把手教你GSEA富集分析和解读

爱基百客云平台小工具使用 1.1 爱基百客云平台之GSEA分析 1.2 GSEA富集分析原理图 1.3 GSEA富集分析过程 1.4 参数设置 1.5 任务查看 1.6 结果 1.6.1 富集结果表格 1.6.2 富集可视化图解读 01 爱基百客云平台小工具使用 首先,打开爱基百客官网:http://w…

STM32——启动文件选择及启动文件宏定义

文章目录 前提:以STM32F1xx系列芯片为例(有方法,其他系列一样)启动文件选择对应启动文件的寻找方法对应宏定义#define的寻找方法另外 前提:以STM32F1xx系列芯片为例(有方法,其他系列一样&#x…

时间|基于SprinBoot+vue的时间管理系统(源码+数据库+文档)

时间管理系统 目录 基于SprinBootvue的时间管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农…

VMware vSphere Distributed Services Engine 和利用 DPU 实现网络加速

VMware相关学习专栏:虚拟化技术 vSphere 8.0 通过加速数据处理单元 (DPU) 上的网络功能实现了突破性的工作负载性能。 vSphere 8.0 通过加速 DPU 上的网络功能实现了突破性工作负载性能,从而满足现代分布式工作负载的吞吐量和延迟需求。借助 vSphere Dis…

物联网都有什么优缺点?——青创智通

工业物联网平台解决方案 物联网,这个曾经似乎遥不可及的科技概念,如今已逐渐渗透到我们生活的方方面面。从智能家居到智能工业,从智能医疗到智能城市,物联网技术正在改变着我们的世界。 然而,正如任何一项技术一样&a…

解决 git:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0

解决 git:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0 问题 git pull报错:fatal: unable to access ‘https://github.com/aircrushin/ultrav-music.git/’: Failed to connect to github.com port 443 after 21077 ms: Couldn’t connect to serve…

IPv4组播——组播IP,MAC地址,组播网络基本架构

目录 一.组播的好处 二.组播实现原理 1.组播IP地址 2.组播MAC地址 (1)前24位 (2)第25位 (3)低23位 三.组播网络基本架构 1.源端网络 2.组播转发网络 3.成员端网络 四.组播服务类型 根据组播源…

2024长三角快递物流展即将亮相,致鸿物流器材有限公司值得关注

广东致鸿物流器材有限公司,前身为广州致鸿物流器材有限公司,成立于2002年初,是一家中国专业仓储笼研发制造公司,公司员工约400名,日产仓储笼制造规模近8000个,在全国范围内有五大配送服务中心:江…