java-FileOutputStream类的read方法返回值

问题描述

FileOutputStream类的read方法返回值

FileInputStream in=new FileInputStream("F:/Test.txt");
FileOutputStream out=new FileOutputStream("G:/Test.txt");
int b;

    while((b=in.read())!=-1){
        out.write(b);
        System.out.println(b);
    }
    in.close();
    out.close();

以上代码输出
206
210
202
199
186
195
200
203

b不应该是每次读取到的byte个数且为1吗?
对于这段代码中out.write(b)如何理解?说明文档中解释的是将指定字节写入此文件输出流,
为何b会输出上述数值?

解决方案

首先,InputStream和OutputStream是基于字节的文件操作类,写入和读取的都是一个字节的数据。
其次,write操作是写入一个字节的数据,这个数据就是你给的那个int类型的值,它最后以字节为单位,本质就是8个01串写入文件中。
因为文件的本质就是01二进制串,只不过不同的文本编辑器以不同的编码方式解码后呈现给我们的才是可阅读的文本。
你的问题中,write(b)就是将b这个int类型的数值转换成二进制数据写入文件中的,read操作就是每次读取一个字节的01二进制串,然后将其转换为0到255范围内的int类型返回,也就是write写入的那个数。
read的api是这样的:

 Reads a byte of data from this file. The byte is returned as an integer in the range 0 to 255 ({@code 0x00-0x0ff}).

解决方案二:

你给出的代码中的read的值就是对应你文件的每一个字节的二进制序列,本质就是你这个文件的内容。
但是这些是我们看不懂的,而你的文件直接呈现的内容是可阅读的文本,这中间就是文本编辑器作了一个映射,将一堆的01二进制序列翻译成对应的字符。

时间: 2024-09-01 14:53:41

java-FileOutputStream类的read方法返回值的相关文章

java反射机制 getreturntype是如何知道方法返回值类型的

问题描述 java反射机制 getreturntype是如何知道方法返回值类型的 各位大神,小弟有一事不明 我们有一个变量,就是方法名 java反射机制 getReturnType()是如何知道我要定义的这个方法的返回值类型. 它怎么知道我要的这个方法应该返回什么值?? 解决方案 java编译后的.class文件里面记录了类的全部信息,包括方法的返回值.参数.异常等.程序运行时,.class文件会被加载到运行时数据区,java反射 机制就是从类型信息中获取装载类解析后的详细信息的. 解决方案二:

Java调用MySQL存储过程并获得返回值的方法_java

本文实例讲述了Java调用MySQL存储过程并获得返回值的方法.分享给大家供大家参考.具体如下: private void empsInDept(Connection myConnect, int deptId) throws SQLException { CallableStatement cStmt = myConnect.prepareCall("{CALL sp_emps_in_dept(?)}"); cStmt.setInt(1, deptId); cStmt.execute

Java线程:新特征-有返回值的线程

在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口. 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了. 下面是个很简单的例子: import java.util.concurrent.*

Object转Integer类型失败,转Long型可以,方法返回值为1,并没有超过两个类型的范围

问题描述 Object转Integer类型失败,转Long型可以,方法返回值为1,并没有超过两个类型的范围 在网上找的尚硅谷的教学视频 其中有添加权限一段 String hql="select count(*) from Right r where r.rightUrl=?"; //此处不能用integer只能Long Long count=(Long) this.uniqueResult(hql, url); System.out.println(count); 下面是uniqueR

【SpringMVC整合MyBatis】RequestMapping注解与controller方法返回值

我们讲解一下之前用的@RequestMapping注解和controller方法返回值 一.@RequestMapping注解作用 1.url映射 定义controller方法对应的url,进行处理器映射使用. //商品查询列表 //@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url //一般建议将url和方法写成一样 @RequestMapping("/queryItems") public ModelAndView queryIt

Struts2拦截器---intercept()方法返回值

问题描述 Struts2拦截器---intercept()方法返回值 Struts2拦截器方面的intercept()方法的返回值有什么用?

java rmi 时间过长没返回值

问题描述 java rmi 时间过长没返回值 编写的服务端在linux系统下运行,当服务端运行时间超过10分钟,那么客户端就不能获取服务端运行结束的结果, 客户端一直挂起,而如果服务端运行时间在10分钟内,那么客户端可以接收到服务端运行的结果.各位大神,这个问题怎么解决啊?急!!! 服务端代码部分: public static void main(String[] args) { GetProperties gp = new GetProperties(); String url = gp.ge

c++ atl-Atl引用时,方法返回值问题。

问题描述 Atl引用时,方法返回值问题. 自编写的Atl控件,在MFC对话框或C#中直接引用,自定义所有方法的返回值由HRESULT变为void型,怎样修改可以避免返回值类型任意修改. Atl控件的返回值如: HRESULT FT_StartRefresh(); 引用后方法变为: void FT_StartRefresh();

nhibernate 联接mysql 适用save方法 返回值错误

问题描述 取出来的new_qst_model_id为上一次添加的选项id而不是新增的qst_model的id 解决方案 解决方案二:应该这样写才对:创建一个新的实体,可以调用session对象的Save方法持久化到数据库:varnewProductId=(int)session.Save(newProduct);注意Save方法返回新生成记录的ID.因为有不同的策略生成ID(int,long或GUID),所以返回类型为object类型,我们必须转换结果到预期的类型.我们还可以访问刚刚持久化的实体