【JavaSE】I/O流(学习笔记)

一、File类

1、构造的三种方法

File f1 = new File("//Users//wangminghao//Desktop//demo.txt");
System.out.println(f1);File f2 = new File("//Users//wangminghao//Desktop","demo.txt");
System.out.println(f2);File f3 = new File("//Users//wangminghao//Desktop");
File f4 = new File(f3,"demo.txt");
System.out.println(f4);
  1. 两个反斜线是为了转义
  2. 构造File类只是存储路径(抽象存在),不会创建相应的文件

2、File类的创建功能

  1. 不存在时创建新空文件:public boolean createNewFile()
File f1 = new File("//Users//wangminghao//Desktop//demo.txt");
try {System.out.println(f1.createNewFile());
} catch (IOException e) {e.printStackTrace();
  • 相对路径:默认与模块同一级别,在项目路径下
  1. 创建相应目录:public boolean mkdir()
File f2 = new File("//Users//wangminghao//Desktop//demo");
System.out.println(f2.mkdir());
  1. 创建相应目录及其父目录:public boolean mkdirs()
File f3 = new File("//Users//wangminghao//Desktop//demo1//demo2");
System.out.println(f3.mkdirs());

3、File类的删除方法

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

4、File类的判断与获取方法

  1. 判目录:public boolean isDirectory()
  2. 判文件:public boolean isFile()
  3. 判存在:public boolean exists()
  4. 返回绝对路径:public String getAbsolutePath()
  5. 返回(构建时的)路径:public String getPath()
  6. 返回目录/文件名:public String getName()
  7. 返回目录下文件/目录的数组:public String[] list()
  8. 返回目录下文件/目录的File:public File[] listFiles()

5、遍历目录

public class demo4 {static File f = new File("//Users//wangminghao//Desktop");static int i = 0;public static void main(String[] args) {dfs(f);}public static void dfs(File f){File[] files = f.listFiles();for (File file : files){if(file.isFile()){System.out.println( ++i + "." + file.getName() + ":" + file.getAbsoluteFile());}else{dfs(file);}}}
}

二、I/O流

  1. IO:输入输出
  2. 流:数据传输
  3. 用途:处理设备间的数据传输
  4. 分类
    1. 流向
      1. 输入流:读数据
      2. 输出流:写数据
    2. 数据类型
      1. 字节流:其他格式
      2. 字符流:文本格式

三、字节流

1、字节流抽象基类

  • InputStream:输入流超类
  • OutputStream:输出流超类
  • 子类名特点:以基类名为后缀

2、字节流写数据

  1. 创建FileOutputStream --> 创建文件和指向文件的字节输出流对象

    FileOutputStream fos = new FileOutputStream("...//demo.txt");
    
  2. 写入数据

    1. 写一个字节:void write(int b)
    2. 写一个字节数组:void write(byte[] b)
    3. 返回一个字符串的字节数组:byte[] getBytes(StandardCharsets.UTF_8)
    4. 写一个字节数组的部分:void write(byte[] b, int off, int len)
      1. off:偏移量,即索引位置
  3. 释放资源

    fos.close();	// 放finally
    
  4. 补充:

    1. 换行
      1. win:\r\n
      2. linux:\n
      3. mac:\r
    2. 追加写入
      1. public FileOutputStream(String name, boolean append)
      2. append = true:追加写入,默认为false
FileOutputStream fos = null;
try {fos = new FileOutputStream("//Users//wangminghao//Desktop//demo.txt");fos.write("芭芭拉冲呀!".getBytes(StandardCharsets.UTF_8));
} catch (FileNotFoundException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}finally {if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}
}

3、字节流读数据

  1. 创建FileInputStream

FileInputStream fis = new FileInputStream("...//demo.txt");

  1. 读取数据

    1. 读一个字节:int read() --> 返回ascii码,到末尾返回-1
    int by;
    while((by = fis.read()) != -1){System.out.print(by);
    }
    
    1. 读一个字节数组:int read(byte[] b)
    byte[] bys = new byte[1024];
    int len;
    while((len = fis.read(bys)) != -1){System.out.print(new String(bys,0,len));
    }
    
    1. 读一个字节数组的部分:void write(byte[] b, int off, int len)
      1. off:偏移量,即索引位置

4、字节缓冲流

  1. 作用:将数据写入缓冲区,一次性输出,提高效率 --> 字节缓冲流 + 一次读写一个字节数组:最快
  2. 字节缓冲输出流:BufferedOutputstream(Outputstream out)
  3. 字节缓冲输入流:BufferedInputstream(Inputstream in)
  4. 建议使用匿名对象
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("//Users//wangminghao//Desktop//demo.mp4"));
  5. 刷新流:void flush() --> 将缓冲区刷新到输入、输出流

四、字符流

1、字符流概述

  1. 字符流 = 字节流 + 编码表
  2. 出现的的原因:
    1. 字节读取文本数据文件,汉字在不同编码下占用的字节数不同
    2. 中文第一个数字是负数
  3. GBK:2字节
  4. UTF-8:3字节

2、字符串的编解码问题

(1)编码
  1. byte[] getBytes():默认编码
  2. byte[] getBytes(String charsetName):指定编码
(2)解码
  1. String(byte[] bytes):默认解码
  2. String(byte[] bytes, String charsetName):指定解码
(3)字符流抽象基类
  1. 输入流Reader:InputStreamReader:字节 --> 字符
    InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\demo")[, "UTF-8"]);
  2. 输出流Writer:OutputStreamWriter:字符 --> 字节
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\demo")[, "UTF-8"]);

3、字符流读写数据

字符流写数据
  1. 写一个字符:void write(int c)
  2. 写一个字符数组:void write(char[] cbuf)
  3. 写部分字符数组:void write(char[] cbuf, int off, int len)
  4. 写一个字符串:void write(String s)
  5. 写部分字符串:void write(String s, int off, int len)
  6. 刷新流:void flush() --> 除了字节流,其内部有缓冲区,需要刷新
字符流读数据
  1. 读一个字符:int read()
  2. 读一个字符数组:int read(char[] cbuf)

4、字符流子类

  1. FileReader:FileReader(String fileName)
  2. FileWriter:FileWriter(String fileName)
  3. 用途:
    1. 用于替代OutputStreamReader/InputStreamWriter
    2. 只能用默认字符集

5、字符缓冲流

  1. BufferedReader
    1. 构造方法:BufferedReader(Reader in)
    2. 写一个换行:void newLine()
  2. BufferedWriter
    1. 构造方法:BufferedReader(Writer out)
    2. 读一行字符串:public String readLine()
      1. 不包括终止字符
      2. 流的结尾返回null
String line;
while((line = br.readLine()) != null){System.out.println(line);
}

6、异常处理

// 定义
try(定义流操作){异常代码;
}catch{异常处理代码;
}
// 实例
try (FileInputStream fis = new FileInputStream("D:\\demo1/txt");FileOutputStream fos = new FileOutputStream("D:\\demo2.txt")) {int r = fis.read();fos.write(96);
} catch (IOException e) {e.printStackTrace();
}

节省了释放资源于判断空指针异常的操作


五、特殊操作流

1、标准输入输出流

System类的两个静态成员变量

  1. 标准输入流:public static final InputStream in
    1. 构造:
      1. InputStream is = System.in
      2. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    2. 包装类Scanner:Scanner sc = new Scanner(System.in);
  2. 标准输出流:public static final OutputStream out
    1. System.out的本质是一个字节输出流
    2. System.out.println(...);
    3. System.out.print(...);
    4. System.out.printf(...);

2、打印流

分类
  • 字节打印流:PrintStream(String fileName[, boolean autoFlush])
  • 字符打印流:PrintWriter(String fileName[, boolean autoFlush])
  • autoFlush:每次print后自动刷新流,默认为false
特有方法

(不转码,所见即所得)

  • print
  • println
特点
  • 只负输出数据,不负责读取
  • 特有方法输出不转码,所见即所得

3、对象序列化流

概述
  • 对象序列化:保存对象文件
  • 对象反序列化:读取对象文件
对象序列化流:ObjectOutputStream
  • 构造:ObjectOutputStream(OutputStream out)
  • 写入对象:void writeObject(Object obj)
  • 对象需要实现Serializable标记接口
对象反序列化流:ObjectInputStream
  • 构造:ObjectOutputStream(InputStream in)
  • 读取对象:Object readObject()
serialVersionUID
  • 用于验证序列化和反序列化时,是否使用了同一个类
  • 可以子类重写:private static final long serialVersionUID = 42L;
transient关键词

使成员变量不参与序列化

4、Properties

  1. 作为Map集合的使用
Properties prop = new Properties();
prop.put("wmh","wjh");
for (Object key : prop.keySet()) {System.out.println(key + "," + prop.get(key));
}
  1. 作为Map集合的特有方法
    1. Object setProperty(String key, String value):put集合的值
    2. String getProperty(String key):查键值(不存在返回null)
    3. Set<String> stringPropertyNames():返回键集
  2. Properties与I/O流结合
    1. 字节流读取:void load(InputStream inStream)
    2. 字符流读取:void load(Reader reader)
    3. 字节流写入:void store(OutputStream out, String comments)
    4. 字符流写入:void store(Writer writer, String comments)
      • comments:描述信息,不描述写null

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

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

相关文章

SQL server 2016安装

1、关系数据库的基本概念。 行&#xff1a;每行成为一条“记录”或“元组”&#xff0c;用于描述一个对象的信息。 列&#xff1a;每列称为一个“字段”或“属性”&#xff0c;用于描述对象的一个属性。 2、主键与外键。 主键&#xff1a;键&#xff0c;即关键字。主键由一个或…

Android--Jetpack--Lifecycle详解

富贵本无根&#xff0c;尽从勤里得 一&#xff0c;定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件&#xff08;Activity/Fragment&#xff09;生命周期状态信息&#xff0c;并且允许其观察者监听宿主生命周期状态变化。 顾名思义&#xff0c;Lifecycle的主…

TA-Lib学习研究笔记(八)——Momentum Indicators 上

TA-Lib学习研究笔记&#xff08;八&#xff09;——Momentum Indicators 上 Momentum Indicators 动量指标&#xff0c;是最重要的股票分析指标&#xff0c;能够通过数据量化分析价格、成交量&#xff0c;预测股票走势和强度&#xff0c;大部分指标都在股票软件中提供。 1. A…

ChatGpt回答人工智能发展利大于弊的辩证论述

ChatGpt回答人工智能发展利大于弊的辩证论述 ​ 随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域展现出强大的潜力&#xff0c;引发了广泛的关注和讨论。在这场变革中&#xff0c;人们对于人工智能的发展是否对人类有益的争论也愈发激烈。本文将…

离散化算法总结

离散化是将大范围的数字映射到小范围的区间内&#xff0c;适用于稀疏的区间。 两个问题需要考虑&#xff1a; 1. 原数组中可能有重复元素&#xff0c;需要去重。 2. 如何算出离散化后的值&#xff08;离散化后保序&#xff0c;使用二分&#xff09;。 题目链接&#xff1a; …

水利安全监测方案——基于RTU200的解决方案

引言&#xff1a; 水资源是人类赖以生存的重要基础&#xff0c;对于保障水利系统安全运行以及应对自然灾害起着关键作用。为了实现水利安全监测的目标&#xff0c;我们提出了基于RTU200的解决方案。本方案将结合RTU200的可靠性、灵活性和高效性&#xff0c;为您打造一个全面的…

[笔记]dubbo发送接收

公司需要使用java技术栈接入一套自定义的通讯协议&#xff0c;所以参考下dubbo的实现原理。 consumer 主要使用ThreadlessExecutor实现全consumer的全双工通讯。consumer创建本次请求的requestId用于将response和request匹配。 然后分以下几步完成一次请求发送并接收结果&…

GlusterFS + 防火墙访问控制+提供NFS服务

一、安装GlusterFS centos: yum -y install centos-release-gluster yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma systemctl start glusterd.service #开启服务 systemctl enable glusterd.service #开机自启 systemctl sta…

Elasticsearch分词器--空格分词器(whitespace analyzer)

介绍 文本分析&#xff0c;是将全文本转换为一系列单词的过程&#xff0c;也叫分词。analysis是通过analyzer(分词器)来实现的&#xff0c;可以使用Elasticearch内置的分词器&#xff0c;也可以自己去定制一些分词器。除了在数据写入时将词条进行转换&#xff0c;那么在查询的时…

Spring 多数据源搭建

目录 前言 正文 1.Druid 介绍和使用 2.其他多数据源解决方案 总结 前言 对于复杂的业务和项目&#xff0c;可能在一个单体项目中存在需要连接多个数据库的情况。这时&#xff0c;就会使用到多数据源&#xff0c;实际中遇到的可能性比较大。 正文 如果一个项目中需要连…

@2023 中国家居家具行业数字化转型分析与案例解读|商派徐礼昭

作者&#xff1a;徐礼昭&#xff08;商派市场负责人&#xff0c;重构零售实验室负责人&#xff09; 中国的家居家具行业面临着市场竞争激烈、消费者需求多变等诸多挑战。为了应对这些挑战&#xff0c;许多品牌企业开始探索数字化转型的道路&#xff0c;以提升竞争力并满足消费…

机器学习笔记 - 如何在Python中对网格和点云进行体素化?

一、简述 本文主要是为了了解如何生成体素表示,体素之于3D就像像素之于2D。体素本质上是 3D 像素,但它们不是正方形,而是完美的立方体。 理论上,体素是复制现实的完美建模技术。 这里我们要了解四个广泛流行的 Python 库(Open3D、Trimesh、PyVista、pyntcloud )生成点云…

java游戏攻略资讯网站的设计与实现springboot+vue

游戏攻略网站分为管理员与用户两种角色。 管理员的功能包括登录&#xff0c;用户管理&#xff0c;游戏分类管理&#xff0c;游戏攻略管理&#xff0c;游戏资讯管理等。 登录功能&#xff1a;管理员需要登录进入系统后台。 用户管理&#xff1a;实现用户信息的查询&#xff0c;修…

Python 发送企业微信消息

下方代码实现功能 1、联接Sqlserver数据库&#xff0c;取出发送消息清单 2、根据appid,secret获取企业微信token 3、根据消息清单类型决定发送客户消息还是内部员工消息 4、更新发送消标记 5、创建发送定时任务 from datetime import datetime import time import threading fr…

掌握未来设计趋势,开启AutoCAD2020创新之旅!

随着科技的不断发展&#xff0c;设计行业也在迅速演进&#xff0c;为满足设计师们日益增长的需求&#xff0c;Autodesk AutoCAD2020应运而生。作为一款全球领先的设计软件&#xff0c;AutoCAD2020不仅拥有更加强大的功能和更高效的性能&#xff0c;还融入了一系列的智能化设计工…

nrm安装以及常用命令

做为开发者&#xff0c;我们经常会使用到淘宝镜像去安装一些包。基本上设置的都是cnpm这种。但是这一长串其实很难记住。这时&#xff0c;我们可以用nrm进行镜像的切换更为方便。 npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装方法 npm install nrm …

python实现多线程并发测试并生成excel报告

目录 一、技术背景 二、技术实现 1、设计思路步骤: 2、完成的代码如下:

vue给table组件添加合计

在 Vue 3 中&#xff0c;你可以使用 v-on:click 事件监听器来处理点击事件&#xff0c;并将数据添加到表格的第一行。假设你正在使用 Element UI 的表格组件&#xff0c;并且你想要在点击事件中添加一个合计行&#xff0c;你可以按照以下方式进行&#xff1a; <template>…

在java中如何读取数据库中的内容

1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月 20 22 25 28 30 33 35 34 32 28 24 21 -8 8 10 15 18 -22 -24 -24 -21 -16 -50 -20 package bbb;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;p…

Kotlin(十三) 延迟初始化和密封类

对变量延迟初始化 延迟初始化使用的是lateinit关键字&#xff0c;它可以告诉Kotlin编译器&#xff0c;我会在晚些时候对这个变量进行初始化&#xff0c;这样就不用在一开始的时候将它赋值为null了。示例如下&#xff1a; class MainActivity : AppCompatActivity() {private …