Java File类与字节输入输出流详解

news2024/11/24 2:15:43

File类:

1.首先创建一下file的对象:

里面可以写相对路径或者绝对路径

 File file = new File("CCC.java");

也可以使用其他构造方法

//String path = "D:\\ch06";
//String fileName = "1.txt";
File file = new File(path);
或者
File file1 = new File(path,fileName);
File类常用方法:

只有file对象才能够使用下面这些方法,字符串是不可以的(例如path.exsit是错误的)

代码示例:

这里的 isDirectory() 也可以判断这个file是否存在,不存在也返回false

isFile()也同理

 public static void main(String[] args) throws IOException {

        String path = "D:\\ch06";
        String fileName = "1.txt";
        File file = new File(path);
        File file1 = new File(path,fileName);
        if (!file.exists()&&!file.isDirectory()){
            //没有就重新创建
            file.mkdirs();//加上s就是创建多级
            System.out.println("创建文件夹成功");
        }
        if (!file1.exists()&&!file1.isFile()){

            file1.createNewFile();
            System.out.println("创建成功");
        }


     
        System.out.println("判断文件或目录是否存在:"+file.exists());
        System.out.println("只有file对象才能使用exists方法"+file1.exists());
        System.out.println("判断是否是文件夹"+file.isFile());
        System.out.println("判断是否是目录"+file.isDirectory());

        System.out.println("file1的相对路径"+file1.getPath());
        System.out.println("file的相对路径"+file.getPath());
        System.out.println("它的绝对路径"+file.getAbsolutePath());
        System.out.println("获得文件或目录名称"+file.getName());
        System.out.println("获得文件字节数"+file.length());
        System.out.println("删除文件或目录"+file.delete());
    }

流:

java如何读写文件?:通过流

流是一组有序的数据序列以先进先出方式发送信息的通道

Java流的分类:

1.按照流向区分

输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

2.按照处理数据单元划分

字符流和字节流

字节流是8位通用字节流,字符流是16位Unicode字符流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

字节流概述(InputStream和OutputStream):

InputStream被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。由此可见,I/O流中的输入/输出都是相对于程序而言的。

InputStream类(读取文件):

常用方法:

第一个read()方法是从输入流中逐个读入字节,而第二个和第三个read()方法则将若干字节以字节数组的形式一次性读入,从而提高读数据的效率。

方法

方法描述

int read( )

从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数。当没有可用字节时,将返回-1

int read(byte[] b)

装字节数组

从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目

int read(byte[] b,int off,int len)

从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目

void close( )

关闭此输入流并释放与该流关联的所有系统资源

int available();

获取当前流中可用的字节数。

字节流读取文件内容:

问题1:为什么把默认的throw new RuntimeException(e);都变成e.printStackTrace():

答:

  • e.printStackTrace(); 如果你的主要目标是确保程序继续运行,并记录发生的异常
  • throw new RuntimeException(e); 如果你希望在资源清理过程中发生异常时,中断程序以确保异常得到处理。

问题2:

要确保记事本的编码和idea的编码一致传过来才不报错,不然会乱码,原因是:

如果你用 GBK 编码保存文件,而 IntelliJ IDEA 使用 UTF-8 解码,那么字节会被错误地解释成字符,导致显示为乱码。(GBK用两个字节表示一个中文和英文,UTF-8用三个字节表示中文一个自己表示英文)

  public static void main(String[] args) {
        //读取文件
        InputStream is = null;
        try {
            is = new FileInputStream("D:\\ch06/1.txt");
            byte b[] = new byte[is.available()];
            //available()可获得的文件字节数
            is.read(b);//读取内容放入数组
            //将字节数组转为字符串
            String str = new String(b,"GBK");
            System.out.println(str);
        } catch (FileNotFoundException e) {
             e.printStackTrace();
        } catch (IOException e) {
             e.printStackTrace();
        }finally {
            try {
                is.close();
            } catch (IOException e) {

                //这里老师为什么把  throw new RuntimeException(e);改成
                e.printStackTrace();
            }
        }
    }

子类FileInputStream常用的构造方法:

第一种:FileInputStream(File file)

File file1 = new File("D:\\ch06/1.txt");
InputStream is = new FileInputStream(file1);

第二种:FileInputStream(String name)

放String路径

String str1 = "D:\\ch06/1.txt";
InputStream is = new FileInputStream(str1);
InputStream is2 = new FileInputStream( "D:\\ch06/1.txt");

OutputStream类(写入文件):

常用方法:

第一个方法逐个写入字节,后两个方法是将若干个字节以字节数组的形式一次性写入,从而提高写数据的效率。

方法

描述

void write(int c)

向输出流写入一个字节

void write(byte[] buf)

放字节数组

把参数b指定的字节数组的所有字节写到输出流

void close()

刷新此输出流并强制写出所有缓冲的输出字节

void flush():

这个后面讲

强制把缓冲区的数据写到输出流中

字符串对象.getBytes()

String 对象转换为字节数组。

将字符串写入文件:
 public static void main(String[] args) throws IOException {
        String str1 = "D:\\ch06/1.txt";
        OutputStream os = new FileOutputStream(str1,true);
        String mag = "蛋蛋怪嘎达嘎达";
        //将字符串转为字节数组
        //mag.getBytes()
        os.write(mag.getBytes());
        System.out.println("写入成功");
        os.close();
}
子类FileOutputStream常用的构造方法:

1.直接放文件

OutputStream os = new FileOutputStream( "D:\\ch06/1.txt");   

2.直接放路径字符串

String str1 = "D:\\ch06/1.txt";
OutputStream os = new FileOutputStream(str1);   

3.可以在后面追加

String str1 = "D:\\ch06/1.txt";
OutputStream os = new FileOutputStream(str1,true);    

1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容,因为前两种默认append是false

2.创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件

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

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

相关文章

超声波自动气象站

超声波自动气象站的功能优势可以包括以下几个方面: 高精度测量:超声波自动气象站采用超声波技术进行测量,可以实现高精度的测量结果,能够准确地测量气温、湿度、风速、风向等气象参数。 高可靠性:超声波自动气象站采用…

Zynq(2)从Hello World熟悉Zynq开发流程

文章目录 1.开发工具介绍2.工程目录简介3.Zynq裸机开发流程4.Hello World实现4.1vivado开发部分4.2vitis开发部分 5.传送门 1.开发工具介绍 xilinx提供了一系列的开发环境帮助用户提高开发效率,构建了完整的软件生态。对于最新的versal系列芯片,还提供了…

避雷!这5本计算机工程SCIE期刊被标记为“On Hold”状态!

计算机领域的研究学者们注意了!!!这五本期刊被科睿唯安标记为On Hold了!! 1-IEEE Transactions on Intelligent Vehicles 2-Soft Computing 3-Multimedia Tools and Applicaitons 4-Journal of Intelligent & …

安卓学习笔记-unity调用原生opencv的sdk

unity调用原生opencv的sdk 问题描述解决思路解决过程准备工作opencv安卓原生sdk找到人脸检测的代码,检测成功后发送消息给unityunity接收消息 遇到的问题问题一问题二问题三 如何解决遇到的问题问题一:opencvactivity遮挡unity的界面问题问题二&#xff…

OpenAI官宣ChatGPT用户破2亿,新模型比GPT-4强100倍!

在刚刚召开的“KDDI SUMMIT 2024”大会上,OpenAI日本首席执行官長崎忠雄表示,截止至今年8月底,ChatGPT的月活用户数量突破2亿大关,成为史上最快达到这一成就的软件产品。 同时,ChatGPT企业级用户也获得大幅度增长达到…

【企业设置】自定义域名/应用模式支持自定义背景

09/04 主要更新模块概览 自定义背景 签名上传 权限配置 其他更新 01 表单管理 1.1 【移动端子表单】适配权限组字段操作权限 说明: 移动端子表单适配权限组配置,在权限组中可配置控制子表单的可新增记录,可插入记录&#xff0c…

24年9月通信基础知识补充1

看文献过程中不断发现有太多不懂的基础知识,故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关,故记录不会很深入请见谅。 【通信基础知识补充2】9月通信基础知识补充1 一、Zadoff-Chu 序列1.1 Zadoff-Chu 序列…

【区块链 + 基层治理】腾讯未来社区:区块链业主决策系统 | FISCO BCOS应用案例

腾讯未来社区是腾讯推出的智慧社区综合解决方案,致力于形成“互联网 社区”一站式解决方案,打造智慧社 区健康生态。为了解决物业管理领域的痛点,构建围绕居民、物业、政府和商业四个角色为核心的良好生态,以 信息平台及工具为纽…

如何与客户保持高度粘性?这个系统给您答案

客户粘性是企业成功的关键因素之一,企客宝企微版在打通获客、转化、运营全链路方面发挥着重要作用,实现客户粘性的提升。 前言 客户粘性是企业成功的关键因素之一。企业需要不断通过各种手段提升客户粘性,保持客户忠诚度和长期合作关系。企客…

OpenCV结构分析与形状描述符(13)拟合椭圆函数fitEllipseDirect()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆拟合一组2D点。它返回一个内切于该椭圆的旋转矩形。使用了由[91]提出的直接…

STM32F407+CubeMx串口通信实验(学习记录)

一、环境 硬件:STM32F407ZGT6开发板 软件:STM32CubeMx、Keil5 MDK、串口调试助手 PS:前面实验部分的代码都是可以正常运行的,但是在学习过程中我也踩了很多坑(包括一些未弄明白的),我会记录在问题总结部分…

物联网之ESP32控制GPIO输出点亮LED、闪烁LED灯

MENU 前言原理GPIO引脚LED 硬件电路设计软件设计1、点亮一颗LED2、闪烁的LED 前言 不论学习什么单片机,最简单的外设莫过于IO口的高低电平控制LED,本文介绍如何使用Arduino控制ESP32的GPIO输出。通过本文的学习,掌握一定的Arduino程序架构知识…

求求你们别再跟风考PMP了!这几类人才真正需要这本证书!

救命啊!!!这几天刷某书,看到好多人在吐槽说考了PMP证书一点用都没有,每三年还得花个千把块钱去续证,劝大家都别考。 这可能是PMP身上最大的一口“黑锅”了。作为全球认可、含金量极高的项目管理资格认证&am…

AXI4主机测试

前面对AXI4协议进行了比较详细的分析,本篇文章将会写一个主机代码来实现AXI4协议的时序。 设计思路:本次设计的主要目的是验证AXI4_FULL总线的时序,并且提升对AXI4_FULL总线协议的理解,因此可以采用状态机来控制,先向…

孩子用的台灯哪个牌子好?挑选护眼台灯先了解护眼台灯十大排名

孩子们的日常生活中有高达80%的时间是在阅读、做作业或面对电脑屏幕中度过的,因此对良好照明的需求显得尤为严格和精确。一些家长可能认为,只要孩子使用的是纸质材料,不像电子产品那样对眼睛有害,使用普通的台灯照明就足够了&…

mysql快速定位cpu 占比过高的sql语句

mysql快速定位cpu 占比过高的sql语句 当MySQL数据库的CPU使用率异常升高时,定位导致问题的SQL语句可以通过以下步骤进行 1、使用top命令找出mysl进程中占用CPU靠前的线程 #找出mysql 的进程号 ps -ef | grep mysql#根据进程号,找出占用CPU靠前的线程号…

【QT】文件读写,文件对话框

一.QFile类 QFile提供了从文件中读取和写入数据的能力。 我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。 QFile是QIODevice的子类,利用QFile可以对文件进行打开,读取&#xff0c…

Bootstrap 5.3版本创建常用页面

你可以根据自己的主题需求来自定义样式。Bootstrap提供了丰富的CSS类和组件,使得创建响应式、移动优先的网站变得简单。下面我将指导你如何基于Bootstrap 5.3来编写一个简单但自定义主题的页面。 引入Bootstrap 首先,确保你的HTML文件中已经正确引入了B…

Vue学习:v-model绑定文本框、单选按钮、下拉菜单、复选框等

v-model指令可以在组件上使用以实现双向绑定&#xff0c;之前学习过v-model绑定文本框和下拉菜单&#xff0c;今天把表单的几个控件单选按钮radio、复选框checkbox、多行文本框textarea都试着绑定了一下。 一、单行文本框和多行文本框 <p>1.单行文本框</p> 用户名…

程序员日志之DNF编年史

目录 传送门正文日志1、概要2、超高度总结概括3、详细编年史3.1、大背景3.2、冒险家 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&…