文件编码
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编码:");
byte[] byte1 = s.getBytes();
for (byte b : byte1) {
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编码:");
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编码:");
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编码:");
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);
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());
raf.write('A');
System.out.println("指针的位置:"+raf.getFilePointer());
raf.write('B');
System.out.println("已经写入的长度:"+raf.length());
int i = 1;
raf.write(i>>>24&0xff);
raf.write(i>>>16&0xff);
raf.write(i>>>8&0xff);
raf.write(i&0xff);
int j = 1;
raf.writeInt(j);
System.out.println("指针的位置:"+raf.getFilePointer());
System.out.println("已经写入的长度:"+raf.length());
String s = "我";
byte[] bytes = s.getBytes();
raf.write(bytes);
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);
for (byte b : buf) {
System.out.println(Integer.toHexString(b&0xff)+" ");
}
raf.close();
}
}
结果截图:
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
使用RandomAccessFile流将一个文本文件读出,并导致写入到另一个文件当中。
File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...
56-IO流(RandomAccessFile).avi
java基础——IO流及File-RandomAccessFile对象.docx
因为使用其他文件流修改文件时是整体的替换,导致SVN上传上去后是整个文件都修改了,所以需要增量修改,这个demo是使用RandomAccessFile增量修改,只修改指定的行,很实用
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...
RandomAccessFile处理文件的案例
最近在用java的IO包下面的RandomAccessFile类读写中文文件时遇到了乱码问题,解决不了。于是索性自己写个类,可以进行中文文件读写而不乱码。 压缩包里提供了.jar包和源代码。1.2版本解决了前面版本读取文件速度慢的...
RandomAccessFile随机文本,使用多线程处理复制文件
在JAVA程序设计不少涉及到对文件的读写操作,本例针对这方面的问题,介绍RandomAccessFile类的文件读写操作,文件中包含有1个java文件和1个class文件
NULL 博文链接:https://baihe747.iteye.com/blog/2124747
Java中正确使用RandomAccessFile向文件中写入中文
文件操作——File 、 RandomAccessFile(上).mp4
io-demo I / O in or out code 编码 file 学习 java.io.File 类 random-access-file 学习 RandomAccessFile i-o io流 包括file流,字节流 serialize-demo 深入学习 对象序列化与反序列化
对文件夹里面的文件进行分类,配置文件是config.xml,文件包含同一个关键字的放入同一个文件夹,不支持对文件夹的分类,所有的操作利用了RandomAccssFile进行文件复制
IO ============================================================================================================================================= * Input /Output 输入 输出 保存文件 读取文件 java.io...
文件操作——File 、 RandomAccessFile(上).mp4
NIO_RandomAccessFile_多线程读本地CSV文件(java==> google guava包ListenableFuture) reader里有个main函数,更改文件路径后,直接运行即可
【IT十八掌徐培成】Java基础第16天-01.RandomAccessFile.zip
RandomAccessFile 对文件操作,很好用的哟