第一百五十九节 Java IO教程 - Java输入流、文件输入流、缓冲输入流、推回输入流

Java IO教程 - Java输入流

抽象基本组件是InputStream类。

InputStream|+--FileInputStream |+--ByteArrayInputStream |+--PipedInputStream|+--FilterInputStream|+--BufferedInputStream |+--PushbackInputStream |+--DataInputStream |+--ObjectInputStream

我们有FileInputStream,ByteArrayInputStream和PipedInputStream,FilterInputStream的具体类。

方法

超类InputStream包含从输入流读取数据的基本方法,所有具体类都支持这些方法。

对输入流的基本操作是从其读取数据。 InputStream类中定义的一些重要方法在下表中列出。

ID方法/说明
1read()
读取一个字节并将读取的字节作为int返回。
当到达输入流的结尾时,它返回-1。
2read(byte[] buffer)
读取最大值直到指定缓冲区的长度。
它返回在缓冲区中读取的字节数。
如果到达输入流的结尾,则返回-1。
3read(byte [] buffer,int offset,int length)
读取最大值到指定长度字节。
 数据从偏移索引开始写入缓冲区。
它返回读取的字节数或-1,如果到达输入流的结束。
3close()
关闭输入流
4available()
返回可以从此输入流读取但不阻塞的估计字节数。


 

Java IO教程 - Java文件输入流

在Java I/O中,流意味着数据流。流中的数据可以是字节,字符,对象等。

要从文件读取,我们需要创建一个FileInputStream类的对象,它将表示输入流。

String srcFile = "test.txt";
FileInputStream fin  = new FileInputStream(srcFile);

如果文件不存在,FileInputStream类的构造函数将抛出FileNotFoundException异常。要处理这个异常,我们需要将你的代码放在try-catch块中,如下所示:

try  {FileInputStream fin  = new FileInputStream(srcFile);
}catch  (FileNotFoundException e){// The error  handling code  goes  here
}

读取数据

FileInputStream类有一个重载的read()方法从文件中读取数据。我们可以一次读取一个字节或多个字节。

read()方法的返回类型是int,虽然它返回一个字节值。如果到达文件的结尾,则返回-1。

我们需要将返回的int值转换为一个字节,以便从文件中读取字节。通常,我们在循环中一次读取一个字节。

最后,我们需要使用close()方法关闭输入流。

// Close  the   input  stream 
fin.close();

close()方法可能抛出一个IOException,因此,我们需要在try-catch块中包含这个调用。

try  {fin.close();
}catch (IOException e)  {e.printStackTrace();
}

通常,我们在try块中构造一个输入流,并在finally块中关闭它,以确保它在我们完成后总是关闭。

所有输入/输出流都可自动关闭。我们可以使用try-with-resources来创建它们的实例,所以无论是否抛出异常,它们都会自动关闭,避免需要显式地调用它们的close()方法。

以下代码显示使用try-with-resources创建文件输入流:

String srcFile = "test.txt";
try  (FileInputStream fin  = new FileInputStream(srcFile))  {// Use fin to read   data from  the   file here
}
catch  (FileNotFoundException e)  {// Handle  the   exception here
}

以下代码显示了如何从文件输入流一次读取一个字节。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Main {public static void main(String[] args) {String dataSourceFile = "asdf.txt";try (FileInputStream fin = new FileInputStream(dataSourceFile)) {byte byteData;while ((byteData = (byte) fin.read()) != -1) {System.out.print((char) byteData);}} catch (FileNotFoundException e) {;} catch (IOException e) {e.printStackTrace();}}
}

Java IO教程 - Java缓冲输入流

BufferedInputStream通过缓冲数据向输入流添加功能。

它维护一个内部缓冲区以存储从底层输入流读取的字节。

我们创建缓冲区输入流如下:

String srcFile =“test.txt";BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));

以下代码显示如何使用BufferedInputStream从文件读取。

import java.io.BufferedInputStream;
import java.io.FileInputStream;public class Main {public static void main(String[] args) {String srcFile = "test.txt";try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile))) {// Read one byte at a time and display itbyte byteData;while ((byteData = (byte) bis.read()) != -1) {System.out.print((char) byteData);}} catch (Exception e2) {e2.printStackTrace();}}
}

上面的代码生成以下结果。


 

Java IO教程 - Java推回输入流

PushbackInputStream向输入流添加功能,允许我们使用其unread()方法推回读取的字节。

有三个版本的unread()方法。一个让我们推回一个字节,另外两个让我们推回多个字节。

例子

import java.io.FileInputStream;
import java.io.PushbackInputStream;public class Main {public static void main(String[] args) {String srcFile = "test.txt";try (PushbackInputStream pis = new PushbackInputStream(new FileInputStream(srcFile))) {byte byteData;while ((byteData = (byte) pis.read()) != -1) {System.out.print((char) byteData);pis.unread(byteData);// Reread the byte we unreadbyteData = (byte) pis.read();System.out.print((char) byteData);}} catch (Exception e2) {e2.printStackTrace();}}
}

上面的代码生成以下结果。


 

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

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

相关文章

【C++】——类和对象(中)

文章目录 类的默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载运算符重载 const成员函数 类的默认成员函数 在C中,类(class)可以拥有多种成员函数,其中一些成员函数在类定义中没有显式声明时,编译器会隐式地…

JSON传输二进制

0x01 结论 JSON无法传输二进制, 若需要在JSON中传输二进制, 可以对二进制进行编码: 1. HEX To HexString 2. base64编码 若直接传送二进制, 其中无法被UTF-8解码的字节将被替换. Base64将会扩大30%的体积. 0x00 起因 我使用JSON提交了包含二进制的报文, 解析时发现很多字…

Windows上LabVIEW编译生成可执行程序

LabVIEW项目浏览器(Project Explorer)中的"Build Specifications"就是用来配置项目发布方法的。在"Build Specifications"右键菜单中选取"New",可以看到程序有几种不同的发布方法:Application(EXE)、Installer、.Net Inte…

DFS和BFS(c++)

TOC 深度优先遍历dfs Depth First Search, 简称 DFS图解链接: link对每一个分支路径深入到不能再深入为止二叉树的深度优先遍历特殊,分为先序遍历、中序遍历、后序遍历先序遍历,对任一子树,先访问根,然后左子树,最后…

C++第七弹 -- C/C++内存管理

目录 前言一. C/C内存分布二. C语言中动态内存管理方式三. C中动态内存管理四. operator new与operator delete函数五. new和delete的实现原理1.内置类型2. 自定义类型 六. 定位new表达式(placement-new)七. 常见面试题总结 前言 在C/C编程中,内存管理是至关重要的…

超详细Midjourney国际版注册使用全流程

众所周知,目前Midjourney AI绘画的国内版本有很多种,甚至微信、浏览器插件等都有,眼花缭乱,使用门槛低,无需特殊网络手段即可访问使用。 不过,根据一些用户的反馈,尽管国内的那些版本在注册和充…

软件测试——测试用例

工作职责: 1.负责产品系统测试,包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写,包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求: 1.熟练…

ng-container、‌ng-template 和 ng-content 区别

ng-container、‌ng-template 和 ng-content 都是 Angular 中用于处理和组织视图的工具,‌但它们各自具有不同的用途和行为。‌ ng-container:‌ 是一个虚拟的 HTML 容器,‌本身不会在最终渲染的 DOM 中创建任何实际的元素。‌它提供了一个包…

ref 和 reactive 区别

在Vue 3中,ref和reactive都是用于创建响应式数据的API,但它们之间存在一些关键的区别。以下是ref和reactive的主要区别: 1. 数据类型处理 ref:主要用于定义基本类型的数据(如字符串、数字、布尔值等)以及…

高阶面试-mongodb

mongodb的特点,为什么使用他 nosql数据库,前端到后端到数据库,都是json,无模式,数据模型发生变更,不需要强制更新表结构,可以快速实现需求迭代。 天生分布式,高可用,处…

人工智能与伦理挑战:多维度应对策略

人工智能技术近年来取得了迅猛发展,广泛应用于医疗诊断、金融分析、教育辅助、自动驾驶等各个领域,极大地提升了生产效率和服务质量,推动了科技进步和商业创新。然而,伴随其普及和应用的泛滥,AI也带来了数据隐私侵犯、…

C#知识|账号管理系统:添加账号的功能笔记

哈喽,你好啊,我是雷工! 本节记录账号管理系统中添加账号的逻辑过程,以下为学习笔记。 01 实现内容 ①:实现当点击【保存到数据库】按钮时,将账号名称、原创篇数、账号简介、账号类型显示的内容存储到LGAccountManagerDB数据库的Account表中; ②:实现点击【保存到数据库…

如何用Claude 3 Sonnet Artifacts实现对数据文件的可视化分析?

如何用Claude 3 Sonnet Artifacts实现对数据文件的可视化分析? Prompt模板: Initial Request: 初始请求: I have uploaded data of the number of Software Engineering Jobs in the US since May 2020. I need different visual creative…

【Memcached】一文详解 Memcached

1. Memcached 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,它主要用于缓存数据库调用、API调用或页面渲染的结果,以减少数据库负载,提升访问速度,特别是在处理高并发访问的场景下。 1.1 Memcached 的特点:…

实验二:图像灰度修正

目录 一、实验目的 二、实验原理 三、实验内容 四、源程序和结果 源程序(python): 结果: 五、结果分析 一、实验目的 掌握常用的图像灰度级修正方法,包括图象的线性和非线性灰度点运算和直方图均衡化法,加深对灰度直方图的理解。掌握对比度增强、直方图增强的原理,…

调整视频帧率、分辨率

v1.0 问题:人脸检测太灵敏了,导致当画面中出现多个人脸时,画面反复跳各个人脸,闪动严重 import cv2 import os from tqdm import tqdm # 进度条 import subprocess# 加载人脸检测模型 face_cascade cv2.CascadeClassifier(cv2.…

WebSocket实现群聊功能、房间隔离

引用WebSocket相关依赖 <dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version></dependency><dependency><groupId>org.springframework</grou…

kafka入坑

快速入门 使用 Strimzi 项目时&#xff0c;在 Kubernetes 上启动和运行 Apache Kafka 集群非常简单&#xff01; Kubernetes Kind 是一个 Kubernetes 集群&#xff0c;以单个 Docker 镜像的形式实现&#xff0c;并以容器的形式运行。它主要用于测试 Kubernetes 本身&#xff…

mac电脑pdf合并,macpdf合并成一个pdf

在数字化办公和学习的今天&#xff0c;pdf文件因其跨平台兼容性强、格式稳定而成为了最受欢迎的文档格式之一。但随之而来的问题也接踵而至&#xff0c;如何将多个pdf文件合并为一个&#xff1f;这不仅关系到文档的整洁性&#xff0c;更是时间管理的重要环节。今天&#xff0c;…

股指期货如何交易?有哪些交易策略和操作技巧?

股指期货交易提供了多种策略和技巧&#xff0c;以适应不同的市场情况和投资者需求。以下是对股指期货交易的一些基本策略和操作技巧的介绍。 1.卖出股指期货套期保值 对于那些已经持有或预计将持有股票的投资者&#xff0c;如果对未来市场走势不确定或预期市场将下跌&#xf…