当前位置: 首页 > news >正文

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博客

相关文章:

Java SE入门及基础(44)

目录 I / O流(上) 1. 什么是I / O流 过程分析 I / O的来源 Java 中的 I / O流 2. 字节流 OutputStream 常用方法 文件输出流 FileOutputStream 构造方法 示例 InputStream 常用方法 文件输入流 FileInputStream 构造方法 示例 综合练习 字节流应用场景 Java SE文…...

基于Wechaty的微信机器人

git地址:GitHub - wechaty/getting-started: A Starter Project Template for Wechaty works out-of-the-boxhttps://github.com/wechaty/getting-started 在 Terminal中npm install 下载node包 加载完成后。npm start 启动 扫描二维码,即可登录微信web端…...

【C++ leetcode】双指针问题(续)

3. 202 .快乐数 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结…...

51单片机-蜂鸣器

1.蜂鸣器的介绍 无源蜂鸣器不能一直通电&#xff0c;无源蜂鸣器内部的线圈较小&#xff0c;易烧坏 蜂鸣器的驱动 达林顿晶体管&#xff08;npn型&#xff09; 应用&#xff1a; 按下独立按键同时蜂鸣器响起提示音&#xff0c;数码管显示对应的独立按键键码 #include <REG…...

【MySQL】学习和总结使用列子查询查询员工工资信息

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-5odctDvQ0AHJJc1C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

突破编程_C++_STL教程( stack 的实战应用)

1 std::stack 应用于自定义数据结构 通常&#xff0c;std::stack 用于存储基本数据类型&#xff0c;如 int、float、char 等。然而&#xff0c;std::stack 同样可以存储自定义的数据结构&#xff0c;只要这些数据结构满足一定的要求。 &#xff08;1&#xff09;存储自定义数…...

Spring Data访问Elasticsearch----其他Elasticsearch操作支持

Spring Data访问Elasticsearch----其他Elasticsearch操作支持 一、索引设置二、索引映射三、Filter Builder四、为大结果集使用滚动Scroll五、排序选项六、运行时字段6.1 索引映射中的运行时字段定义6.2 在查询上设置的运行时字段定义 七、Point In Time (PIT) API八、搜索模板…...

代码随想录算法训练营第60天 | 84.柱状图中最大的矩形

单调栈章节理论基础&#xff1a; https://leetcode.cn/problems/daily-temperatures/ 84.柱状图中最大的矩形 题目链接&#xff1a;https://leetcode.cn/problems/largest-rectangle-in-histogram/description/ 思路&#xff1a; 本题双指针的写法整体思路和42. 接雨水是一…...

【讲解Node.js常用的命令】进阶版

Node.js常用命令 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;它使得可以在服务器端运行 JavaScript 代码。Node.js 采用了事件驱动、非阻塞 I/O 模型&#xff0c;非常适用于构建高效的网络应用程序。以下是一些Node.js开发中常用的命令&#xff1…...

软考81-上午题-【面向对象技术3-设计模式】-行为型设计模式01

一、行为型设计模式一览 二、责任链模式 2-1、意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 1-2、结构 1-3、代码实现 1-4、适…...

【Linux进阶之路】HTTPS = HTTP + S

文章目录 一、概念铺垫1.Session ID2.明文与密文3.公钥与私钥4.HTTPS结构 二、加密方式1. 对称加密2.非对称加密3.CA证书 总结尾序 一、概念铺垫 1.Session ID Session ID&#xff0c;即会话ID&#xff0c;用于标识客户端与服务端的唯一特定会话的标识符。会话&#xff0c;即客…...

51-31 CVPR’24 | VastGaussian,3D高斯大型场景重建

2024 年 2 月&#xff0c;清华大学、华为和中科院联合发布的 VastGaussian 模型&#xff0c;实现了基于 3D Gaussian Splatting 进行大型场景高保真重建和实时渲染。 Abstract 现有基于NeRF大型场景重建方法&#xff0c;往往在视觉质量和渲染速度方面存在局限性。虽然最近 3D…...

GPT-4引领AI新纪元,Claude3、Gemini、Sora能否跟上步伐?

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…...

图书馆RFID(射频识别)数据模型压缩/解压缩算法实现小工具

1. 前言 最近闲来无聊&#xff0c;看了一下《图书馆射频识别数据模型第1部分&#xff1a;数据元素的设置及应用规则》以及《图书馆射频识别数据模型第2部分&#xff1a;基于ISO/IEC 15962的数据元素编码方案》&#xff0c;决定根据上面的编码方法实现一下该算法&#xff0c;于…...

【Java Web基础】一些网页设计基础(三)

文章目录 1. 导航栏样式进一步调整2. 入驻企业信息展示栏2.1 Title设置2.2 具体信息添加 3. 轮播图4. 注册登录按钮及其他信息5. 一些五颜六色的、丰富视觉效果的中间件…… 1. 导航栏样式进一步调整 这种导航栏&#xff0c;选中的时候字体变蓝色&#xff0c;可能还是不够美观&…...

2 使用GPU理解并行计算

2.1 简介 本章旨在对并行程序设计的基本概念及其与GPU技术的联系做一个宽泛的介绍。本章主要面向具有串行程序设计经验&#xff0c;但对并行处理概念缺乏了解的读者。我们将用GPU的基本知识来讲解并行程序设计的基本概念。 2.2 传统的串行代码 绝大多数程序员是在串行程序占据…...

Android什么情况下会出现内存泄漏以及怎么解决?

1.什么情况下会出现内存泄漏? (1)单例模式下为什么会造成内存泄漏? 因为单例的生命周期和应用的生命周期是一致的,如果往单例模式里面传了一个生命周期比较短的对象,比如Activity,就会导致Activity不能释放,导致内存泄漏。我们可以传context.getAppliactionContext,而…...

kafka集群介绍及搭建

介绍 kafka是一个高性能、低延迟、分布式的消息传递系统&#xff0c;特点在于实时处理数据。集群由多个成员节点broker组成&#xff0c;每个节点都可以独立处理消息传递和存储任务。 路由策略 发布消息由key、value组成&#xff0c;真正的消息是value&#xff0c;key是标识路…...

2024/03/19(网络编程·day5)

一、思维导图 二、selec函数实现TCP并发服务器 #include<myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.117.116" //服务器IP int main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET,SOC…...

​LeetCode解法汇总1969. 数组元素的最小非零乘积

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个正整数 p 。你有一个下标从 1 开…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...