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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LC串联谐振拓扑仿真建模及控制策略分析

直流高压电源主要应用于高端精密分析仪器、高端医疗分析仪器、静电应用、激光雷达、核探测、惯性导航、雷达通信、电子对抗、高功率脉冲、等离子体推进等行业领域。 LC串联谐振拓扑是直流高压电源中最为常用的拓扑结构。上一期内容中我们对 LC 串联谐振变换器的工作原理进行了…

Pytest单元测试框架 —— Pytest+Allure+Jenkins的应用

一、简介 pytestallurejenkins进行接口测试、生成测试报告、结合jenkins进行集成。 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高 allure-pytest是python的一个第三方…

看似封装,其实不止于封装?

本文介绍的也不只是封装,包含零零散散的知识点。其中,主要介绍封装、包和访问限定符、static、代码块等 提示:使用PC端观看,效果更佳! 目录 一、封装 1.为什么要封装 2.怎么封装 3.怎么访问被封装的数据 4.封装…

必知必会干货!Python正则表达式常用函数

1.正则表达式 正则表达式:是一个特殊的字符序列,计算机科学的一个概念,主要用来检索/替换哪些符合某个模式的文本 在python中使用正则表达式,主要是借助re模块来实现 ​特点 灵活性/功能性/逻辑性非常强 可以使用极其简单的方法…

【NTN 卫星通信】 车辆物联网设备通过NTN和TN切换的应用场景

1 场景描述 对于有两个3GPP无线接入网服务的大面积农田和农场,物联网设备可以通过NTN和TN接入网同时受益于5G系统的双转向数据连接能力。   在这个用例中,我们有一个广域的农业自动化应用系统来控制农业车辆,例如,一个装有数百个…

二分查找算法(1)

算法介绍 二分查找适用范围不止是有序数组,很多有“二段性”的数组其实都可以使用二分查找,什么是“二段性”呢?在数组中,我们查到某个数不符合条件后,就可以排除它之前或之后的所有数据,这种性质就叫做“…

【Linux】盘点广义层面上【三种最基本的进程状态】

前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

119.设计链表(力扣)

代码解决 class MyLinkedList { public:// 定义链表节点结构体struct LinkedNode {int val;LinkedNode* next;LinkedNode(int val):val(val), next(nullptr){}};MyLinkedList() {dummyhead new LinkedNode(0);size0;}int get(int index) {if (index > (size - 1) || index…

分布式文件存储与数据缓存(二)| Redis

目录 Redis概述_什么是NoSQLNoSQL的四大分类KV型NoSql(代表----Redis)列式NoSql(代表----HBase)文档型NoSql(代表----MongoDB)搜索型NoSql(代表----ElasticSearch) 关系型数据库和非…

刷力扣看见一个寻找单身狗的问题?【力扣题解】

今天刷力扣遇到一道有意思的题目,题目是写着撞色问题177 ,当我写完这个题去看看有什么好的解题方式的时候,看见一个有趣的题解问题,他对这个题目的描述是几对情侣,带几个单身狗出去玩,然后现在我们要把这几…

使用Laravel开发项目

如何使用Laravel框架开发项目 一、安装Laravel框架 1.在安装Laravel框架钱我们需要先查看要安装的Laravel框架版本以及版本所需要的安装运行条件。 2.配置好安装环境后再安装Laravel框架 2.1.配置安装环境 1)PHP版本 2)PHP OpenSSL扩展 3&#xff…

详解隐私计算框架及技术要点

隐语架构一览 为什么这样分层? 完备性透明性开放性 隐语架构解析 产品层 算法层 隐语PSI特点 PIR Data Analysis SCQL 核心特性 联邦学习 特色 计算层 SPU 核心 HEU 同态加密设备 TEEU 密码原语 资源层 kuscia 互联互通 跨域管控 最后

软件工程-第三版王立福-第1章 绪论

本书结合IEEE最新发布的软件工程体系SWEBOK,和IEEE/ACM软件工程学科小组公布的软件工程教育知识体系SEEK,北大本科生指定教材。注重基础知识的系统性,选材的先进性及知识的应用。2009年出版 软件开发本质的认识,两大技术问题&…

计算机缺失xapofx1_5.dll如何修复?分享多种修复方法轻松搞定

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是xapofx1_5.dll丢失。丢失xapofx1_5.dll文件对电脑系统及运行程序的影响是多方面的,某些依赖于xapofx1_5.dll文件的特定软件或应用程序可能无法启动或运行过程中出现崩溃现象&…

上位机图像处理和嵌入式模块部署(qmacvisual脚本编辑)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 个人认为qmacvisual软件中,另外一个鲜明的特色,就是它本身支持javascript脚本编写,虽然是利用qt script engine…

Java基础 学习笔记九

for循环 for循环语句的语法结构 for(初始化表达式;条件表达式;更新表达式){循环体;}初始化表达式最先被执行,而且只执行一次条件表达式的执行结果必须是一个布尔类型的值更新表达式一般是负责更新某个变量值的(只有更新了某个变量值,条件表达…

codeforces 1600分

文章目录 1.[G. Special Permutation](https://codeforces.com/problemset/problem/1352/G)2.[D. Constructing the Array](https://codeforces.com/problemset/problem/1353/D)3.[C2. k-LCM (hard version)](https://codeforces.com/problemset/problem/1497/C2)4.[C. Circle …

7.【Linux】进程间通信2(共享内存||消息队列)

共享内存 介绍 1.共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 2.当共享内存创建出来后,通过系统调用挂接到…

软件工程-第9章 软件工程项目管理概述

9.1 软件工程管理活动 9.2 软件规模、成本和进度估算 9.3 能力成熟度模型CMM 9.4 ISO 9000系列标准简介 9.5 CMM与ISO 9000系列标准的比较 9.6 本章小结

安装MySQL5.7.19 + 解决数据库乱码

文章目录 1.删除mysql服务 sc delete mysql2.解压到D:\mysql5.7下3.配置管理员环境变量4.D:\mysql5.7\mysql-5.7.19-winx64下创建my.ini1.创建文件2.文件内容 5.管理员打开cmd,切换到 D:\mysql5.7\mysql-5.7.19-winx64\bin6.输入 mysqld -install 安装mysql服务7.初…