IO字节流字符流个人感悟

java中IO

流是一种抽象的概念,将不同的输入输出源通过流的形式进行输入输出操作,在程序中是指数据的转移方式。
java中对I/O使用蛮多的,java对流的分类按照不同的要求也分为几种
按照流的方向分为:输入流输出流
按照操作单元分为:字节流,字符流
按照角色分为: 节点流,处理流

个人习惯称呼为字节流字符流,字节流可以处理所有文件,字符流不能处理图片视频
所有以Stream为结尾的都是字节流,以reader和writer结尾的都是字符流

基本数据类型取值范围

范围由符号位(最高位)和数值位组成
(整形)
1、byte的取值范围是 -128~127,占一个字节,1byte=8bit 即 -2的七次方到+2的7次方-1,why? 考虑下符号位。
2、short的取值范围是 -32768~32767 占两个字节,1short=2byte=16bit 即-2的15次方到+2的15次方-1。
3、int的取值范围为(-2147483648~2147483647),占用4个字节,即1Int4byte=32bit (-2的31次方到2的31次方-1)。
4、long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字 节,1long=8byte=32bit(-2的63次方到2的63次方-1)。long类型的数据较大,记得在后面加L。

(浮点型)
1、float 一个float占4个字节32位,分为三部分:符号位,指数位,尾数位。
符号位(S):1bit 指数位(E):8bit 尾数位(M):23bit
(1).符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负。
(2).指数位(E):23-30位共8位为指数位,这里指数的底数规定为2(取值范围:0——255)。这一部分的最终 结果格式为:2E−1272E−127,即范围-127——128。另外,标准中,还规定了,当指数位8位全0或全1的时 候,浮点数为非正规形式(这个时候尾数不一样了),所以指数位真正范围为:-126~127。
(3).尾数位(M):0-22位共23位为尾数位,表示小数部分的尾数,即形式为1.M或0.M,至于什么时候是1,什么时候是0,则由指数和尾数共同决定。 小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值。

2、double 1.797693e+308~ 4.9000000e-324 占用8个字节
double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,可以在数据后面加上“F”。

3、(boolean 布尔型)
这个类型只有两个值,true和false(真和非真)

4、(char 文本型)
用于存放字符的数据类型,占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容,字符的存储范围在\u0000~\uFFFF,在定义字符型的数据时候要注意加’ '。

字节、字符、位

先介绍字节与位
1、bit(位)1bit=1位 在二进制中表示0或者1,程序中最小的储存计量单位。
2、byte(字节)1byte=8bit 一个字节等于八位,相当于8个0或者1。
3、在英文中一个英文字母等于一个字节即占8位。
4、一个汉字占两个字节,即2byte=16bit占16位。

字符
1、Java采用unicode来表示字符,java中的一个char是2个字节,一个中文或英文字符的unicode编码都占2个 字节,但如果采用其他编码方式,一个字符占用的字节数则各不相同。
2、在 GB 2312 编码或 GBK 编码中,一个英文字母字符存储需要1个字节,一个汉子字符存储需要2个字节。
3、在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。
4、在UTF-16编码中,一个英文字母字符存储需要2个字节,一个汉字字符储存需要3到4个字节(Unicode扩展区的一些汉字存储需要4个字节)。
5、在UTF-32编码中,世界上任何字符的存储都需要4个字节。

字节流

字节流处理单元为1个字节,操作字节和字节数组,字节流直接操作文件,使用字节流可以不用关闭,除了带缓冲的。
InputStream、OutputStream是所有字节流的父类。写一个简单的小案例,向txt文件里面写入数据。代码如下:

package day01;

import java.io.*;
/*
*相对于程序而言,txt文件是在磁盘中,要往文件中写入数据,则程序是输出的。
*/

public class Test {
    public static void main(String[] args) throws IOException {
        File file=new File("test.txt");
        OutputStream out=new FileOutputStream(file);//如果该文件不存在则创建
        String str="Hello World";
        byte[]b=str.getBytes();//你要知道字节流是操作字节的
        out.write(b);//写入文件
    }
}

字符流

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流的操作比字节流操作好在一点,就是可以直接输出字符串了。
字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好,如果是关系到中文(文本)的,用字符流好点。
Reader和Writer是字符流的超类,再举一个相同功能的例子:

package day01;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class WriterDemo {
    public static void main(String[] args) throws IOException {
        File file=new File("test1.txt");
        Writer w= new FileWriter(file);
        String str="你好HELLOworld 小丁的";
        w.write(str);
        w.close();//记得要关

    }
}

补充

字节流是直接对磁盘文件操作
字符流需要通过缓存再添加到文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值