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.mzph.cn/news/758600.shtml

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

相关文章

自动化测试报告生成(Allure)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 之前尝试使用过testNG自带的测试报告、优化过reportNG的测试报告…

算法·动态规划Dynamic Programming

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

linux:线程互斥

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程互斥问题解释互斥量的接口 二、加锁的原理三、 死锁死锁四个必要条件避免死锁 总结 前言 本文是对于线程互斥的知识总结 一、线程互斥 问题 我们先看下面…

财报解读:出海“窗口期”再现,汇量科技保驾护航的底气源于什么

大数据时代,每个人的喜好都被精准捕捉。购物APP、购物网站们,都仿佛一位贴心的时尚顾问。而这源于个性化广告经过深度学习和智能算法得来的结果。 随着广告市场的竞争愈演愈烈,广告主们需要更为精准、高效的个性化投放。近日,深耕…

基于SSM的宿舍管理系统的设计与实现(JSP,MySQL)

摘 要 随着社会发展、信息技术的普及,人们日常管理工作也发生了巨大的变化。信息化技术之渗透各行业的方方面面。学生宿舍管理作为校园管理工作的重要一环,不仅关系到学生自身的确切利益,同时也是对校园管理工作重大考验。近来年由于在校学生…

leetcode代码记录(移除链表元素

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head […

Flutter开发进阶之瞧瞧Widget

Flutter开发进阶之瞧瞧Widget 在Flutter开发中,WIdget是构建界面的基本单元;Widget是不可变的,意味着一旦创建如果需要改变UI就需要重新创建一个新的Widget;在实际开发中,Widget通常由一个个Widget组合而成,从而形成嵌套的树形结构,复杂的UI就是由这一个个Widget构建而…

【C语言】—— 指针三 : 参透数组传参的本质

【C语言】—— 指针三 : 参透数组传参的本质 一、数组名的理解二、使用指针访问数组2.1、指针访问数组2.2、[ ] 的深入理解2.3、数组与指针的区别 三、一维数组的传参本质四、数组指针变量4.1、数组指针变量是什么4.2、 数组指针的初始化 五、二维数组传参的本质 一…

简单了解多线程

并发和并行 并发: 在同一时刻,多个指令在单一CPU上交替指向 并行:在同一时刻,多个指令在多个CPU上同时执行 2核4线程,4核8线程,8核16线程,16核32线程 基础实现线程的方式 Thread :继承类 &…

多人命题系统|基于SSM框架+ Mysql+Java+ B/S结构的多人命题系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

13年资深测试,性能测试常见指标分析总结,看这篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、什么是性能测试…

Kotlin runBlocking CoroutineScope synchronized简单死锁场景

Kotlin runBlocking CoroutineScope synchronized简单死锁场景 import kotlinx.coroutines.*fun main(args: Array<String>) {runBlocking {val lock1 Any()val lock2 Any()CoroutineScope(Dispatchers.IO).launch {repeat(10) {println("A-$it 申请 lock1...&quo…

Http 超文本传输协议基本概念学习摘录

目录 HTTP协议 超文本传输协议 HyperText超文本 HTML超文本标记语言 HTTP协议原理 请求发送 服务器处理 响应发送 连接关闭或保持 HTTP协议版本 HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3 HTTP请求方法 GET POST PUT DELETE HEAD OPTIONS HTTP请求头字…

JVM学习-类加载

目录 1.类文件结构 2.类加载器 3.类加载的三个阶段 3.1加载 3.2链接 3.2.1验证 3.2.2准备阶段 3.2.3解析阶段 3.3初始化 4.拓展&#xff1a;反射 4.1获取类对象 4.2创建实例 4.3获取方法 4.4方法调用 1.类文件结构 2.类加载器 类加载器用来将类文件的二进制字节码加载到JV…

猜数字游戏有三变(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

小白学视觉 | 超详细!Python中 pip 常用命令

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;超详细&#xff01;Python中 pip 常用命令 相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了…

中国联通推出了一站式全流程的专业安全服务

中国联通依托多年深耕通信与信息安全领域的丰富经验和专业技术积累&#xff0c;推出了一站式全流程的专业安全服务&#xff0c;从网络环境的前期准备阶段直至正式运行&#xff0c;均提供全面、立体、高效的保障措施&#xff0c;确保各类企事业单位在网络空间的安全稳定。 请点击…

算法打卡day23|回溯法篇03|Leetcode 39. 组合总和、40.组合总和II、131.分割回文串

算法题 Leetcode 39. 组合总和 题目链接:39. 组合总和 大佬视频讲解&#xff1a;组合总和视频讲解 个人思路 这道组合题主要是有总和的限制&#xff0c;当递归和超过了总和就return&#xff0c;递归时加上回溯去遍历数组。 解法 回溯法 把组合问题抽象为如下树形结构 如上…

达源电机超高速数码马达震撼来袭

新质生产力是什么? 12万转高速电吹风机马达引领行业技术革新 随着科技的不断进步&#xff0c;电吹风机行业正迎来一场深刻新质生产力技术革新。在这场革新中&#xff0c;达源电机以其独特绕线技术与自适应平衡磁场的马达技术&#xff0c;成功打破了国外高速马达电机悬臂梁专利…

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

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