java 字节输入流_JavaIO流(一)-字节输入流与字符输入流

IO流详解

一、输入流

字节输入流

FileInputSteam

1、构造方法:public FileInputStream(File file) {}

public FileInputStream(FileDescriptor fdObj){}

public FileInputStream(String name){}

2、read方法:// 每次读取一个字节

public int read(){}

// 读取b.length个字节到byte数组中

public int read(byte b[]){}

// 从输入流中读取len个字节到字节数组中

public int read(byte b[], int off, int len){}

3、文件读取:

1、read()每次读取一个字节数据,返回字节数,如果到达文件末尾,返回-1。

文本abcpublic static void method_01(String filePath) throws IOException {

FileInputStream inputStream = null;

try {

inputStream = new FileInputStream(filePath);

// 每次读取一个字节

for (int i = 0; i < 4; i++) {

int read = inputStream.read();

System.out.println(read);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} finally {

if (null != inputStream) {

// 关闭IO流

inputStream.close();

}

}

}

执行结果:97

98

99

-1

从执行结果可以看出,前三次读取到了数据,返回了对应的ASCII码,当读取到文件末尾的时候,则返回-1。

2、read(byte[] b)读入缓冲区的字节总数,如果到达文件末尾,则返回-1。

文本:abcdefg

声明一个大于真实数据的byte数组读取数据。public static void method_02(String filePath) throws IOException {

FileInputStream inputStream = null;

try {

inputStream = new FileInputStream(filePath);

// 声明的长度大于真实数据长度

byte[] bytes = new byte[20];

int length = inputStream.read(bytes);

System.out.println("字节数组长度:" + bytes.length + " 读取到的数据字节长度:" + length);

for (byte b : bytes) {

System.out.print(b + " | ");

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} finally {

if (null != inputStream) {

inputStream.close();

}

}

}

执行结果:字节数组长度:20 读取到的数据字节长度:7

97 | 98 | 99 | 100 | 101 | 102 | 103 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

可以看出,当我们byte数组的长度大于字节数组的真实长度之后,那么后面的空间全部使用0做补位,这也恰恰反映了另外一个问题,我们在使用byte[]数组读取文件的时候,千万不要说我设置足够大的长度,就可以高枕无忧提高读取效率,如果遇到小文件,那么也是很容易造成效率低下的。

3、read(byte b[], int off, int len)读入缓冲区的字节总数,如果读取到文件末尾,则返回-1;

文本:abcdefg

声明一个固定大小的byte数组,循环读取数据

我们的文本有七个字节,声明了一个2个长度的数组,应该循环四次,第五次读取的时候返回-1。public static void method_03(String filePath) throws IOException {

FileInputStream inputStream = null;

try {

inputStream = new FileInputStream(filePath);

// 声明2个长度

byte[] bytes = new byte[2];

int i = 0;

while (i < 5) {

int length = inputStream.read(bytes, 0, bytes.length);

System.out.println("第" + (i + 1) + "次读取,length: " + length);

System.out.println("开始输出:");

for (int j = 0; j < length; j++) {

System.out.print(bytes[j] + " | ");

}

System.out.println();

i++;

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} finally {

if (null != inputStream) {

inputStream.close();

}

}

}

执行结果:第1次读取,length: 2

开始输出:

97 | 98 |

第2次读取,length: 2

开始输出:

99 | 100 |

第3次读取,length: 2

开始输出:

101 | 102 |

第4次读取,length: 1

开始输出:

103 |

第5次读取,length: -1

开始输出:

注意:

可能有的朋友会遇到我之前遇到的问题,他的文本里面写了汉字或者标点符号,会出现乱码,我们给文本最后再追加一个中文,并且把每次读取到的byte数组转换成String进行输出,看会出现什么情况。public static void method_03(String filePath) throws IOException {

FileInputStream inputStream = null;

try {

inputStream = new FileInputStream(filePath);

byte[] bytes = new byte[2];

int i = 0;

while (i < 5) {

inputStream.read(bytes, 0, bytes.length);

// 将byte[]转换成string

String s = new String(bytes, StandardCharsets.UTF_8);

System.out.println(s);

i++;

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} finally {

if (null != inputStream) {

inputStream.close();

}

}

}

结果:ab

cd

ef

g�

��

刚开始脑子抽了,感觉这是什么问题,怎么会乱码呢,如果稍微上点心的都会发现,中文占3个byte字节,你用2个存储那铁定乱码呀。那么你肯定想过那我把数组声明大一点不就好了,如果你这么想过,那你可能还不知道社会的险恶。

那么到底怎么办呢?真的就没办法了吗?接下来我们用一个例子来学习如何解决这种问题。

一个🌰:将文本中的内容读取出来,输出到控制台。

既然我们知道,上面的乱码是因为英文和中文占用的字节数不同引起的,那我们要是知道了整个文件占用的字节长度,那么不就一次性可以读取出来了。恰好FileInputStream提供了这样一个方法(available),让我们可以获取到整个文件所占用的字节数。public static void printConsole(String filePath) throws IOException {

FileInputStream inputStream = null;

try {

inputStream = new FileInputStream(filePath);

// 获取到整个文本占用的整个字节数

int available = inputStream.available();

// 声明数组

byte[] bytes = new byte[available];

// 读取数据

int readLength = inputStream.read(bytes, 0, available);

String s = new String(bytes, StandardCharsets.UTF_8);

System.out.println("读取到的长度:" + readLength + " available:" + available);

System.out.println("读取到的内容: " + s);

} catch (FileNotFoundException e) {

e.printStackTrace();

} finally {

if (null != inputStream) {

inputStream.close();

}

}

}

结果:读取到的长度:30 available:30

读取到的内容: abcdef一个程序员的成长

这样的话,我们就可以读取到文本中完整的内容了。只有了解了这些,那么才会了解我们的写文件下载的时候为什么要判断 读取到的字节数 !=-1 这样的操作,不然真的很难记住。

字符输入流

FileReader

1、构造方法:public FileReader(String fileName){};

public FileReader(File file){};

public FileReader(FileDescriptor fd){};

2、read方法:public int read(){};

public int read(char cbuf[], int offset, int length){};

public int read(char cbuf[]){};

3、文件读取:

FileReader的read方法读取出来的是一个独立的字符(char),所以面对英文和中文的混合,我们不会因为占用字节的不同从而导致出现乱码的情况。

文本:abcdef一个程序员的成长

读取内容的代码:public static void method_01(String filePath) throws IOException {

FileReader fr = null;

try {

fr = new FileReader(filePath);

int c;

// 每次读取一个字符,等于-1即表示文件读取到末尾

while ((c = fr.read()) != -1) {

System.out.println((char) c);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} finally {

if (null != fr) {

fr.close();

}

}

结果:a

b

c

d

e

f

根据结果可以看出,read()读取出来的每次就是一个单独的字符,那么另外两个read方法跟字节流读取都是一样的。

更多内容请关注微信公众号:

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

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

相关文章

python散点矩阵图_用python-pandas作图矩阵

本文为一篇翻译文章&#xff0c;来自于Visualize Machine Learning Data in Python With Pandas - Machine Learning Mastery**&#xff0c;原文标题是Visualize Machine Learning Data in Python With Pandas(在Python里使用pandas对机器学习的数据进行可视化分析)&#xff0c…

Java哪些是线程安全的_Java集合中那些类是线程安全的

线程安全类在集合框架中&#xff0c;有些类是线程安全的&#xff0c;这些都是jdk1.1中的出现的。在jdk1.2之后&#xff0c;就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类&#xff1a;vector&#xff1a;就比arraylist多了个同步化机制(线程安全)&#xff0c;因…

python求斐波那契数列第n个数及前n项和_使用python求斐波那契数列中第n个数的值示例代码...

使用python求斐波那契数列中第n个数的值示例代码,数列,递归,方法,兔子,个数使用python求斐波那契数列中第n个数的值示例代码易采站长站&#xff0c;站长之家为您整理了使用python求斐波那契数列中第n个数的值示例代码的相关内容。斐波那契数列(Fibonacci sequence)&#xff0c;…

java org.apache.http_org.apache.http jar包下载-org.apache.http.jar包下载 --pc6下载站

org.apache.http.jar包是一款十分常用的jar包如果没有org.apache.http.jar包Apache与http的链接将会出现错误等现象马上下载org.apache.http.jar包。。相关软件软件大小版本说明下载地址org.apache.http.jar包是一款十分常用的jar包,如果没有org.apache.http.jar包,Apache与htt…

网络连接异常、网站服务器失去响应_网站常见故障解决办法

网站在运行过程中&#xff0c;常常遇到各种服务器问题&#xff0c;虽然有服务器厂商的维护&#xff0c;但是往往耗时耗工小编对常见的服务器问题&#xff0c;进行了归纳整理&#xff0c;下面跟各位分享一下。常见故障分析一、恶意攻击在我平时管理网站时&#xff0c;可能会遭到…

java编程能做什么_学习Java编程能做什么工作?

Java作为编程语言界最时髦流行的元老之一&#xff0c;现今在软件市场上也是宠儿&#xff0c;被各大企业广泛应用到生产中。在各种行业、各个企业的业务管理平台&#xff0c;如门户网站等许多方面都占据了主导地位。吸引着越来越多学习Java的各个不同年龄阶段的人群。学习Java的…

python如何关闭窗口仍能运行_Python在退出时关闭自己的CMD shell窗口

让我们首先分析两个发布的Python脚本行在执行Python脚本时真正做了些什么。感谢eryksun进行深入调查&#xff0c;真正使用Python导致正确的描述&#xff0c;现在可以在下面阅读。os.system()导致在前台使用控制台窗口执行cmd.exe /C并停止执行Python脚本&#xff0c;直到Window…

java一年包装_java回顾之包装类

Java包装类由于基本类型比如int,char不具有支持面向对象的编程机制&#xff0c;比如所有引用类型的变量都继承与Object&#xff0c;都可以当成Object使用&#xff0c;如果有个方法需要Object类型的参数&#xff0c;但是实际需要的值却是2,3等数值&#xff0c;这就比较难处理所以…

python3 sleep 并发_python异步编程之asyncio(百万并发)

点击上方蓝字关注我们目录[python 异步编程之 asyncio(百万并发)]一、asyncio二、aiohttp前言&#xff1a;python 由于 GIL(全局锁)的存在&#xff0c;不能发挥多核的优势&#xff0c;其性能一直饱受诟病。然而在 IO 密集型的网络编程里&#xff0c;异步处理比同步处理能提升成…

【Spring实战】02 配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍&#xff0c;我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中&#xff0c;…

java getxxx_java的invoke与getMethod方法用法

和listener一起使用举例&#xff1a;需要在控件中监听某个动作&#xff1a;比如button点击&#xff0c;画面滚动等1.为控件定义一个属性&#xff1a;属性绑定一个方法xxxProperty "onPropertyXxxxFunc”2.首先自定义一个Listener// 在控件构造函数中获得控件属性的值xxxPr…

windows查看usb信息命令_【VPS】Linux VPS查看系统信息命令大全

本文转自老左笔记&#xff0c;自用mark系统# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加…

c++ 向量的值逆序输出_C++中vector的常用方法

前言在C中&#xff0c;vector是一个商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。十分有用的容器。它能像容器一样存放各种类型的对象&#xff0c;简单来说&#xff0c;vector是一个能够存放任意类型的动态数组&#xff0c;能够增加和压缩数据。相较链表而言&…

java生成密码_java生成密码生成 | 学步园

一、根据当前日期生成MD5加密密码package com.test;import java.security.MessageDigest;import java.text.SimpleDateFormat;import java.util.Date;public class Md5Test {public void toMD5(String plainText) {try {//生成实现指定摘要原文链接&#xff1a;http://www.cnbl…

python怎么创建一个二维数组_python 创建二维数组的方法

废话不多说&#xff0c;直接上代码&#xff1a;#codingutf-8def two_di_demo1():a[]for i in range(10):a.append([])for j in range(10):a[i].append(0)print(a)def two_di_demo2():a[]for i in range(10):a.append([])for j in range(10):a[i].append(0)print(a)b [[0] * 10…

java导出excel到本地_POI导出Excel----导出到客户端(本地)

contentType"application/vnd.ms-excel;charsetutf-8"pageEncoding"utf-8"%>//导入要用的包import"org.apache.poi.hssf.usermodel.HSSFWorkbook"%>import"java.io.FileOutputStream"%>import"org.apache.poi.hssf.user…

无法初始化sftp协议。主机是sftp服务器吗?_WinSCP v5.15.3 免费的 开源图形化 SFTP 客户端...

WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件&#xff0c;并且可以直接编辑文件。主要功能WinSCP 可以执行所有基本的文件操作&#xff0c;例如下载和上传。同时允许为文件和目录重…

java中组合_java中组合模式详解和使用方法

组合模式(Composite Pattern)&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#xff0c;它创建了对象组的树形结构。这种模式创…

道客巴巴vip账号共享2020_腾讯视频VIP怎么两个手机通用?

理论上来说&#xff0c;腾讯视频VIP可以同时在3个设备上登录&#xff0c;但只能在2个设备上同时播放视频。这也就意味着&#xff0c;腾讯视频VIP可以在两个手机上同时使用。腾讯视频VIP基本可以分为微信区、QQ区&#xff0c;两者并不互通。近期腾讯视频手机端修改了登录规则&am…

python3示例_Python3 实例(七)

原标题&#xff1a;Python3 实例(七)Python 将字符串的时间转换为时间戳给定一个字符串的时间&#xff0c;将其转换为时间戳。实例import timea1 "2019-5-10 23:40:00"# 先转换为时间数组timeArray time.strptime(a1, "%Y-%m-%d %H:%M:%S")# 转换为时间戳…