Java基础--IO操作

news2024/11/15 19:51:06

一、IO原理及分类

一、IO原理

1、I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输,如读写文件,网络通信等。

2、java程序中对于数据的输入/输出操作一般都是以流的方式进行

3、java.io包下提供各种流类和接口,用与获取不同种类的数据,并通过标准的方法输入或输出数据。

1、输入流input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中

2、输出流output:将程序(内存)数据输出到磁盘、光盘等设备中

二、流的分类 

一、按操作数据单位的不同分为:字节流(8bit)、字符流(16bit)

二、按数据流的流向不同分为:输入流、输出流

三、按流的节点不同分为:节点流、处理流

一、Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。

二、由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

三、 节点流和处理流

1、节点流:直接从数据源或目的地读写数据

2、处理流:不直接连接到数据源或目的地,而是连接在已存在的流上(可以是节点流,也可以是处理流)。通过对数据的处理为程序提供更为强大的读写能力。

二、各类流概述 

一、InputStream & Reader

InputStream和Reader是所有输入流的基类。

1、InputStream(典型实现:FileInputStream)

  1. int read()
  2. intread(byte[] b)
  3. int read(byte[] b, int off,int len)

2、 Reader(典型实现:FileReader) 

  1. int read()
  2. intread(char[] c)
  3. int read(char[] c, int off,int len)

注意:程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该

显式关闭文件IO资源。

 3、FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream用于读取非文本

数据之类的原始字节流。要读取字符流,需要使用FileReader。

二、OutputStream & Writer

OutputStream和 Writer是所有输出流的基类。

1、OutputStream和Writer也非常相似:

  1. void write(intb/intc);
  2. void write(byte[] b/char[] cbuf);
  3. void write(byte[] b/char[] buff,intoff, intlen);
  4. void flush();void close(); 需要先刷新,再关闭此流

2、因为字符流直接以字符作为操作单位,所以Writer可以用字符串来替换字符数组,即以

String对象作为参数

  1.  void write(String str);
  2. void write(String str, intoff, intlen);

3、FileOutputStream从文件系统中的某个文件中获得输出字节。FileOutputStream用于

写出非文本数据之类的原始字节流。要写出字符流,需要使用FileWriter

 三、节点流(或文件流)

一、File文件类的使用

在讲节点流之前,需要了解File文件类,

1、java.io.File 类:文件和文件目录路径的抽象表示形式,与平台无关

2、File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。如果需要访问文件内本身,则需要使用输入/输出流。

3、想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java

程序中的一个File对象,可能没有一个真实存在的文件或目录(也就是程序中有File对象,但对应的文件路径没有或者文件没有)。

4、File对象可以作为参数传递给流的构造器

二、File对象

1、public File(String pathname)以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。                 

        1.绝对路径:是一个固定的路径,从盘符开始   

        2.相对路径:是相对于某个位置开始

2、public File(String parent,String child)以parent为父路径,child为子路径创建File对象。

3、public File(File parent,String child)根据一个父File对象和子文件路径创建File对象

4、路径中的每级目录之间用一个路径分隔符隔开。Java程序支持跨平台运行,因此路径分隔符要慎用。路径分隔符和系统有关:

        1. windows和DOS系统默认使用“\”来表示   

        2. UNIX和URL使用“/”来表示 

5、为了解决这个隐患,File类提供了一个常量:public static final String separator。根据操作系统,动态的提供分隔符。

       File file1= newFile("d:\\test\\info.txt");(window)

       File file2= newFile("d:"+ File.separator + "test" + File.separator+ "info.txt");

       File file3= newFile("d:/test");(unix)

 6、File类的判断功能

  1. public boolean isDirectory():判断是否是文件目录
  2. public boolean isFile():判断是否是文件
  3. public boolean exists():判断是否存在
  4. public boolean canRead():判断是否可读
  5. public boolean canWrite():判断是否可写
  6. public boolean isHidden():判断是否隐藏

  7、File类的创建功能

  1.  public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
  2. public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
  3. public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建 注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。

8、File类的删除功能

        public boolean delete():删除文件或者文件夹

        删除注意事项:Java中的删除不走回收站。要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录

9、File类的获取功能

  1. public String getAbsolutePath():获取绝对路径
  2. public String getPath():获取路径
  3. public String getName():获取名称
  4. public String getParent():获取上层文件目录路径。若无,返回null
  5. public long length():获取文件长度(即:字节数)。不能获取目录的长度。
  6. public long lastModified():获取最后一次的修改时间,毫秒值
  7. public String[] list():获取指定目录下的所有文件或者文件目录的名称数组
  8. public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组

10、File类的重命名功能

public boolean renameTo(File dest):把文件重命名为指定的文件路径

三、File文件类的使用

 File dir1= newFile("D:/IOTest/dir1");
if(!dir1.exists()) {
 // 如果D:/IOTest/dir1不存在,就创建为目录
    dir1.mkdir();
}
// 创建以dir1为父目录,名为"dir2"的File对象
File dir2= newFile(dir1, "dir2");
if(!dir2.exists()) { 
// 如果还不存在,就创建为目录
    dir2.mkdirs();
}
File dir4= newFile(dir1, "dir3/dir4");
if(!dir4.exists()) {
    dir4.mkdirs();
}
// 创建以dir2为父目录,名为"test.txt"的File对象
File file= newFile(dir2, "test.txt");
if(!file.exists()) {
 // 如果还不存在,就创建为文件
    file.createNewFile();
}

四、节点流写入文件

 

 注意事项

  1. 定义文件路径时,注意:可以用“/”或者“\\”。
  2. 在写入一个文件时,如果使用构造器FileOutputStream(file),则目录下有同名文件将被覆盖。
  3. 如果使用构造器FileOutputStream(file,true),则目录下的同名文件不会被覆盖,在文件内容末尾追加内容。
  4. 在读取文件时,必须保证该文件已存在,否则报异常。
  5. 字节流操作字节,比如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt
  6. 字符流操作字符,只能操作普通文本文件。最常见的文本文件:.txt,.java,.c,.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件

四、缓冲流

1、目的:

为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区

 

2、分类

缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:

 1、BufferedInputStream和BufferedOutputStream

 2、BufferedReader和BufferedWriter

A、当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区。

B、当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节

数组。

C、向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流

D、关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也会相应关闭内层节点流

E、flush()方法的使用:手动将buffer中内容写入文件

F、如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出

 五、转换流

一、概述

1、转换流提供了在字节流和字符流之间的转换,Java API提供了两个转换流:

       1、 InputStreamReader:将InputStream转换为Reader

       2、OutputStreamWriter:将Writer转换为OutputStream(是的,你没看错,字符转字节。)是字符通向字节流的桥梁。

2、字节流中的数据都是字符时,转成字符流操作更高效。

3、很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。

二、详解

1、InputStreamReader:实现将字节的输入流按指定字符集转换为字符的输入流。需要和InputStream“套接”。

        构造器:

  1.  public InputStreamReader(InputStream in);
  2.  public InputSreamReader(InputStream in,String charsetName)

    如:Reader isr=new InputStreamReader(System.in,”gbk”);

 2、OutputStreamWriter:实现将字符的输出流按指定字符集转换为字节的输出流。需要和OutputStream“套接”

        构造器:

  1. public OutputStreamWriter(OutputStream out)
  2. public OutputSreamWriter(OutputStream out,String charsetName)

未完待续 

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

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

相关文章

【LeetCode】剑指 Offer(9)

目录 题目:剑指 Offer 25. 合并两个排序的链表 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 26. 树的子结构 - 力扣&#…

阿里测试经验7年,从功能测试到自动化测试,我整理的超全学习指南

做测试七年多,有不少人问过我下面问题: 现在的手工测试真的不行了吗? 测试工程师,三年多快四年的经验,入门自动化测试需要多久? 自学自动化测试到底需要学哪些东西? 不得不说,随着…

TCKGE: Transformers with contrastive learning for knowledge graph embedding

概述: 以前的一些知识图谱嵌入方法由于其浅层的网络结构,不能解决复杂的多关系知识图谱。因此文中针对此种现象,提出了TCKGE——针对于学习多关系知识图谱中复杂的语义信息。TCKGE能够有效的捕获知识图谱中丰富的语义信息,其利用了…

论文阅读_DALLE-2的unCLIP模型

论文信息 name_en: Hierarchical Text-Conditional Image Generation with CLIP Latents name_ch: 利用CLIP的层次化文本条件图像生成 paper_addr: http://arxiv.org/abs/2204.06125 doi: 10.48550/arXiv.2204.06125 date_read: 2023-02-12 date_publish: 2022-04-12 tags: [‘…

【CSS】CSS 层叠样式表 ③ ( CSS 引入方式 - 外链式 | CSS 样式规则 )

文章目录一、CSS 引入方式 - 外链式1、外链式 CSS 语法2、CSS 代码3、HTML 代码二、CSS 样式规则一、CSS 引入方式 - 外链式 1、外链式 CSS 语法 将 CSS 代码 写在外部的 xxx.css 外部样式表文件 中 , 然后 在 HTML 的 head 标签 中 , 使用 <head> <link rel"sty…

JavaSE学习笔记day15

零、 复习昨日 HashSet 不允许重复元素,无序 HashSet去重原理: 先比较hashcode,如果hashcode不一致,直接存储如果hashcode值一样,再比较equals如果equals值为true,则认为完全一样,不存储即去重否则存储 如果使用的是空参构造创建出的TreeSet集合,那么它底层使用的就是自然排序,…

_improve-1

类型及检测方式 1. JS内置类型 JavaScript 的数据类型有下图所示 其中&#xff0c;前 7 种类型为基础类型&#xff0c;最后 1 种&#xff08;Object&#xff09;为引用类型&#xff0c;也是你需要重点关注的&#xff0c;因为它在日常工作中是使用得最频繁&#xff0c;也是需要…

C/C++每日一练(20230226)

目录 17. 电话号码的字母组合 37. 解数独 51. N 皇后 52. N皇后 II 89. 格雷编码 90. 子集 II 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电…

java spring AOP 完全注解开发

我们先创建一个项目 然后引入java spring aop的依赖 然后 在src下创建目录 我这里 直接就叫 Aop了 下面创建一个User类 参考代码如下 package Aop;import org.springframework.stereotype.Component;Component public class User {public void add(){System.out.println(&qu…

Allegro如何锁定报表界面操作指导

Allegro如何锁定报表界面操作指导 用Allegro做PCB设计的时候,进行测量的时候,比如测量器件两个PIN中间的间距,如下图,会有一个报表显示 但是当运行下一个命令的时候,报表会被自动关闭掉。 但是有时我们需要报表界面仍被保留 下面介绍如何将报表界面进行锁定,不受下一个…

新氧2023年财务业绩预测:退市风险大幅降低,收入增长将放缓

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 公司进展 与新氧&#xff08;SY&#xff09;有关的两个重要积极进展值得一提。 第一个积极进展是新氧的退市风险已在很大程度上降低。 2023年1月6日&#xff0c;新氧披露&#xff0c;它已经“重新符合纳斯达克规定的股价每…

AIR32F103(九) CAN总线的通信和ID过滤机制及实例

目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告AIR32F103(二) Linux环境和LibOpenCM3项目模板AIR32F103(三) Linux环境基于标准外设库的项目模板AIR32F103(四) 27倍频216MHz,CoreMark跑分测试AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码AIR32F103(六) ADC,I2S…

Zookeeper完全分布式集群服务

准备好3台服务器:[x]A-> centos7s:192.168.19.1[x]B-> centos7_1:192.168.19.2[x]C-> centos7_2:192.168.19.3配置Zookeeper安装目录在3台宿主机配置zookeeper安装目录&#xff1a;/docker/develop/zookeeper并且在文件夹创建 data 和logs 目录&#xff1a;mkdir -p /…

STM32Cube串口USART发送接收数据

本文代码使用 HAL 库。 文章目录前言一、USART 同步/异步串行接收/发送器二、USART 原理图三、CubeMX 创建工程四、usart.c 文件解析五&#xff0c;设计实验&#xff1a;在 串口输入字符点亮led实验现象&#xff1a;总结前言 这篇文章介绍 实现 USART 异步模式下 通过 串口助手…

去了字节跳动,才知道年薪40W的测试居然有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的…

【设计模式】 观察者模式介绍及C代码实现

【设计模式】 观察者模式介绍及C代码实现 背景 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系”&#xff0c;即一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。…

连续隐身四天、被传退出德云社,于谦未参加相声大会的原因找到了

欲戴皇冠&#xff0c;必受其重。意思就是一个人拥有一定的地位和声望&#xff0c;就会承担由此带来的责任和压力。 就拿德云社郭德纲搭档于谦来说&#xff0c;虽然他是一个谦虚低调的人&#xff0c;但是因为郭德纲老师名气太大&#xff0c;也让于谦伴随着一起名声鹊起。于谦老师…

chatgpt的原理 第三部分

对话 我们是如何学会中文的&#xff1f;从0岁开始&#xff0c;听、说&#xff0c;也就是对话。 我们是如何学外语的&#xff1f;看教材&#xff0c;听广播&#xff0c;背单词。唯独缺少了对话&#xff01;正是因为缺少了对话这个高效的语言学习方式&#xff0c;所以我们的英语…

8个小程序开源项目助你快速搭建小程序

今天和大家分享几个小程序开源项目, 帮助我们轻松搭建自己的小程序应用. 我会从大家最熟悉的小程序UI组件, 到可视化库, 再到完整项目, 一一和大家介绍.小程序UI组件库小程序多端开发框架小程序可视化图表库经典小程序开源项目小程序UI组件库1. vant-weappVant Weapp 是移动端 …

MXNet中使用卷积神经网络textCNN对文本进行情感分类

在图像识别领域&#xff0c;卷积神经网络是非常常见和有用的&#xff0c;我们试图将它应用到文本的情感分类上&#xff0c;如何处理呢&#xff1f;其实思路也是一样的&#xff0c;图片是二维的&#xff0c;文本是一维的&#xff0c;同样的&#xff0c;我们使用一维的卷积核去处…