文件编码和RandomAccessFile文件流的使用--IO学习笔记(一)
文件编码
UTF-8编码:中文占用3个字节,英文占用1个字节
GBK编码:中文占用2个字节,英文占用1个字节
UTF-16BE编码:中文占用2个字节,英文占用两个字节
注意:其中UTF-16BE编码是java的双字节编码采用的编码方式。Java里使用的是UTF-16BE 方式来存储数据的。eg:String 字符串就是采用UTF-16BE编码。
package com.test.test;/*** 使用三种编码方式打印同一个字符串,查看每种编码方式所占用字节多少的区别**/
public class Test {public static void main(String[] args) throws Exception{String s = "小灰灰ABC";encodeGBK(s);encodeUTF8(s);encodeUTF16BE(s);}/*** 使用GBK编码方式* @param s*/private static void encodeGBK(String s) {System.out.println("GBK编码:");// 将字符串转换成字节数组(默认采用的是项目设置的编码格式(我这里设置的是GBK)的转换的编码格式)byte[] byte1 = s.getBytes();for (byte b : byte1) {/** 1.toHexString()方法,把字节转换成了int类型并且以16进制的方式显示* 2.方法中把byte(字节)转换成了int类型* 3.&0xff的意思是只取最低的后8位:因为int类型占32位(4个字节)但是byte类型是占用8位(1个字节),* 所以将byte转换成int后,int类型前面的24位就会是0,所以可以使用&0xff只取后8位*/System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();}/*** 使用UTF-8编码方式* @param s*/private static void encodeUTF8(String s) throws Exception{System.out.println("UTF8编码:");// 将字符串转换成字节数组(默认采用的是项目设置的编码格式(我这里设置的是GBK)的转换的编码格式)byte[] byte1 = s.getBytes("utf-8");for (byte b : byte1) {System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();}/*** 使用UTF-16BE编码方式* @param s*/private static void encodeUTF16BE(String s) throws Exception{System.out.println("UTF16BE编码:");// 将字符串转换成字节数组(默认采用的是项目设置的编码格式(我这里设置的是GBK)的转换的编码格式)byte[] byte1 = s.getBytes("utf-16be");for (byte b : byte1) {System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();}}
结果截图:
从图中可以看出这三种编码方式的中英文所占用的字节数的差别。
注意:当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码。
eg:
package com.test.test;public class Test {public static void main(String[] args) throws Exception{String s = "小灰灰ABC";System.out.println("UTF8编码:");// 将字符串转换成字节数组(默认采用的是项目设置的编码格式(我这里设置的是GBK)的转换的编码格式)byte[] bytes = s.getBytes("utf-8");for (byte b : bytes) {System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();String str = new String(bytes);//这里使用的是项目设置的编码格式(我设置的是GBK编码)System.out.println(str);}}
结果截图:
这里可以知道如果想要出现原来的结果就必须采用原来的编码方式转换。
所以上边的构造字符串的代码应该修改为:
String str = new String(bytes,“utf-8”);
就会出现正确的结果:
RandomAccessFile文件流:
java文件的模型:
在硬盘上的文件是byte byte byte存储的,是数据的集合。
1.介绍:
(1)RandomAccessFile是java提供的对文件内容的访问类,既可以读文件,也可以写文件。
(2)支持随机访问文件,可以访问文件的任意位置
2.打开文件
有两种方式:“rw”(读写)和“r”(只读)
eg:
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
3.文件指针
这里的文件指针就是RandomAccessFile可以访问文件任意位置的基础。
打开文件的时候指针在开头,pointer = 0;
获取文件指针的方法:raf.getFilePointer();
4.写方法
raf.write();
只能写一个字节(也就是只写最后的8位),写完之后指针会自动指向下一个位置,准备再次写入。
5.读文件
int i = raf.read();
从指针所在的位置读一个字节,同时将这个字节转换成为int类型,就是说都出一个字节,填充到int的最后8位。
read();只能读取一个字节。
read(byte[]);就可以读到一个字节数组里边
6.关闭流
raf.close();
文件读写完成后一定要关闭流
下面是RandomAccessFile类的基本的使用方法的例子:
package com.test.random;import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;public class RandomAccessFileTest {public static void main(String[] args) throws IOException {File dir = new File("demo");// 如果没有写绝对路径,那么默认就是在项目中创建该文件if (!dir.exists()) {dir.mkdir();//创建目录文件}File file = new File(dir, "test.txt");if (!file.exists()) {file.createNewFile();//创建文件}RandomAccessFile raf = new RandomAccessFile(file, "rw");//设置可读,可写操作System.out.println("指针的位置:"+raf.getFilePointer());//指针的位置//写一个字节(后8位)进去(这里写入的内容是char类型的,其实char类型所占就是8位(1个字节),所以这里可以完整的写入一个A)raf.write('A');System.out.println("指针的位置:"+raf.getFilePointer());//指针的位置raf.write('B');System.out.println("已经写入的长度:"+raf.length());//写入的长度//用write()方法,写一个int类型的值(int是4个字节(32位))int i = 1;raf.write(i>>>24&0xff);//写int的最高8位(24-32之间的8位)raf.write(i>>>16&0xff);//写int的(16-24之间的8位)raf.write(i>>>8&0xff);//写int的(8-16之间的8位)raf.write(i&0xff);//写int的后8位(0-8之间的8位)//用writeInt()方法(RandomAccessFile自带的写int类型的方法),写一个int类型的值int j = 1;raf.writeInt(j);//其实writeInt()方法内部就是通过上边的方法实现的写int类型的值System.out.println("指针的位置:"+raf.getFilePointer());System.out.println("已经写入的长度:"+raf.length());//写一个String类型的值String s = "我";//中文是2个字节(16位)byte[] bytes = s.getBytes();//将String类型转换成字节数组(byte类型的),byte占用1个字节(8位)raf.write(bytes);//write()方法可以写一个字节数组//如果想从头开始读取文件内容,就必须把指针移到文件头部raf.seek(0);//把指针移到文件的头部//一次性读取,把文件的内容都读到字节数组中去byte[] buf = new byte[(int)raf.length()];raf.read(buf);System.out.println(Arrays.toString(buf));//封装成字符串String str = new String(buf);System.out.println(str);//以16进制的方式输出for (byte b : buf) {System.out.println(Integer.toHexString(b&0xff)+" ");}raf.close();}}
结果截图:
文件编码和RandomAccessFile文件流的使用--IO学习笔记(一)相关推荐
- python申明文件编码_Python源代码文件的文本编码
原博文 2012-07-22 01:46 − 源代码的编码问题对于任何语言的源文件都是存在的,只不过对于脚本语言,这个问题更突出一些. 有的人可能会说,既然源代码在文本编辑器中可以正常显示,说明编码没 ...
- php怎么查自己的文件编码,php检测文件编码的方法示例
关于文件编码的检测,很多人建议 mb_detect_encoding 检测,可是不知为何不成功,什么都没输出.看到有人写了个增强版,用 BOM 判断的,我果断就无视了,这东西完全不靠谱.最终根据PHP ...
- python设置文件编码_python修改文件编码为utf-8格式
原博文 2019-12-02 17:11 − 简单实现.h,.c文件修改编码为utf-8格式. import os; import chardet; file_path = "." ...
- 前端中怎么把网页多个文件夹的内容整合成一个_web前端学习笔记
web前端的定义:是面向用户(浏览者)的互联网技术统称.主要包括Web界面的结构.Web界面的外观视觉表现以及Web界面的交互实现. HTML结构语言:超文本标记语言. Web前端的分类:前端设计和前 ...
- LinuxC—标准IO与文件IO学习笔记
标准IO与文件IO 1 概述 stdio 标准IO(优先使用) sysio 系统调用IO(文件IO) sysio是直接实现用户态切换内核态,sysio和平台是有关系的,比如windows和linux, ...
- opt文件夹下没有ros_ubuntu16.04下ROS操作系统学习笔记(二)
做SLAM的硬件要求(不一定是必须的,看包和库的依赖): (1):差分轮式机器人,可以使用Twist速度指令控制,需要线速度和角速度. (2):需要激光雷达.深度摄像头等测距设备,可以获取环境深度信息 ...
- vue文件里在style的样式需要什么loader_Vue学习笔记之Webpack中css、less、图片等文件处理...
一.webpack中使用css文件: loader是webpack中一个非常核心的概念,去转化webpack不能转化或打包的文件. 安装loader: 官网介绍: 安装: cnpm install - ...
- 字符流---IO学习笔记(三)
字符流: 文本和文本文件的区别: 文本: java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码). 文件: 文件是byte byte byte-的数据序列. 文本文件: ...
- Java IO学习笔记(四)打印流
1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStre ...
最新文章
- gensim中word2vec使用
- linux服务器密码策略,windows与linux服务器平台密码策略管理
- Gulp构建前端自动化工作流
- 开源 物联网接入_我们刚刚推出了开源产品。 那么接下来会发生什么呢?
- javascript学习系列(21):数组中的reduceRight法
- Linux学习:Linux基础命令集(2)
- 给你的网站添加3D地球显示的访客统计(使用RevolverMaps)
- 一道无限级分类题的 PHP 实现
- k折交叉验证法的额外步骤_教你几招蝴蝶结系法步骤,OMG!这怎么配都美
- Java图形编程实验总结_实验二java图形界面编程2015级.doc
- ES6 String和Number扩展
- Linux学习笔记(12)
- coturn源码解析
- 更改计算机图标大小得方法,更改桌面图标大小方法
- pb 数据窗口设置操作
- PostgreSQL数据库——Pigsty configure
- 浅析Marshmallow在flask中的应用
- 黑白格子图案与苏格兰裙的关系
- 光电耦合器电路应用符号
- 计划评审技术PERT和关键路径法CP