Java SE入门及基础(44)

news2024/11/24 8:57:43

目录

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.coloradmin.cn/o/1532194.html

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

相关文章

命名空间——初识c++

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 经典的Hello Word 起航c关键字c语言的命名冲突问题域作用限定符::命名空间 namespace命名空间定义命名空间的使用1.加命名空间名称及作用域限定符2.使用…

web集群-lvs-DR模式基本配置

目录 环境: 一、配置RS 1、安装常见软件 2、配置web服务 3、添加vip 4、arp抑制 二、配置LVS 1、添加vip 2、安装配置工具 3、配置DR 三、测试 四、脚本方式配置 1、LVS-DR 2、LVS-RS 环境: master lvs 192.168.80.161 no…

数据结构与算法4-冒泡排序

文章目录 1. 认识冒泡排序2. 图示2.1 图示12.2 图示2 3. 代码 1. 认识冒泡排序 双层for循环,每次选出最大的数“浮”到数组的最后面;时间复杂度O( n 2 n^2 n2),空间复杂度O(1);重复地遍历待排序的数列,一次比较两个元素&#xff…

HCIP配置实验(路由配置)

要求: 1、R6为ISP,接口IP地址均为公有地址,该设备只能配置IP地址,之后不能冉对其进行任何配置; 2、R1-R5为局域网,私有IP地址192.168.1.0/24;请合理分配; 3、R1、R2、R4,各有两个环回IP地址; R5, R6各有一个…

小字辈[天梯赛]

文章目录 题目描述思路AC代码 题目描述 思路 深度优先搜索 具体流程 1.读入每个人的祖先,标记辈分最高的老祖宗对应的下标pos 2.从pos开始dfs,每次判断当前遍历的深度,如果>原来的深度,更新,并将存储最小辈分的数组…

【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】

欢迎来CILMY23的博客喔,本篇为【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注收藏。 前言 欢迎来到本篇博客&…

Linux编程4.9 网络编程-建立连接

1、TCP的连接与断开 三次握手与四次挥手 2、服务器端并发性处理 2.1 多进程模型 一个父进程,多个子进程父进程负责等待并接受客户端连接子进程: 完成通信,接受一个客户端连接,就创建一个子进程用于通信。 2.2 多线程模型 多线程服务器是…

Vue3+.NET6前后端分离式管理后台实战(四)

1,Vue3.NET6前后端分离式管理后台实战(四)已经发布, 程序源码已打包,感兴趣的可以关注下载。 2,源码打包可以下载:

整合qq邮箱发送

目录 &#x1f32e;1.获取qq授权码 &#x1fad3;2.引入依赖 &#x1f9c8;3.配置mail信息 &#x1f95e;4.创建实现类 &#x1f956;5.测试 1.获取qq授权码 点击开启服务&#xff0c;发送信息获取授权码 2.引入依赖 <!--邮件--><dependency><groupId&…

FL Studio for Mac 21.2.3.3586中文版的一些特点

FL Studio&#xff08;Fruity Loops&#xff09;是一款非常流行的数字音乐工作站软件&#xff0c;它可以让用户轻松地制作各种类型的音乐。前不久&#xff0c;FL Studio发布了最新的Mac版21.2.3.3586中文版&#xff0c;这个新版本的发布让广大Mac用户感到非常兴奋。本文将介绍F…

OSI(Open Systems Interconnection)网络架构模型简介

OSI&#xff08;Open Systems Interconnection&#xff09;参考模型是一种概念性的网络架构模型&#xff0c;它将计算机通信系统划分为7个层次&#xff0c;每个层次都有自己的功能和职责&#xff0c;通过相互合作来实现整个网络的通信。这7个层次分别是&#xff1a; 应用层&…

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

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

Android分区存储到底该怎么做

文章目录 一、Android存储结构二、什么是分区存储&#xff1f;三、私有目录和公有目录三、存储权限和分区存储有什么关系&#xff1f;四、我们应该该怎么做适配&#xff1f;4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

AI算力池化赋能企业大模型价值探索

1. 大语言模型企业落地中的算力痛点 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了热门的研究领域之一。在这一领域中&#xff0c;大语言模型&#xff08;Large Language Models&#xff09;凭借其强大的语言理解和生成能力&#xff…

ArcGIS Pro、R与INVEST的多技术融合:生态系统服务权衡与协同研究的新纪元

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

突发!OpenAI服务异常!!!

2024/3/20傍晚7点&#xff0c;笔者的朋友在使用OpenAI时&#xff0c;页面提示服务异常&#xff0c;由此引发了我的深思&#xff1a;人工智能的脆弱性与未来的挑战 2024年3月20日&#xff0c;傍晚7点&#xff0c;一个普通的周二&#xff0c;我的朋友在尝试使用OpenAI时&#xf…

媒体发稿途径,怎么样去网络媒体投稿,媒体发布一般价格多少钱?

在信息爆炸的时代&#xff0c;媒体作为传递信息的重要渠道&#xff0c;成为企业推广的重要手段。然而&#xff0c;如何去网络媒体投稿&#xff0c;以及媒体发布的价格却是困扰很多企业和个人的问题。今天&#xff0c;我们将会为大家介绍一种简单易行的方式&#xff1a;媒介多多…

vue3 几种实现点击复制链接的方法

vue3 几种实现点击复制链接的方法 环境&#xff1a;vue3tselment plus 目的&#xff1a;常用到的地方就是点击复制分享链接功能 1.复制当前页面链接&#xff0c; <template><div class"news" style"margin-top: 30px"><el-button type&q…

事务同步管理器TransactionSynchronizationManager

事务同步管理器的使用场景&#xff1a; 同步涉及的资源包括&#xff1a;SqlSession & Connection。同步资源核心目的是线程共享&#xff0c;意味着必须跟线程绑定。同步资源伴随着线程生存或者消亡&#xff0c;意味着线程结束之前必须手动清除其绑定的资源。事务同步管理器…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(一)

概览 Swift 语言给我们的印象是&#xff1a;简洁、现代化和可以“心安神泰”的完全信赖。不过&#xff0c;在一些特殊情况下我们唯有进入 Swift 底层的动态世界方能真正地“随遇而安”。 保安局“刘局长”曾语重心长的教导过我们&#xff1a;“非常时期&#xff0c;用非常方法…