用randomaccessfile流将一个文本文件倒置读出
importjava.io.*;publicclassXiti7{publicstaticvoidmain(Stringargs[]){Filef=newFile("E,...
import java.io.*;
public class Xiti7{
public static void main(String args[])
{
File f=new File("E,java");;
try{
RandomAccessFile random=new andomAccessFile(f,"rw");
random.seek(0);
long m=random.length();
while(m>=0)
{
m=m-1;
random.seek(m);
int c=random.readByte();
if(c<=255&&c>=0)
{
System.out.print((char)c);
}
else
{
m=m-1;
random.seek(m);
byte cc[]=new byte[2];
random.readFully(cc);
System.out.print(new String(cc));
}
}
}
catch(IOException e){}
}
}
麻烦帮我解释下这个程序那,我看不太懂,特别是while语句里的~~· 展开
public class Xiti7{
public static void main(String args[])
{
File f=new File("E,java");;
try{
RandomAccessFile random=new andomAccessFile(f,"rw");
random.seek(0);
long m=random.length();
while(m>=0)
{
m=m-1;
random.seek(m);
int c=random.readByte();
if(c<=255&&c>=0)
{
System.out.print((char)c);
}
else
{
m=m-1;
random.seek(m);
byte cc[]=new byte[2];
random.readFully(cc);
System.out.print(new String(cc));
}
}
}
catch(IOException e){}
}
}
麻烦帮我解释下这个程序那,我看不太懂,特别是while语句里的~~· 展开
3个回答
展开全部
上面的应该是输出的unicode编码把,如果要是输出utf-8的,就要改一下。一个utf-8的字符的字节长度可能是1、2、3、4,因此,要输出utf-8编码的字符,就要区别出这个字符是占了几个字节。而utf-8编码,正是通过判断读到的第一个字节取值范围来决定这个字符占几个字节的。如下图,例如如果第一个字节在大小127之内,则代表下一个字符只占一个字节。如果第一个字节小于224大于128,说明下一个字符是占2字节,依次类推。
然后,如果是倒置输出,可以倒着来判断。如果倒着读的第一个字节小于127,那么这个字符占一个字节,移动指针,读取一个字节作为一个字符。如果倒着第一个字节大于127,而倒着读的第二个字节大于191,说明这个字符占两个字节。依次类推。思路就是这样,下面是代码,反正我运行是没错误。。。。
public static void main(String args[]) {
try {
File file = new File("C:\\Users\\senn\\Desktop\\作业\\test.txt");
RandomAccessFile random = new RandomAccessFile(file, "rw");
long theLength = random.length();
while (theLength > 0) {
random.seek(--theLength);
int b = random.readByte();
if ((b & 0xFF) <= 127) {
System.out.print((char) b);
} else {
theLength--;
random.seek(theLength);
int b1 = random.readByte();
if ((b1 & 0xFF) > 191) {
random.seek(theLength);
byte bs1[] = new byte[2];
random.readFully(bs1);
System.out.print(new String(bs1, "UTF-8"));
} else {
theLength--;
random.seek(theLength);
int b2 = random.readByte();
if ((b2 & 0xFF) > 191) {
random.seek(theLength);
byte cc[] = new byte[3];
random.readFully(cc);
System.out.print(new String(cc));
} else {
theLength--;
random.seek(theLength);
byte bs3[] = new byte[4];
random.readFully(bs3);
System.out.print(new String(bs3, "UTF-8"));
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
2013-10-14
展开全部
random.seek();这个方法就相当于给文件的指针定位。好比“1234567” 文件流读到“4”的时候,给他做个标记,下次从4继续读,读出后面的"567"。
一开始就获得文件的长度m,也就是将文件指针指到末尾,如“1234567” 直接指向了"7",(m-1)呢就是在后退一,也就是指向了"6",呵呵 不知道这样说你能否明白。
一开始就获得文件的长度m,也就是将文件指针指到末尾,如“1234567” 直接指向了"7",(m-1)呢就是在后退一,也就是指向了"6",呵呵 不知道这样说你能否明白。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-10-14
展开全部
//给你加了注释
//希望对你有所帮助!
public static void main(String args[])
{
File f=new File("E,java");;
try{
RandomAccessFile random=new randomAccessFile(f,"rw"); //以随机读取方式打开文件
random.seek(0);
long m=random.length(); //m = 文件长度
While (m >= 0)
{
m=m-1; //每次循环m都减1,等于从后往前
random.seek(m); //定位到文件中第m个字符
int c=random.readByte(); //c被赋值为文件中第m个字符
if(c<=255&&c>=0)
{
System.out.print((char)c); //如果asc码<=255,>=0,则判断是个英文字符,直接打印.
}
Else
{
//如果不在asc码范围内,则判断是个汉字字符
//汉字字符是占2个字节的,所以m再退一个字节(m=m-1)
m=m-1;
random.seek(m);
byte cc[]=new byte[2];
random.readFully(cc); //cc被复制为文件中连续的两个字节
System.out.print(new String(cc)); //把cc转换为字符串,打印(这里会打印出汉字)
}
}
}catch(IOException e){}
}
//希望对你有所帮助!
public static void main(String args[])
{
File f=new File("E,java");;
try{
RandomAccessFile random=new randomAccessFile(f,"rw"); //以随机读取方式打开文件
random.seek(0);
long m=random.length(); //m = 文件长度
While (m >= 0)
{
m=m-1; //每次循环m都减1,等于从后往前
random.seek(m); //定位到文件中第m个字符
int c=random.readByte(); //c被赋值为文件中第m个字符
if(c<=255&&c>=0)
{
System.out.print((char)c); //如果asc码<=255,>=0,则判断是个英文字符,直接打印.
}
Else
{
//如果不在asc码范围内,则判断是个汉字字符
//汉字字符是占2个字节的,所以m再退一个字节(m=m-1)
m=m-1;
random.seek(m);
byte cc[]=new byte[2];
random.readFully(cc); //cc被复制为文件中连续的两个字节
System.out.print(new String(cc)); //把cc转换为字符串,打印(这里会打印出汉字)
}
}
}catch(IOException e){}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询