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

相关文章

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节