InputStream字节输入流和OutStream字节输出流

2024-03-28 22:04

本文主要是介绍InputStream字节输入流和OutStream字节输出流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

InputStream

InputStream是Java标准库最基本的输入流,在java.io包内。它是一个抽象类

FileInputStream:从文件中读取数据,是最终数据源。

int read()方法:读取输入流的下一个字节,并返回字节表示的int值(0~255).如果已读到末尾,返回-1表示不能继续读取了。

不同方式读取文件的输入流 

package study1;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;public class Demo03 {public static void main(String[] args) {// 创建一个基于读取文件方式的输入流try (FileInputStream in = new FileInputStream("F:\\Test\\Use\\yuan.jpg");){			//方式1:每次读取1个字节数据,读取至末尾时,返回-1
//			int data1 = in.read();
//			int data2 = in.read();
//			int data3 = in.read();
//			System.out.println(data1);
//			System.out.println(data2);
//			System.out.println(data3);
//			//通过循环,读取所有字节数据
//			int data = -1;
//			while((data = in.read()) != -1) {
//				System.out.println(data);
//			}//方式2:
//			byte[] buff = new byte[256];
//			int len = in.read(buff);
//			System.out.println("本次读取到的内容:"+Arrays.toString(buff));
//			System.out.println("本次读取到的长度:"+len);byte[] buff = new byte[128];int len = 0;while((len = in.read(buff)) > 0) {System.out.printf("本次读取到%d个字节:%s\n",len,Arrays.toString(buff));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

运行结果: 

 OutputStream

OutputStream是Java标准库提供的用于写入操作的基础输出流。(抽象类)

void write(int b):写入一个字节到输出流。(虽然传入的是int参数,但只会写入一个字节,即只写入int最低8位表示字节的部分)

package study1;import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;public class Demo04 {public static void main(String[] args) {try {// 读取到一张图片的字节数据byte[] imgData = Files.readAllBytes(Paths.get("F:\\Test\\IOUse\\yuan.jpg"));// 创建文件输出流try(FileOutputStream out = new FileOutputStream("F:\\Test\\IOUse\\yi.jpg")){out.write(imgData);}} catch (IOException e) {e.printStackTrace();}}
}

运行结果: 

边读边写

FileInputStream和FileOutputStream

package study1;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo05 {public static void main(String[] args) {try (FileInputStream in = new FileInputStream("F:\\Test\\IOUse\\yuan.jpg");FileOutputStream out = new FileOutputStream("F:\\Test\\IOUse\\ming.jpg");){byte[] buff = new byte[128];int len = 0;while((len = in.read(buff)) > 0) {out.write(buff,0,len);}} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}
}

运行结果:

read不同用法区别

FileInputStream fis = new FileInputStream();

fis.read();//文件输入流:每次read()方法,都会产生磁盘的读取
BufferedInputStream in =new BufferedInputStream();
in.read();//每次read()方法,先在缓冲区读取,如果缓冲区读取完毕,则统一访问磁盘,进行内容填充

package study1;import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;public class Demo06 {public static void main(String[] args) {
//		FileInputStream fis = new FileInputStream();
//		fis.read();//文件输入流:每次read()方法,都会产生磁盘的读取
//		BufferedInputStream in =new BufferedInputStream();
//		in.read();//每次read()方法,先在缓冲区读取,如果缓冲区读取完毕,则统一访问磁盘,进行内容填充try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("F:\\Test\\IOUse\\yuan.jpg"))){byte[] buff = new byte[128];int len = 0;
//			//每次read()方法的调用,都会从BufferedInputStream缓冲区进行读取//每次读取“最多”128个字节while((len = in .read(buff)) > 0) {System.out.println(Arrays.toString(buff));}} catch (IOException e) {e.printStackTrace();}}
}

 运行结果:

  BufferedInputStream和BufferedOutputStream 

 BufferedInputStream:缓冲输入流,为另一个输入流添加一些和功能(本质是通过内部缓冲区数组实现的)。使缓冲区提高文件的读取

BufferedOutputStream:可以使用缓冲区对文件进行写入操作

package study1;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo07 {public static void main(String[] args) {try {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:\\Test\\IOUse\\yuan.jpg"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\Test\\IOUse\\haha.jpg"));byte[] buff = new byte[2048];int len = 0;while((len = bis.read(buff)) > 0) {bos.write(buff, 0, len);}} catch (IOException e) {e.printStackTrace();}}
}

运行结果:

读取网络照片到本地磁盘 

package study1;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;public class Demo08 {public static void main(String[] args) {String imageUrl = "https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F0315%2Fbc0c9ab1j00sae5710193d001g800lom.jpg&thumbnail=660x2147483647&quality=80&type=jpg";try {URL url = new URL(imageUrl);try(InputStream in = url.openConnection().getInputStream();BufferedInputStream bis = new BufferedInputStream(in);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\Test\\IOUse\\king.jpg"))){byte[] buff = new byte[1024];int len = 0;while((len = bis.read(buff)) > 0) {bos.write(buff,0,len);}}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

运行结果:

 缓冲区字符输入流BufferedReader

BufferedReader类主要从字符输入流中读取字符存入缓存区,在后面读取直接可以从缓冲区读取,不需要每次都从数据源读取并进行字符编码转换,从而提高了字符读取的效率。

package study1;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class Demo09 {public static void main(String[] args) {//缓冲区字符输入流try (BufferedReader reader = new BufferedReader(new FileReader("F:\\Test\\IOUse\\README.md"))) {String line = null;while((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

运行结果:

 

读取网页的代码

package study1;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;public class Demo10 {public static void main(String[] args) {try (//字节输入InputStream in = new URL("https://www.163.com/").openConnection().getInputStream();//字符输入流(转换流)InputStreamReader reader = new InputStreamReader(in,"utf-8");//缓冲字符输入流BufferedReader br = new BufferedReader(reader);) {String line = null;while((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

运行结果: 

执行ipconfig命令,并获取执行结果

package study1;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class Demo11 {public static void main(String[] args) {//执行ipconfig命令,并获取执行结果//创建Runtime对象,用于执行命令Runtime runtime = Runtime.getRuntime();try {// 执行Process process = runtime.exec("ipconfig");// 获取执行结果(输入流)try(InputStream in = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));){String line = null;while((line = reader.readLine()) != null) {System.out.println(line);}}} catch (IOException e) {e.printStackTrace();}}
}

执行结果: 

  缓冲区字符输出流BufferedWriter 

BufferedWriter:将文本写入字符流,缓冲字符,以便有效的写入单个字符,数组和字符串。(可以指定缓冲区大小,或者可以接受默认大小)

 写入文本文件SNxx(SN1000~SN1078)

package study1;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class Demo12 {public static void main(String[] args) {try (BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\Test\\IOUse\\SN.txt",true));){for(int i = 1000;i <= 1078; i++) {String code = String.format("SN%d", i);bw.write(code); // 写入文本文件bw.newLine(); // 换行}} catch (IOException e) {e.printStackTrace();}}
}

运行结果: 

写入ping www.163.com

补充:

在Java中,Tiemr类是用于调度后台任务的工具。它允许安排一个任务在将来的某个时间点运行,也可以按照某个固定的时间间隔重复运行任务

package study1;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalTime;
import java.util.Timer;
import java.util.TimerTask;public class Demo13 {public static void main(String[] args) {System.out.printf("%s心跳检查程序启动......\n",LocalTime.now());Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {Runtime runtime = Runtime.getRuntime();try {Process process = runtime.exec("ping www.163.com");try(BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\Test\\IoUse\\log.txt",true));){String line = null;while((line = br.readLine()) != null) {bw.write(line);bw.newLine();}}} catch (IOException e) {e.printStackTrace();}}}, 1000, 2000);}
}

运行结果:

这篇关于InputStream字节输入流和OutStream字节输出流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/856814

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

当你输入一个网址后都发生什么

原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/  作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

LibSVM学习(五)——分界线的输出

对于学习SVM人来说,要判断SVM效果,以图形的方式输出的分解线是最直观的。LibSVM自带了一个可视化的程序svm-toy,用来输出类之间的分界线。他是先把样本文件载入,然后进行训练,通过对每个像素点的坐标进行判断,看属于哪一类,就附上那类的颜色,从而使类与类之间形成分割线。我们这一节不讨论svm-toy怎么使用,因为这个是“傻瓜”式的,没什么好讨论的。这一节我们主要探讨怎么结合训练结果文件