JAVA IO (长期更新)

1.OutputStream 类

1.1 void write(int b) 方法
本来应该是接受一个无符号的1个字节的整数(0-255).
接受 Int型数据,但是java内部其实会将b 转换成0-255之间的数字,原因是Stream是以字节为读取单位的. 具体规则如下: b=b& 0x000000FF
然后将结果看做是无符号1字节整型处理。Java内部用补码来表示正数和负数。
首先针对正数来说:正数的补码是他本身。故直接截取后8位,当做无符号二进制整数处理即可。
针对负数来说:Java中用补码来表示负数。所以举个例子 :-130 :将-130的绝对值表示成4个字节的有符号类型 0000 0000 0000 0000 0000 0000 1000 0010 ,然后取反码加一 得:
1111 1111 1111 1111 1111 1111 0111 1110 ,然后截取后八位,便是126.
write()方法仅仅是传送一个位模式 ,但是这个位模式如何解释,例如可以将他对应到ascii码中,然后打印出来,这个取决于OutputStream的子类处理,举个例子,如果使用System.out ,那么就是将这个位模式就解释成ascii码,对于无法打印出来的ascii码,java会输出乱码

    public static void main(String[] args) throws Exception{
        System.out.write(-130);
        System.out.flush();
    }
    //输出结果为~ ,表示的是ascii码中的126对应的字符

1.2 write(byte[] data) throws IOException
write(byte[] data ,int offset,int length) throws IOException
显然这里使用byte表示一个字节,但是和write(int b) 方法类似,希望接受无符号1字节整数,所以java内部也会将byte转换成无符号类型, 具体的公式如下:
int unsignedByte = signedByte >= 0 ? signedByte : 256 + signedByte;
突然发现对于Java来说,虽然只有简单的集中primitive 数据类型,但是内部还是要进行一系列的转换。

  1. dataoutputStream和datainputstream
    2.1 write integer
    void writeByte(int b);
    void writeShort(int s);
    void writeInt(int i);
    void writeLong(long l);
    首先需要搞明白从int转换成byte,和short的原理,
    当int转换成byte时, 首先令
int byteValue;
int temp = intValue % 256;
if ( intValue < 0) {
byteValue = temp < -128 ? 256 + temp : temp;
}e
lse {
byteValue = temp > 127 ? temp - 256 : temp;
}

首先先模256,相当于取低8位,但是,注意如果intValue是负数,先取绝对值,然后模256,然后加上负号,因此结果在-255~255之间,判断余数是否在-128~127之间,如果不在此区间,然后想个办法映射到此区间
byteValue = temp < -128 ? 256 + temp : temp;
byteValue = temp > 127 ? temp - 256 : temp;
注意这个和outputSteam中的write(int b) 中处理b的方法不大一样,如果b不在0~255之间,那么是取后8位,注意这里是没有符号的,原因就是处理的就是无符号单字节。这里讲int转换成byte,是转换成有符号单字节。
因此

void writeByte(int b);
void writeShort(int s);
void writeInt(int i); 

这三个方法首先将int转变成byte,short,int,然后使用two’complement ,big-endian 转变成二进制。如果写入到文件,注意是二进制文件,直接用文本编辑器打开是不会显示相应的数字的,而是16进制的表示。

2.2 Strings 和 chars
2.2.1 write

public final void writeChar(int c) throwsIOException
public final void writeChars(String s) throws IOException
public final void writeBytes(String s) throws IOException
public final void writeUTF(String s) throws IOException 

第一个方法,将c转变成无符号二字节,进行写操作.
第二个方法逐个读取字符,转换成无符号二字节,进行写操作。
第三个方法逐个读取字符,转换成无符号单字节,进行写操作。
第四个方法逐个读取字节,转换成无符号二字节,然后转换使用UTF-8进行编码,比如汉字,可能编码成3个字节
2.2.2 read (这些方法不好)
尽量不要使用datainputStream读取文本,比如读取字符,或者字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值