java io流 学习笔记

1. IO 流能干什么

通过IO我们能对硬盘文件进行读和写。(网络数据的传输也涉及到io)。

2. IO流的分类


按照 流的方向 进行分类:分为输入、输出流。

往内存中去:叫做输入(Input)。或者叫做读(Read)
从内存中出来:叫做输出(Output)。或者叫做写(Write)


按照 读取数据方式 不同进行分类:
按照 字节 的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。
这种流是万能的什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频文件 等…

按照 字符 的方式读取数据的,一次读取一个字符.
这种流是为了方便读取 普通文本文件 而存在的,这种流不能读取:图片、声音、视频等文件。只能读取 纯文本文件,连word文件都无法读取。

注意:
纯文本文件,不单单是.txt文件,还包括 .java、.ini、.py 。总之只要 能用记事本打开 的文件都是普通文本文件。

3.IO流的顶层父类

    - 字节输入流:顶层父类:InputStream --> 抽象类   常见子类:FileInputStream
    - 字节输出流:顶层父类:OutputStream --> 抽象类   常见子类:FileOutputStream
    - 字符输入流:顶层父类:Reader --> 抽象类   常见子类:FileReader
    - 字符输出流:顶层父类:Writer --> 抽象类   常见子类:FileWriter

4.Java要掌握的流(16个)

1.文件专属:

  • java.io.FileInputStream(掌握)
  • java.io.FileOutputStream(掌握)
  • java.io.FileReader
  • java.io.FileWriter

2.转换流:(将字节流转换成字符流)

  • java.io.InputStreamReader
  • java.io.OutputStreamWriter

3.缓冲流专属:

  • java.io.BufferedReader
  • java.io.BufferedWriter
  • java.io.BufferedInputStream
  • java.io.BufferedOutputStream

4.数据流专属:

  • java.io.DataInputStream
  • java.io.DataOutputStream

5.标准输出流:

  • java.io.PrintWriter
  • java.io.PrintStream(掌握)

6.对象专属流:

  • java.io.ObjectInputStream(掌握)
  • java.io.ObjectOutputStream(掌握)

7.File文件类

  • java.io.File

5.输入流

PS: 下面很多try,catch 捕获异常,都不是我写的,当然第一次写的话,可以自己敲一下,但是alt + z 直接快捷生成。

另外,就是那几个常用的方法(我自己觉得),其实会写前几个,其实剩余都比较好记住。

我的conf.txt文件和src在同一个目录。

FileInputStream

public class IODemo1 {public static void main(String[] args)  {File file = new File("conf.txt");FileInputStream inputStream = null;try {inputStream = new FileInputStream(file);byte[] bytes = new byte[3]; // 做缓存用的,一次最多4个字节int redCount = 0;// inputStream去读取,而每次读取到的字节文件存放到bytes中。while ((redCount = inputStream.read(bytes)) != -1){ // read读取值是字节数量,读取不到返回-1System.out.println("转换后的字符:"+new String(bytes, "UTF-8"));System.out.println("读取字节数量:"+redCount);System.out.println("----------------");}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {// 失败与否都要关闭ioif(inputStream != null){ // 判断文件是否为nulltry{inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
}

InputStreamReader

就是有这么一种写法。

将字节输入流转换字符输入流。

public class IODemo {public static void main(String[] args)  {File file = new File("conf.txt");FileInputStream inputStream = null;InputStreamReader inputStreamReader = null;try {inputStream = new FileInputStream(file);inputStreamReader = new InputStreamReader(inputStream,"UTF-8"); // 转换为为字符输入流byte[] bytes = new byte[3]; // 做缓存用的,一次最多4个字节char[] chars = new char[1];int redCount = 0;// inputStream去读取,每次读取到字节存放到bytes中。//while ((redCount = inputStream.read(bytes)) != -1){ // read读取值是字节数量,读取不到返回-1//    System.out.println("转换后的字符:"+new String(bytes, "GBK"));//    System.out.println("读取字节数量:"+redCount);//}System.out.println("---------------");// 对一个文件不能同时开2个输入流while ((redCount = inputStreamReader.read(chars)) != -1){System.out.println("读取字符数量:"+redCount);for (char aChar : chars) { // 遍历缓冲字符数组System.out.println(aChar);}System.out.println("将字符数组转换成字符串:"+ new String(chars));System.out.println("---------------");}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {// 失败与否都要关闭ioif(inputStreamReader != null){try{ // 流的关闭要区分顺序,先关闭外层也就是包装那一层inputStreamReader.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
}

FileReader

文件字符读取的形式

public class FileReaderDemo {public static void main(String[] args) {File file = new File("conf.txt");FileReader fileReader = null;try {char[] chars = new char[4];int readCount = 0;fileReader = new FileReader(file);while ((readCount = fileReader.read(chars)) != -1){System.out.println(new String(chars));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(fileReader != null){try {fileReader.close();} catch (IOException e) {e.printStackTrace();}}}}
}

BufferedReader

自带缓存的字符输入流。构造参数是一个字符输入流。

public class BufferReaderDemo {public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("conf.txt");// 当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流。// 外部负责包装的这个流,叫做:包装流,还有一个名字叫做:处理流。// 像当前这个程序来说:FileReader就是一个节点流。BufferedReader就是包装流/处理流。BufferedReader bufferedReader = new BufferedReader(fileReader);String str = null;while ((str = bufferedReader.readLine()) != null){ // readLine()方法读取一个文本行,但不带换行符。System.out.println(str);}bufferedReader.close(); // 关闭最外层即可}
}

ObjectInputStream

反序列化对象

        // 反序列化ObjectInputStream oin = new ObjectInputStream(new FileInputStream("conf1.txt"));Object o = oin.readObject();System.out.println(o);

6.输出流

FileOutputStream


public class IoDemo2 {public static void main(String[] args) {File file = new File("conf.txt");FileOutputStream outputStream = null;try {outputStream = new FileOutputStream(file,true); // 开启文件追加模式String wls = "万乐姝";byte[] bytes = wls.getBytes(StandardCharsets.UTF_8); // 将string转换为字节文件outputStream.write(bytes); // 写入} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(outputStream != null){try {outputStream.flush(); // 先刷新在关闭,否则可能有bugoutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
}

OutputStreamWriter

public class IoDemo2 {public static void main(String[] args) {File file = new File("conf.txt");FileOutputStream outputStream = null;OutputStreamWriter outputStreamWriter = null;try {outputStream = new FileOutputStream(file,true); // 开启文件追加模式outputStreamWriter = new OutputStreamWriter(outputStream);outputStreamWriter.write("万乐姝");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(outputStream != null){try {outputStreamWriter.flush(); // 先关闭外层流outputStreamWriter.close();outputStream.flush();outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
}

FileWriter

public class FileWriterDemo {public static void main(String[] args) {File file = new File("conf.txt");FileWriter fileWriter = null;try {fileWriter = new FileWriter(file,true); // 开启文件追加模式fileWriter.write("卧槽");} catch (IOException e) {e.printStackTrace();}finally {try {fileWriter.flush();fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}
}

BufferedWriter

public class BufferWriterDemo {public static void main(String[] args) throws IOException {FileWriter fileWriter = new FileWriter("conf.txt",true);BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);bufferedWriter.write("qhxxxx");bufferedWriter.close();}
}

PrintStream

 我们平时用的控制台打印语句就是PrintStream对象

改变流的输出方向

System.setOut(PrintStream对象)

 PrintStream printStream = new PrintStream(new FileOutputStream("conf.txt"));printStream.println("\n121212"); // 输出到conf.txtSystem.setOut(printStream); // 改变流的输出方向System.out.println("\n完了数"); // 输出到conf.txt了System.out.println("121212");

ObjectOutputStream

对新手感觉用处不大

要被序列化的对象必须实现  Serializable 接口

       // 序列化ObjectOutputStream objectOutputStream = new ObjectOutputStream(new             FileOutputStream("conf1.txt"));objectOutputStream.writeObject(new User("qhx","1232323"));objectOutputStream.flush();objectOutputStream.close();

7.配置properties文件的读取和设置

  • getProperty ( String key): 用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。
  • load ( InputStream inStream): 从输入流中读取属性列表(键和元素对)。通过对指定的文件(比如说上面的 test.properties 文件)进行装载来获取该文件中的所有键 - 值对。以供 getProperty ( String key) 来搜索。
  • setProperty ( String key, String value) : 调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键 - 值对。
  • store ( OutputStream out, String comments): 以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。与 load 方法相反,该方法将键 - 值对写入到指定的文件中去。
  • clear (): 清除所有装载的 键 - 值对。该方法在基类中提供。
     

配置文件读取

  private static String getKey(String key) {Properties properties = new Properties();File file = new File(FILE_NAME);FileInputStream inputStream = null;try {inputStream = new FileInputStream(file); // 配置文件properties.load(inputStream); // 将配置文件对应的key,value映射到properties的map中。} catch (IOException e) {e.printStackTrace();}finally {if(inputStream != null){  // 还是这样关比较好,万一报错就tm关不了try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}System.out.println(properties.getProperty(key));}

配置文件设置

    /*** 配置文件设置** @param key* @param value* @return*/public static boolean setPropertiesKey(String key,String value) {// 判断key是否有重复String key1 = getKey(key);if(key1 == null){return setKey(key,value); }return false;}/***  配置文件设置** @param key* @param value* @return boolean*/private static boolean setKey(String key, String value) {Properties properties = new Properties();File file = new File(FILE_NAME); // 其实有其他配置可以同意下yaml文件里面配置,然后这里面读取,好统一调配。FileWriter fileWriter = null;try {fileWriter = new FileWriter(file,true);properties.setProperty(key, value); // 存进map里面properties.store(fileWriter,""); // 将map对应的键值对写进输出流。这个comments 最后写入的时候是个注释} catch (IOException e) {// 卧槽我加入设置key,value失败,肯定调到这个逻辑return false;} finally {if (fileWriter != null) {  // 还是这样关比较好,万一报错就tm关不了try {fileWriter.flush();fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}return true;}}

8.File 

在java中file对象表示文件、目录的抽象表示形式。

 案例:递归实现遍历文件目录

public class FileDemo {public static void main(String[] args) {getChildrenFile("src",1);}// 递归则子文件所有目录public static void getChildrenFile(String fileName,int y){ // fileName 文件路径名,y 是目录等级File file = new File(fileName);StringBuffer stb = new StringBuffer();// 根据目录等级追加几条 "-"for (int i = 0; i < y; i++) {stb.append("-");}// 遍历子文件for (String name: file.list()) {System.out.println(stb + name); // 目录等级 + 文件路径名,并且换行String childrenName = fileName + "/"+name;if(new File(childrenName).isDirectory()){ // 判断子文件是否是递归,是的话仍执行getChildrenFile(childrenName,y+1); // 同样下一级目录等级 + 1}}}}

参考资料

Java IO流 详解(字节流、字符流、输入流、输出流、刷新)_输入流 输出流 更新流_肥兄的博客-CSDN博客

 Java IO流(超详细!)_一个快乐的野指针~的博客-CSDN博客

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

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

相关文章

EVE-NG MPLS LDP LSP

目录 1 拓扑 2 配置步骤 2.1 配置接口IP 2.2 配置OSPF 2.3 使能LDP 2.3 在VPC上验证 1 拓扑 2 配置步骤 2.1 配置接口IP LER1 interface LoopBack 0ip address 1.1.1.9 32 quitinterface GigabitEthernet1/0ip address 10.1.1.1 255.255.255.0quitinterface GigabitEth…

基于Java+SpringBoot+SpringCloud+Vue的智慧养老平台设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

VSCode配置SSH远程免密登录服务器

VScode远程开发时&#xff0c;每次都需要输入密码&#xff0c;其实同理可以和其他应用类似配置免密登录&#xff0c;流程也类似。 1.在本地主机生成公钥和秘钥 ssh-keygen 2.将公钥内容添加至服务器 将生成钥对时会给出其保存路径&#xff0c;找到公钥&#xff0c;复制内容&am…

CSS中所有选择器详解

文章目录 一、基础选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 二、复合选择器1.交集选择器2.并集选择器 三、属性选择器1.[属性]2.[属性属性值]3.[属性^属性值]4.[属性$属性值]5.[属性*属性值] 四、关系选择器1.父亲>儿子2.祖先 后代3.兄弟4.兄~弟 五、伪类选择…

【EI/SCOPUS征稿】2023年算法、图像处理与机器视觉国际学术会议(AIPMV2023)

2023年算法、图像处理与机器视觉国际学术会议&#xff08;AIPMV2023&#xff09; 2023 International Conference on Algorithm, Image Processing and Machine Vision&#xff08;AIPMV2023&#xff09; 2023年算法、图像处理与机器视觉国际学术会议&#xff08;AIPMV2023&am…

Flink - sink算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. Kafka_Sink 2. Kafka_Sink - 自定义序列化器 3. Redis_Sink_String 4. Redis_Sink_list 5. Redis_Sink_set 6. Redis_Sink_hash 7. 有界流数据写入到ES 8. 无界流数据写入到ES 9. 自定…

Python批量查字典和爬取双语例句

最近&#xff0c;有网友反映&#xff0c;我的批量查字典工具换到其它的网站就不好用了。对此&#xff0c;我想说的是&#xff0c;互联网包罗万象&#xff0c;网站的各种设置也有所不同&#xff0c;并不是所有的在线字典都可以用Python爬取的。事实上&#xff0c;很多网站为了防…

iphone备份用什么软件?好用的苹果数据备份工具推荐!

众所周知&#xff0c;如果要将iPhone的数据跟电脑进行传输备份的话&#xff0c;我们需要用到iTunes这个pc工具。但是对于iTunes&#xff0c;不少人都反映这个软件比较难用&#xff0c;用不习惯。于是&#xff0c;顺应时代命运的iPhone备份同步工具就出现了。那iphone备份用什么…

AirLink 101 Wireless N 150 PCI Adapter驱动和管理软件

从光盘里拷出来的&#xff0c;界面比较复古&#xff0c;实际功能聊胜于无 链接&#xff1a;https://pan.baidu.com/s/1clUcp7QsF8QMWdGoZkc_dQ?pwdmkra 提取码&#xff1a;mkra

抖音mcn的概念是什么?申请需要什么条件?

MCN&#xff0c;即多渠道网络&#xff0c;是一种服务于视频创作者的组织形式。抖音MCN则特指在抖音平台上运营的MCN。早在2015年&#xff0c;抖音作为字节跳动旗下的一款短视频应用出现&#xff0c;它通过凭借其“随便看看”的特性&#xff0c;收获了大量的用户和创作者。为了让…

进程与线程、线程创建、线程周期、多线程安全和线程池(ThreadPoolExecutor)

目录 进程与线程线程和进程的区别是什么&#xff1f;线程分两种&#xff1a;用户线程和守护线程线程创建四种方式run()和start()方法区别&#xff1a;为什么调用 start() 方法时会执行 run() 方法&#xff0c;为什么不能直接调用 run() 方法&#xff1f;Runnable接口和Callable…

27 使用Arrays.asList生成的集合无法使用add、addAll方法及解决方法。

27.1 原因 使用 Array.asList方法生成的ArrayList继承的是AbstractList抽象类 &#xff0c;如下图所示。 AbstractList又继承了AbstractCollection抽象类&#xff0c;实现了List接口的方法&#xff0c;如下图所示。 如下图所示。可以发现&#xff0c; AbstractionCollection实现…

05 - ArrayList还是LinkedList?使用不当性能差千倍

集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK 为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#xff0c;…

Qt Creator 11 开放源码集成开发环境新增集成终端和 GitHub Copilot 支持

导读Qt 项目今天发布了 Qt Creator 11&#xff0c;这是一款开源、免费、跨平台 IDE&#xff08;集成开发环境&#xff09;软件的最新稳定版本&#xff0c;适用于 GNU/Linux、macOS 和 Windows 平台。 Qt Creator 11 的亮点包括支持标签、多外壳、颜色和字体的集成终端模拟器&am…

MobPush iOS SDK iOS实时活动

开发工具&#xff1a;Xcode 功能需要: SwiftUI实现UI页面&#xff0c;iOS16.1以上系统使用 功能使用: 需应用为启动状态 功能说明 iOS16.1 系统支持实时活动功能&#xff0c;可以在锁定屏幕上实时获知各种事情的进展&#xff0c;MobPushSDK iOS 4.0.3版本已完成适配&#xf…

word转pdf两种方式(免费+收费)

一、免费方式 优点&#xff1a;1、免费&#xff1b;2、在众多免费中挑选出的转换效果相对较好&#xff0c;并且不用像openOffice那样安装服务 缺点&#xff1a;1、对字体支持没有很好&#xff0c;需要安装字体库或者使用宋体&#xff08;对宋体支持很好&#xff09;2、对于使…

剑指Offer05.替换空格

剑指Offer05.替换空格 目录 剑指Offer05.替换空格题目描述解法一&#xff1a;遍历添加解法二&#xff1a;原地修改 题目描述 请实现一个函数&#xff0c;把字符串s中的每个空格都替换成“%20”。 解法一&#xff1a;遍历添加 由于每次替换都要把一个空格字符变成三个字符&a…

04 Ubuntu中的中文输入法的安装

在Ubuntu22.04这种版本相对较高的系统中安装中文输入法&#xff0c;一般推荐使用fctix5&#xff0c;相比于其他的输入法&#xff0c;这款输入法的推荐词要好得多&#xff0c;而且不会像ibus一样莫名其妙地失灵。 首先感谢文章《滑动验证页面》&#xff0c;我是根据这篇文章的教…

uniapp自定义头部导航栏

有时我们需要一些特殊的头部导航栏页面&#xff0c;取消传统的导航栏&#xff0c;来增加页面的美观度。 下面我就教大家如何配置&#xff1a; 一、效果图 二、实现 首先在uniapp中打开pages.json配置文件&#xff0c;在单个路由配置style里面设置导航栏样式​​​​​​nav…

2023数字生态大会召开,长虹佳华再获3项大奖

近日&#xff0c;2023数字生态大会在北京隆重召开。长虹佳华勇夺“2023数字生态云计算服务卓越企业”、“2023数字生态元宇宙十强”和“数字生态增值分销商十强”三项大奖&#xff1b;还同时入选 “智慧教育十佳案例” 和 “智能制造十佳案例”。 长虹佳华是国企控股的香港上市…