使用随机文件流类RandomAccessFile将一个文本文件倒置读出

1 篇文章 0 订阅

在练习使用随机文件流类RandomAccessFile将一个文本文件倒置读出一个.txt文件时遇到两个问题,特此记录一下

1.读取utf-8编码格式的文件是,前三位会有特殊字符占用。

2.GBK编号一个中文字符占用2个字节,UTF-8编码一个中文字符占用3个字节

//不同编码格式占用字节长度
System.out.println("中".getBytes("UTF-8").length); //3
System.out.println("中".getBytes("GBK").length); //2
System.out.println("中".getBytes("ISO-8859-1").length); //1
System.out.println("。".getBytes("UTF-8").length); //3
		
System.out.println("a".getBytes("UTF-8").length); //1		
System.out.println("a".getBytes("GBK").length); //1        
System.out.println("a".getBytes("ISO-8859-1").length); //1
System.out.println(".".getBytes("UTF-8").length); //1

使用随机文件流类RandomAccessFile将一个文本文件倒置读出

package com.syb.io;

import java.io.File;
import java.io.RandomAccessFile;

/**
 * (十) 使用随机文件流类RandomAccessFile将一个文本文件倒置读出。
 *txt格式使用UTF-8类型保存文件,前三位会有特殊字符占用,需注意
 *UTF-8类型的中文字符占三个字节
 * @author Administrator
 *
 */
public class Lession10 {
	public static void main(String[] args) throws Exception {
		
		String path = "D:/helloword.txt";
		File file = new File(path);
		//定义随机文件流
		RandomAccessFile raf = new RandomAccessFile(file, "r");//"r"表示只读
		StringBuffer sb = new StringBuffer();
		long length = raf.length();
		while(length > 3){
			length--;
			//设置在那个位置发生下一个读取或写入操作
			raf.seek(length);
			int len1 = (char) raf.readByte();
			if(0 <= len1 && len1 <= 128){
				sb.append((char)len1 + "");
			}else{
				length--;
				raf.seek(--length);
				byte[] bytes = new byte[3];
				// bytes被复制为连续3个字节
				raf.readFully(bytes);
				sb.append(new String(bytes));
			}
		}
		System.out.println(sb.toString());
		raf.close();
		
		//不同编码格式占用字节长度
		System.out.println("中".getBytes("UTF-8").length); //3
		System.out.println("中".getBytes("GBK").length); //2
		System.out.println("中".getBytes("ISO-8859-1").length); //1
		System.out.println("。".getBytes("UTF-8").length); //3
		
		System.out.println("a".getBytes("UTF-8").length); //1
		System.out.println("a".getBytes("GBK").length); //1
		System.out.println("a".getBytes("ISO-8859-1").length); //1
		System.out.println(".".getBytes("UTF-8").length); //1
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值