java中的IO流读取文件
1 InputStream类和OutputStream类
InputStream.read()方法从文件中读取一个字节(0-255),然后将此字节转换成对应的整数返回。假设一个文件的编码为utf-8编码,里面只有一个1,如图:
那么,InputStream.read将读取1在文件中的16进制表示,即31h,转换成整数就是49。
如果,文件中存储的是中文"春节",如图:
中文"春节"的utf-8编码的16进制表示就是E6 98 A5 E8 8A 82。这是InputStream.read()方法将依次读入这些字节,这些字节转换成整数就是:-26, -104, -91, -24, -118, -126。
OutputStream.write(int)刚好相反,将字节写入文件中,比如:
out.write(49)
此时,文件中对应的16进制将显示31h,也就是字符'1',如图:
2 DataInputStream和DataOutputStream
这两个总是配对使用,DataOutputStream将java的基本类型在内存中的表示原封不动的写入文件,整数49在内存中的表示为00000031h,总共32位,那么执行完DataOutputStream.writeInt(49),文件中的内容为:
3个00字节被解码为Null,31h被解码为1,因为字符'1'的编码就是31h。注意这和OutputStream.write(49)的不同,OutputStream只是将49在内存中的最低一个字节,即31h写入了文件,而DataInputStream.writeInt却将49在内存中的整形表示原封不动的写到了文件之中。
3 Reader类和Writer类
Reader类的Reader.readLine方法的流程大致如下,从文件中读入一行字符的编码字节,如果读入的时候没有指定相应的字符集,那么,这些读入的字节按照平台的默认编码字符集(即java.nio.charset.Charset.defaultCharset()得到的编码)解码,得到相应的字符串。假设文件的编码方式是utf-8,存储中文字符"春节":
那么,java首先读入这些字节,再用相应的字符集或者默认的字符集解码这些字节,如果解码的字符集和文件的字符集不一致,将得到乱码。解决的办法,读入的时候指定相应的与文件编码一致的字符集解码:
InputStreamReader in = new InputStreamReader(new FileInputStream(fileName), "utf-8"); BufferedReader buf = new BufferedReader(in);
Writer类写入的时候也一样,首先,根据指定的字符集或者默认的字符集将要写入的字符串编码为字节,然后,将这些字节写入到文件当中。同样,如果编码字符集与解码字符集不一致,同样出现乱码。解决的办法同样是在写入的时候,指定与文件一直的字符集编码:
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "utf-8"));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了