Java SE入门及基础(44)

目录

I / O流(上)

1. 什么是I / O流

过程分析

I / O的来源

Java 中的 I / O流

2. 字节流

OutputStream 常用方法

文件输出流 FileOutputStream 构造方法

示例

InputStream 常用方法

文件输入流 FileInputStream 构造方法

示例

综合练习

字节流应用场景

Java SE文章参考:Java SE入门及基础知识合集-CSDN博客


I / O流(上)

1. 什么是I / O

        在使用计算机时,你可能遇到过如下场景:
                当你在编写一个文档时,突然断电了或者计算机蓝屏了,而文档又没有保存。当你重启计算机后,发现文档中修改的那部分内容丢失了,但保存过的内容依然还在。这是为什么呢?因为我们编写文档的时候,编写的内容是存储在计算机的内存中,这些内容属于临时数据,当我们保存文档后,这些临时数据就写进了磁盘,得以保存。
过程分析
        编写文档内容存储在内存,换言之,就是向内存写数据
        保存文档内容至磁盘,换言之,就是将内存中的数据取出来存储到磁盘
I / O的来源
        I / O是 Input Ouput 两个单词的首字母,表示输入输出。其参照物就是内存,写入内存,就是输入,从内存读取数据出来,就是输出。
Java 中的 I / O
        磁盘和内存是两个不同的设备,它们之间要实现数据的交互,就必须要建立一条通道,在Java 中实现建立这样的通道的是I / O 流。 Java 中的 I / O 流是按照数据类型来划分的。分别是字节流(缓冲流、二进制数据流和对象流)、字符流

2. 字节流

字节流      来自官方的说明
Programs use byte streams to perform input and output of 8-bit bytes. All byte stream classes are descended from InputStream and OutputStream.
程序使用字节流执行 8 位字节的输入和输出。 所有字节流类均来自 InputStream OutputStream
OutputStream 常用方法
public abstract void write ( int b ) throws IOException ;; // 写一个字节
public void write ( byte b []) throws IOException ; // 将给定的字节数组内容全部写入文件中
// 将给定的字节数组中指定的偏移量和长度之间的内容写入文件中
public void write ( byte b [], int off , int len ) throws IOException ;
public void flush () throws IOException ; // 强制将通道中数据全部写出
public void close () throws IOException ; // 关闭通道
文件输出流 FileOutputStream 构造方法
public FileOutputStream ( String name ) throws FileNotFoundException ; // 根据提供的文件路径构建一条文件输出通道
// 根据提供的文件路径构建一条文件输出通道,并根据 append 的值决定是将内容追加到末尾还是直接覆盖
public FileOutputStream ( String name , boolean append ) throws FileNotFoundException ;
public FileOutputStream ( File file ) throws FileNotFoundException ; // 根据提供的文件信息构建一条文件输出通道
// 根据提供的文件信息构建一条文件输出通道,并根据 append 的值决定是将内容追加到末尾还是直接覆盖
public FileOutputStream ( File file , boolean append ) throws FileNotFoundException ;

示例
使用文件输出流将 " 文件输入输出流 " 写入磁盘文件中
package com .we . io ;
import java . io . * ;
/**
* 使用文件输出流将 " 文件输入输出流 " 写入磁盘文件中
*/
public class Example1 {
/**
* 增强 for 循环语法:
* for( 数据类型 变量名 : 遍历的数组 ){
*
* }
* @param args
*/
        public static void main ( String [] args ) {
        //将内容写入文件时,需要保证这个文件的父级目录一定存在,否则将报文件未找到异常
                try {
                        File dir = new File ( "F:\\aa" );
                        if ( ! dir . exists ()) dir . mkdirs ();
                                File file = new File ( dir , "io.txt" );
                                //构建磁盘文件与内存之间的通道
                                OutputStream os = new FileOutputStream ( file , true );
                                String text = "文件输入输出流 " ;
                                byte [] bytes = text . getBytes ();
                                // for(byte b: bytes){
                                        // os.write(b);//一次向通道中写一个字节至文件中
                                // }
                                // os.write(bytes);//向通道中一次将所有字节数组中的内容全部发送过去
                                //使用偏移量和长度的时候需要考虑数组下标越界
                                os . write ( bytes , 3 , bytes . length - 3 );
                                //在通道关闭之前使用,强制将通道中的数据写入文件中
                                os . flush ();
                                os . close (); // 关闭通道
                } catch ( FileNotFoundException e ) {
                        e . printStackTrace ();
                } catch ( IOException e ) {
                        e . printStackTrace ();
                }
        }
}
InputStream 常用方法
public abstract int read () throws IOException ; // 读取一个字节
public int read ( byte b []) throws IOException ; // 读取多个字节存储至给定的字节数组中
// 读取多个字节按照给定的偏移量及长度存储在给定的字节数组中
public int read ( byte b [], int off , int len ) throws IOException ;
public void close () throws IOException ; // 关闭流,也就是关闭磁盘和内存之间的通道
public int available () throws IOException ; // 获取通道中数据的长度
文件输入流 FileInputStream 构造方法
public FileInputStream ( String name ) throws FileNotFoundException ; // 根据提供的文件路径构建一条文件输入通道
public FileInputStream ( File file ) throws FileNotFoundException ; // 根据提供的文件信息构建一条文件输入通道

示例
        使用文件输入流将文件信息从磁盘中读取到内存中来,并在控制台输出。
package com .we . io ;
import java . io . FileInputStream ;
import java . io . FileNotFoundException ;
import java . io . IOException ;
import java . io . InputStream ;
/**
* 使用文件输入流将文件信息从磁盘中读取到内存中来,并在控制台输出。
*/
public class Example2 {
        public static void main ( String [] args ) {
                try {
                        InputStream is = new FileInputStream ( "F:\\aa\\io.txt" );
                        int length = is . available (); // 获取通道中的数据长度
                        //根据通道中数据的长度构建字节数组。
                        byte [] buffer = new byte [ length ];
                        // int index = 0;
                        // while (true){
                                // //读取通道中的数据,一次读取一个字节。如果读取到末尾,则返回-1
                                // byte b = (byte) is.read();
                                // if(b == -1) break;
                                        // buffer[index++] = b;
                                         index++;
                                // }
                        int readCount = is . read ( buffer ); // 将通道中的数据全部读取到 buffer 数组中
                        System . out . println ( " 读取了 " + readCount + " 个字节 " );
                        System . out . println ( new String ( buffer ));
                        is . close (); // 关闭通道
                } catch ( FileNotFoundException e ) {
                        e . printStackTrace ();
                } catch ( IOException e ) {
                        e . printStackTrace ();
                }
        }
}
        如果通道中数据长度过长,那么根据通道中数据的长度来构建字节数组,则可能导致内存不够,比如使用流读取一个大小为10G的文件,那么通道中就应该存在 10G 长的数据,此时应该怎么办?
package com . we . io ;
import java . io . FileInputStream ;
import java . io . FileNotFoundException ;
import java . io . IOException ;
import java . io . InputStream ;
public class Example3 {
        public static void main ( String [] args ) {
                try {
                        InputStream is = new FileInputStream ( "F:\\aa\\io.txt" );
                        //实际开发过程中字节数组的长度一般定义为1024的整数倍
                        byte [] buffer = new byte [ 31 ]; // 构建了一个长度为 31 的字节数组
                        while ( true ){
                                //从通道中读取数据存入字节数组buffer中,返回值就是读取的字节长度.
                                //如果读取到数据的末尾,则返回-1
                                int len = is . read ( buffer );
                                if ( len == - 1 ) break ;
                                System . out . println ( len );
                                System . out . println ( new String ( buffer ));
                        }
                        is . close ();
                } catch ( FileNotFoundException e ) {
                        e . printStackTrace ();
                } catch ( IOException e ) {
                        e . printStackTrace ();
                }
        }
}
综合练习
        使用字节流实现磁盘文件拷贝功能

package com . we . io ;
import java . io . * ;
/**
* 文件拷贝
*/
public class Example5 {
        public static void main ( String [] args ) {
                String sourceFile = "F:\\study\\java\\chapter16\\src\\com\\cyx\\io\\Example1.java" ;
                String destFile = "F:\\aa\\IO.java" ;
                copyFile ( sourceFile , destFile );
        }
        public static void copyFile2 ( String sourceFile , String destFile ){
                File file = new File ( destFile );
                File parent = file . getParentFile ();
                if ( ! parent . exists ()) parent . mkdirs ();
                        //try(){}catch(){} JDK 1.7
                        //写在括号中的代码只能够是实现了AutoClosable接口的类
                        try ( InputStream is = new FileInputStream ( sourceFile );
                                OutputStream os = new FileOutputStream ( destFile );) {
                                byte [] buffer = new byte [ 4096 ];
                                while ( true ){
                                        int len = is . read ( buffer );
                                        if ( len == - 1 ) break ;
                                                os . write ( buffer , 0 , len );
                                        }
                                os . flush ();
                        } catch ( FileNotFoundException e ) {
                                e . printStackTrace ();
                        } catch ( IOException e ) {
                                e . printStackTrace ();
                        }
        }
        public static void copyFile ( String sourceFile , String destFile ){
                File file = new File ( destFile );
                File parent = file . getParentFile ();
                if ( ! parent . exists ()) parent . mkdirs ();
                InputStream is = null ;
                OutputStream os = null ;
                try {
                        is = new FileInputStream ( sourceFile );
                        os = new FileOutputStream ( destFile );
                        byte [] buffer = new byte [ 4096 ];
                        while ( true ){
                                int len = is . read ( buffer );
                                if ( len == - 1 ) break ;
                                os . write ( buffer , 0 , len );
                                }
                        os . flush ();
                } catch ( FileNotFoundException e ) {
                        e . printStackTrace ();
                } catch ( IOException e ) {
                        e . printStackTrace ();
                } finally {
                        // if(is != null){
                                // try {
                                        // is.close();
                                // } catch (IOException e) {
                                // }
                        // }
                        // if(os != null){
                                // try {
                                        // os.close();
                                // } catch (IOException e) {
                                // }
                        // }
                close ( is , os );
        }
}
        //不定长自变量,本质是一个数组。在使用不定长自变量作为方法的参数时,必须为该方法参数列表的最后一个参数
        public static void close ( Closeable ... closeables ){
                for ( Closeable c : closeables ){
                        if ( c != null ){
                                try {
                                        c . close ();
                                } catch ( IOException e ) {}
                        }
                }
        }
}
字节流应用场景
Byte streams should only be used for the most primitive I / O .
字节流仅仅适用于读取原始数据(基本数据类型)

Java SE文章参考:Java SE入门及基础知识合集-CSDN博客

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

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

相关文章

FREERTOS空闲任务和低功耗

空闲任务 空闲任务是 FreeRTOS 必不可少的一个任务,其他 RTOS 类系统也有空闲任务,比如uC/OS。看名字就知道,空闲任务是处理器空闲的时候去运行的一个任务,当系统中没有其他就绪任务的时候空闲任务就会开始运行,空闲任…

腾讯春招后端一面(算法篇)

前言: 哈喽大家好,前段时间在小红书和牛客上发了面试的经验贴,很多同学留言问算法的具体解法,今天就详细写个帖子回复大家。 因为csdn是写的比较详细,所以更新比较慢,大家见谅~~ 就题目而言,…

Cache缓存:HTTP缓存策略解析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于CNN多阶段图像超分+去噪(超级简单版)

这是之前的一项工作,非常简单,简单的复现了两个算法,然后把它们串起来了。 可执行的程序链接:CSDN; Github 我们分成两部分进行讲解: 1. 图像去噪 1.1 基本思路 图像的去噪工作基于很普通的CNN去噪,效…

Django分页器

Django分页器 分页器前瞻之url urls.py不需要做修改 urlpatterns [path(test/, views.test,nametest), ]假设此时在原有的路径http://127.0.0.1:8000/app01/test后面添加/?page2 然后再后端获取到page def test(request):page request.GET.get(page)print(page) # 2retu…

【二分查找】算法例题

目录 十八、二分查找 114. 搜索插入位置 ① √- 115. 搜索二维矩阵 ② 116. 寻找峰值 ② √- 117. 搜索旋转排序数组 ② 118. 在排序数组中查找元素的第一个和最后一个位置 ② √ 119. 寻找寻钻排序数组中的最小值 ② 120. 寻找两个正序数组的中位数 ③ 136. 直线上最多…

在react中使用tailwindcss

安装tailwind css npm i -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9安装 CRACO 由于 Create React App 不能让您覆盖原生的 PostCSS 配置,所以我们还需要安装 CRACO 才能配置 Tailwind。 npm install craco/craco配置CRACO 在项目根…

深入挖掘C语言之——联合

目录 联合的定义 联合的特点 联合的应用场景 在C语言中,联合(Union)是一种特殊的数据结构,它允许在同一内存地址存储不同类型的数据。与结构体(Struct)不同的是,联合中的所有成员共享同一块内…

VsCode免密登录

创建本地密匙 按下WinR输入cmd,输入 ssh-keygen -t rsa然后连续回车直到结束 找到Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub,每个人都不一样找到密匙所在地 打开id_rsa.pub这个文件,可以用记事本打开&am…

大模型第一讲笔记

目录 1、人工智能基础概念全景介绍... 2 1.1 人工智能全景图... 2 1.2 人工智能历史... 2 1.3 人工智能——机器学习... 3 监督学习、非监督学习、强化学习、机器学习之间的关系... 3 监督学习... 4 无监督学习... 5 强化学习... 5 深度学习... 6 2、语言模型的发展及…

深入理解并优化Android中的文件描述符(FD)

文章目录 一、文件描述符(FD)概述二、为什么要优化文件描述符?三、实际开发中的文件描述符优化策略3.1 及时关闭文件和资源3.2 使用try-with-resources3.3 检查并优化第三方库3.4 使用文件描述符检查工具3.4.1 使用/proc文件系统3.4.2 使用ls…

算法·动态规划Dynamic Programming

很多人听到动态规划或者什么dp数组了,或者是做到一道关于动态规划的题目时,就会有一种他很难且不好解决的恐惧心理,但是如果我们从基础的题目开始深入挖掘动规思想,在后边遇到动态规划的难题时就迎难而解了。  其实不然&#xff…

PyTorch 深度学习(GPT 重译)(一)

第一部分:PyTorch 核心 欢迎来到本书的第一部分。在这里,我们将与 PyTorch 迈出第一步,获得理解其结构和解决 PyTorch 项目机制所需的基本技能。 在第一章中,我们将首次接触 PyTorch,了解它是什么,解决了…

linux之权限管理和组

一,ACL权限 1.1,什么是acl权限? ACL是Access Control List的缩写,即访问控制列表。可以通过下列的实例来理解ACL的作用: 思考如何实现如下的权限控制: 每个项目成员在有一个自己的项目目录,…

mysql数据库如何安装

1.第一步需要下载mysql,直接官方下载。如果想要现成的可以私聊我。 2.解压mysql-5.7.44-winx64.zip文件 3.新建my.ini 注意:basedir、datadir改成你自己的按照路径 需要新建data文件夹设置 mysql 数据库的数据的存放目录 [mysql] # 设置 mysql 客户端默认字符…

uniapp——第3篇:自定义组件、组件间传数据

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,还有一定要会Vue!(Vue2\Vue3)都要会!!!不然不好懂 一、组件是啥玩意? 我之前讲vue2的文章讲过 Vue全家桶:vue2vue3全…

AI大模型-Grok搭建

Grok搭建 硬件要求项目下载Checkpoint下载运行代码 马斯克又搞事情了,正式开源AI大模型Grok-1,免费还可商用,国内AI技术即将迎来重大突破。笔者简单整合了一下,如何搭建Grok-1的思路,供后期自己搭建以及读者学习使用。…

AIGC——ComfyUI工作流搭建、导入与常用工作流下载

工作流 ComfyUI工作流是一个基于图形节点编辑器的工作流程,通过拖拽各种节点到画布上,连接节点之间的关系,构建从加载模型到生成图像的流程。每个节点代表一个与Stable Diffusion相关的模型或功能,节点之间通过连线传递图片信息。…

JavaScript实现简单的表单验证

关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

【Kotlin】扩展属性、扩展函数

1 类的扩展 Kotlin 提供了扩展类或接口的操作&#xff0c;而无需通过类继承或使用装饰器等设计模式&#xff0c;来为某个类添加一些额外的属性或函数&#xff0c;我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制&#xff0c;我们可以将那些第三方类不具备的功能强…