Java I/O (输入/输出)

1.流的概念

        流是一种有序的数据序列,根据操作类型,可以分为输入流和输出流两种。I/O流(输入输出)提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。

        1.1 输入流:

        程序从指向源的输入流中读取源中的数据,源可以是文件、网络、压缩包、其他数据。

        1.2 输出流:

        输出流的指向是数据要到达的目的地,程序通过向输出流中写入数据吧信息传递到目的地。输出流的目标可以是文件、网络、压缩包、控制台、其他数据输出目标。

2.输入/输出流

        Java中所有的输入/输出流分为【字节输入/输出流】和【字符输入/输出流

2.1 字节输入流:InputStream类

        InputStream类是字节输入流的抽象类,是所有字节输入流的父类,该类中所有方法遇到错误都会发生IOException异常。

2.1.1 read()方法:

        从输入流中读取数据的下一个字节,返回0~255范围内的int字节值,如果到达流末尾而没有可用字节,则返回-1;

2.1.2 read(byte[] b)方法:

        从输入流中读取一定长度的字节,并以整数的形式返回字节数;

2.1.3 mark(int readlimit)方法:

        在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数;

2.1.4 reset()方法:

        将输入指针返回到当前所做的标记处;

2.1.5 skip(long n)方法:

        跳过输入流上的n各字节,并返回实际跳过的字节数;

2.1.6 markSupported()方法:

        如果当前流支持mark()/reset()操作就返回true;

2.1.7 close()方法:

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

2.2 字节输入流:Reader类    

    

2.3 字节输出流:OutputStream类

        OutputStream类是字节输出流的抽象类,此抽象类是所有字节输出流类的父类(超类)。OutputStream类的所有方法都返回void,在遇到错误时都会引发IOException异常。

2.2.1 write(int b)方法:

        将指定的字节写入此输出流;

2.2.2 write(byte[] b)方法:

        将b个字节从指定的byte数组中写入到此输出流;

2.2.3 write(byte[] b, int off, int len)方法:

        将指定的byte数组b中从偏移量off开始的len个字节写入此输出流;

2.2.4 flush()方法:

        彻底完成输出并清空缓存区;

2.2.5 close()方法:

        关闭输出流,并释放与该流有关联的所有系统资源;

2.4 字符输出流:Writer类

3.File类

        File类是java.io包中唯一代表磁盘文件本身的对象。可以同File类中的方法来实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如文件所在的目录,文件的长度,文件的读写权限等。

3.1 文件的创建与删除

使用File类创建文件对象有3种方法:

3.1.1 File(String pathname)

        此构造方法通过将指定的路径名字符串转换为抽象路径名,来创建一个新的File实例。

语法:

File file = new File(String pathname);

pathname为指定路径名称(包含文件名),如:File file = new File("/chuntian/word.txt")

3.1.2 File(String parent, String child)

        此构造方法根据定义父路径和子路径字符串(含文件名)创建一个新的File对象。

语法:

File file = new File(String parent, String child);

parent:父路径字符串,如“D:/doc”;

child:子路径字符串,如“word.txt”

3.1.3 File(File f, String child)

语法:

File file = new File(File f, String child);

f:父路径对象,如“D:/doc/”;

child:子路径字符串,如“word.txt”;

        通过File类创建一个文件对象后,如File file = new File("word.txt"),如果当前目录中不存在名为word.txt的文件,File类会通过调用createNewFile()方法创建一个名称为word.txt的文件;如果存在word.txt文件,可以通过调用文件对象的delete()方法删除这个文件。

package io;import java.io.File;
import java.io.IOException;public class FileTest {public static void main(String[] args) {File file = new File("./word.txt");   //创建文件对象fileif (file.exists()) {file.delete();      //如果文件存在就删除文件System.out.println("文件已删除~");} else {try {file.createNewFile();       //如果文件不存在,创建文件System.out.println("文件已创建!");} catch (IOException e) {e.printStackTrace();}}}
}输出:文件已创建!

3.2 获取文件信息

File类提供了很多方法来获取文件本身的信息,如:

File类的常用方法
方法返回值说明
getName()String获取文件的名称
canRead()boolean判断文件是否可读
canWrite()boolean判断文件是否可写
exist()boolean判断文件是否存在
length()long获取文件的长度(以字节byte为单位)
getAbsolutePath()String获取文件的绝对经
getParent()String获取文件的父路径
isFIle()boolean判断文件是否为文件
isDirectory()boolean判断文件是否为一个目录
isHidden()boolean判断文件是否为隐藏文件
LastModified()long获取文件最后修改时间
package io;import java.io.File;
import java.io.IOException;public class FileTest {public static void main(String[] args) {File file = new File("word.txt");   //创建文件对象fileif (file.exists()) {System.out.println("文件名称是:" + file.getName());System.out.println("文件长度是:" + file.length());System.out.println("该文件是隐藏文件吗?" + file.isHidden());System.out.println("文件的绝对路径是:" + file.getAbsolutePath());} else {System.out.println("该文件不存在");}}
}输出:文件名称是:word.txt文件长度是:8该文件是隐藏文件吗?false文件的绝对路径是:/Users/jeanet/IdeaProjects/MyProject/word.txt

4.文件输入/输出流

4.1 字节的输入/输出:FileInputStream类和FileOutputStream类

        FileInputStream类是inputStream类的子类;

        构造方法:

        4.1.1 FileInputStream(String name)

                使用给定的文件名创建一个FileInputStream对象;

        4.1.2 FileOutputStream(File file)

                使用File对象创建FileInputStream对象;

        FileOutputStream类是outputStream类的子类。

        FileOutputStream与FileInputStream的构造方法类似,创建FileOutputStream对象时可以指定一个不存在的文件名,但此文件不能是一个已被其他程序打开的文件。

package io;import java.io.*;public class FileTest {public static void main(String[] args) {File file = new File("word.txt");   //创建文件对象filetry {FileOutputStream fos = new FileOutputStream(file);  //创建一个FileOutputStream对象String mystr = "希望在田野上,我爱春田~";byte[] mybyte = mystr.getBytes();  //创建byte型数组fos.write(mybyte);      //将byte数组中的信息写入文件中fos.close();            //关闭流} catch (Exception e) {e.printStackTrace();    //输出异常信息}try {FileInputStream fis = new FileInputStream(file);    //创建FileInputStream对象byte[] mybyte = new byte[1024];     //创建byte数组int len = fis.read(mybyte);         //读取文件信息String fileinfo = new String(mybyte, 0, len);System.out.println("文件中的信息是:" + fileinfo);fis.close();} catch (Exception e) {e.printStackTrace();}}
}输出:文件中的信息是:希望在田野上,我爱春田~

4.2 字符的输入/输出:FileReader类和FileWriter类

        4.2.1 FileReader

                FileReader流顺序地读取文件,只要不关闭流,每次调用read()方法就能顺序地读取源文件中的字符内容,直到源的末尾或流被关闭。

        4.2.2 FileWriter

package io;import java.io.*;public class FileTest {public static void main(String[] args) {File file = new File("word.txt");   //创建文件对象filetry {FileWriter fw = new FileWriter(file);   //创建FileWriter字符对象fw.write("春天在哪里呀?");fw.close();} catch (Exception e) {e.printStackTrace();    //输出异常信息}try {FileReader fr = new FileReader(file);   //创建FileReader对象char[] mychar = new char[1024];     //创建char型数组int len = fr.read(mychar);      //将字节读入数组String mystr = new String(mychar, 0, len);    //设置文本域的显示信息System.out.println("文件内容是:" + mystr);} catch (Exception e) {e.printStackTrace();}}
}输出:文件内容是:春天在哪里呀?

5.带缓存的输入/输出流

        缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区,有了缓存区,在流上执行skip()、mark()、reset()方法就成为了可能。

5.1 字节的缓存输入/输出:BufferedInputStream类和BufferedOutputStream类

        BufferedInputStream类和BufferedOutputStream类可以对所有的InputStream类和OutputStream类进行带缓存区的包装以达到性能优化;

        构造方法:

        5.1.1 BufferedInputStream(InputStream in)      

        创建了一个带32个字节的缓存流;

        5.1.2 BufferedInputStream(InputStream in, int size)

        按指定大小来创建缓存区。

        5.1.3 BufferedOutputStream(OutputStream out)

        创建了一个带32个字节的缓存流;

        5.1.4 BufferedOutputStream(OutputStream out, int size)

        按指定大小来创建缓存区。

        flush()方法只对使用缓存区的OutputStream类的子类有效,用于在缓存区没满的情况下,也将缓存区的内容强制写入到外设,当调用close()方法时,系统在关闭流之前,也会将缓存区中的信息刷新到磁盘文件中。

5.2 字符的缓存输入/输出:BufferedReader类和BufferedWriter类

        BufferedReader类继承了Reader类,BufferedWriter类继承了Writer类,这两个类同样具有缓存机制,可以以行为单位进行输入/输出。

        5.2.1 BufferedReader类常用方法

                5.2.1.1 read()方法:

                读取单个字符;

                5.2.1.2 readLine()方法:

                读取一个文本行,并将其返回为字符串。若无数据可读,返回null;

        5.2.2 BufferedWriter类常用方法

                5.2.2.1 write(String s, int off, int len)方法:

                写入字符串的某一部分;

                5.2.2.2 flush()方法:

                刷新该流的缓存;

                5.2.2.3 newLine()方法:

                写入一个行分隔符;

        在使用BufferedWriter类的write()方法时,数据并没有立即写入输出流,而是首先进入缓存区中,如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。

package io;import java.io.*;public class Student {public static void main(String[] args) {String[] content = {"好久不见", "最近好吗?", "常联系~"};File file = new File("word.txt");try {FileWriter fw = new FileWriter(file);       //创建FileWriter对象BufferedWriter bw = new BufferedWriter(fw); //创建BufferedWriter对象for (int i = 0; i < content.length; i++) {bw.write(content[i]);   //将字符串数组中的元素写入到磁盘文件bw.newLine();}bw.close();fw.close();} catch (Exception e) {e.printStackTrace();}try {FileReader fr = new FileReader(file);   //创建FileReader对象BufferedReader br = new BufferedReader(fr); //创建BufferedReader对象int i = 0;String s = null;while ((s = br.readLine()) != null) {i++;System.out.println("第" + i + "行的内容是:" + s);}br.close();fr.close();} catch (Exception e) {e.printStackTrace();}}
}输出:第1行的内容是:好久不见第2行的内容是:最近好吗?第3行的内容是:常联系~

6.数据输入/输出流

6.1 DataInputStream

6.2 DataOutputStream

7.ZIP压缩输入/输出流

7.1 压缩文件:ZipOutputStream(OutputStream out)

7.2 解压缩文件:ZipInputStream(InputStream in)

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

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

相关文章

51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)

51单片机汽车胎压大气气压测量仪仿真设计_数码管显示 (代码仿真设计报告讲解) 仿真原版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0018 目录 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示功…

技术分享| anyRTC低延时直播优化

直播系统就是把活动现场的音频或视频信号经数字压缩后&#xff0c;传送到直播多媒体服务器(CDN)上&#xff0c;在互联网上供广大网友或授权特定人群收听或收看。而随着技术的日益更新&#xff0c;人民对于直播的互动性&#xff0c;实时性要求更高了&#xff0c;传统的直播少则几…

React-表单受控绑定和获取Dom元素

一、表单受控组件 1.声明一个react状态 说明&#xff1a;useState const [value,setValue]useState("") 2.核心绑定流程 2.1绑定react状态 <div><input value{value}type"text"></input> 2.2绑定onChange事件 说明&#xff1a;e.…

队列(Queue)概念+通过单、双链表来模拟队列+环形队列+OJ面试题(用队列实现栈、用栈实现队列、设计环形队列)

文章目录 队列(Queue)一、 概念1.尾进头出 二、模拟队列1.单链表实现队列1.1 设置结点1.2 入队offer1.3出队 poll1.4 empty方法&#xff0c;peek方法&#xff0c;getUsedSize方法 2.双链表实现队列2.1 创建结点2.2 入队列2.3 出队列2.4 peek、size、isEmpty方法 三、环形队列1.…

vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代

当前&#xff0c;以大模型为代表的人工智能技术已发展为新一轮科技革命和产业变革的重要驱动力量&#xff0c;被视作推动经济社会发展的关键增长极。 AI大模型潮起&#xff0c;千行百业走向百舸争流的AI创新应用期&#xff0c;前沿信息技术向手机、PC、车机等消费级终端加速渗…

AJAX原理及介绍

文章目录 AJAX&#xff08;Asynchronous Javascript And Xml&#xff09;传统请求及缺点AJAX概述XMLHttpRequest对象AJAX GET请求AJAX GET请求的缓存问题AJAX POST请求基于JSON的数据交换基于XML的数据交换AJAX乱码问题AJAX的异步与同步AJAX代码封装AJAX实现省市联动AJAX跨域问…

[Unity][VR]透视开发系列3-Passthrough应用的真机测试方法

【视频讲解】 视频讲解地址请关注我的B站。 专栏后期会有一些不公开的高阶实战内容或是更细节的指导内容。 B站地址: https://www.bilibili.com/video/BV1Zg4y1w7fZ/ 我还有一些免费和收费课程在网易云课堂(大徐VR课堂): https://study.163.com/provider/480000002282025/…

nodejs+vue食力派网上订餐系统-计算机毕业设计

采用当前流行的B/S模式以及3层架构的设计思想通过 技术来开发此系统的目的是建立一个配合网络环境的食力派网上订餐系统&#xff0c;这样可以有效地解决食力派网上订餐管理信息混乱的局面。 本设计旨在提高顾客就餐效率、优化餐厅管理、提高订单准确性和客户的满意度。本系统采…

Android问题笔记四十三:JNI 开发如何快速定位崩溃问题

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

vue3 Teleport组件

<Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层 的位置去。 <template><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible&…

python爬虫selenium和ddddocr使用

python爬虫selenium和ddddocr使用 selenium使用 selenium实际上是web自动化测试工具&#xff0c;能够通过代码完全模拟人使用浏览器自动访问目标站点并操作来进行web测试。 通过pythonselenium结合来实现爬虫十分巧妙。 由于是模拟人的点击来操作&#xff0c;所以实际上被反…

Gitee 发行版

Gitee 发行版 1、Gitee 发行版管理2、项目仓库中创建发行版本3、项目中导入3.1 gradle配置3.2 dependencies执行正常&#xff0c;包没有下载 1、Gitee 发行版管理 Gitee 发行版&#xff08;Release&#xff09;管理 2、项目仓库中创建发行版本 按照Gitee官网操作就行 3、项目…

NUUO摄像头远程命令执行漏洞复现 [附POC]

文章目录 NUUO 摄像头远程命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 NUUO 摄像头远程命令执行漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff…

Linux 命令|服务器相关

1. 在公共 linux 上创建 python 虚拟环境 【精选】在公共Linux服务器上创建自己的python虚拟环境_服务器创建自己的环境-CSDN博客 2. 查看现存的状态&#xff0c;看有没有程序在跑 nvidia-smi命令详解-CSDN博客 3. 上传本地文件到服务器 在本地 Mac 计算机的终端中&#x…

3D RPG Course | Core 学习日记一:初识URP

前言 最近开始学习Unity中文课堂M_Studio&#xff08;麦大&#xff09;的3D RPG Course&#xff0c;学习一下3D RPG游戏核心功能的实现&#xff0c;第一课我们学习到的是地图场景的编辑&#xff0c;其中涉及到了URP渲染。 我们首先进入Unity资源商店把地图素材和人物素材导入好…

简单明了!网关Gateway路由配置filters实现路径重写及对应正则表达式的解析

问题背景&#xff1a; 前端需要发送一个这样的请求&#xff0c;但出现404 首先解析请求的变化&#xff1a; http://www.51xuecheng.cn/api/checkcode/pic 1.请求先打在nginx&#xff0c;www.51xuecheng.cn/api/checkcode/pic部分匹配到了之后会转发给网关进行处理变成localho…

云安全-云原生技术架构(Docker逃逸技术-特权与危险挂载)

0x00 云原生技术-docker docker容器和虚拟机的对比&#xff1a;前者是将运行环境打包&#xff0c;封装一个环境。后者是将整个系统打包&#xff0c;封装一个系统。在操作使用上来说各有利弊。 0x01 docker容器的三种逃逸类型 特权模式启动&#xff08;不安全的启动方式&…

Android---StartActivity启动过程

在手机桌面应用中点击某一个 icon 之后&#xff0c;最终是通过 startActivity 去打开某一个 Activity 页面。我们知道&#xff0c;Android 中的一个 APP 就相当于一个进程。所以&#xff0c;startActivity 操作中还需要判断&#xff0c;目标 Activity 的进程是否已经创建。如果…

美食论坛大全订阅交流系统 uniapp+vue 微信小程序设计与实现

美食大全订阅小程序在系统的智能手机上可以运行&#xff0c;主要实现了首页、个人中心、用户管理、菜系管理、口味管理、美食分类管理、美食信息管理、美食论坛、系统管理等主要功能模块的操作和管理。 后端&#xff1a;java(springbootssm)/python/php/nodejs/ 开发运行&…

C++ stack queue 的模拟实现

1.为什么选择 deque 作为 stack 和 queue 的默认容器呢&#xff1f; stack 是一种后进先出的特殊线性数据结构&#xff0c;因此只要具有 push_back() 和 pop_back() 操作的线性结构&#xff0c;都可 以作为 stack 的底层容器&#xff0c;比如 vector 和 list 都可以&#xff1b…