用randomaccessfile流将一个文本文件倒置读出

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语句里的~~·

上面的应该是输出的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();
    }

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-14
random.seek();这个方法就相当于给文件的指针定位。好比“1234567” 文件流读到“4”的时候,给他做个标记,下次从4继续读,读出后面的"567"。
一开始就获得文件的长度m,也就是将文件指针指到末尾,如“1234567” 直接指向了"7",(m-1)呢就是在后退一,也就是指向了"6",呵呵 不知道这样说你能否明白。本回答被网友采纳
第2个回答  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){}
}本回答被网友采纳

用randomaccessfile流将一个文本文件倒置读出
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(--...

用JAVA编写程序,将一个文本文件中的内容,以行为单位,调整为倒序排列。提...
public static void read(String filename) { RandomAccessFile rf = null;try { rf = new RandomAccessFile(filename, "r");long len = rf.length();long start = rf.getFilePointer();long nextend = start + len - 1;String line;rf.seek(nextend);int c = -1;while (nextend > ...

java中用RandomAccessFile,如何读取文件中的中文
public final String readLine()throws IOException 从此文件读取文本的下一行。此方法可以从该文件的当前文件指针处成功地读取字节,直到到达行结束符或文件的末尾。每个字节都转换为一个字符,方法是采用该字符的低八位字节值,并将该字符的高八位设置为零。因此,此方法不支持完整的 Unicode 字符集。文本...

RandomAccessFile 解决多线程下载及断点续传
在需要访问文件的部分内容而非从头开始时,使用RandomAccessFile比其他读取类更为高效。与OutputStream、Writer等输出流相比,RandomAccessFile允许自由调整文件记录指针位置,因此它特别适用于向已存在的文件追加内容,而无需从头开始写入。RandomAccessFile提供了一系列方法用于操作文件记录指针,如移动文件指针到...

Android使用RandomAccessFile读取TXT文件seek()之后读取会部分乱码_百 ...
public interface RandomAccessList 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。 将操作随机访问列表的最佳算法(如 ArrayList)应用到连续访问列表(如 LinkedList)时,可产生...

...利用RamdomAccessFile类将一个文件的内容追叫到另一个文件的末尾_百...
public static void main(String[] args)throws Exception { String wj[]=new String [30];RandomAccessFile sj1=new RandomAccessFile("addtest.java","r");int i=0;String s="";while((s=sj1.readLine())!=null){ wj[i]=s;;i++;} sj1.close();RandomAccessFile sj=new Random...

RandomAccessFile
RandomAccessFile (raf) 的 readLine() 方法内部确实有一个默认的字符集在操作,但值得注意的是,使用 new String(line.getBytes("iso-8859-1" + "GBK")) 这样的构造方式实际上存在错误。这里的 "iso-8859-1" 和 "GBK" 应该分别作为参数,而不是像这样串联。正确的方法应该是 new String(line....

java中RandomAccessFile的使用!?
RandomAccessFile是属于随机读取类,是可以对文件本身的内容直接随机进行操作的,可以在文件的指定位置 的读取和写入内容,这在很多时候都是很方便的。read()是从文件中读取内容,一次只读取一个字节,readByte里面的参数是一个byte数组,一次可以读取这个数组大小的数据。它返回的值就是实际读取了多个字节的...

关于RandomAccessFile类
首先你的输出文件:student.txt命名有问题,在windows平台下,这个文件的长度,不是你写入数据的具体长度,平台可能会加上几个字符(你可以把第一个student对象的名字改成"a"实验一下),你的测试没有抛异常,可能是你的测试代码正好能组成一个.txt格式的文件,所以平台没有给你加字节。我觉得最好还是...

android 请问怎么用RandomAccessFile来打开一个assets中的txt文...
你可以参考Android中ContextImp的代码,其中有:@Override public File getDir(String name, int mode) { name = "app_" + name; File file = makeFilename(getDataDirFile(), name); if (!file.exists()) { file.mkdir(); setFilePermissionsFromMode(file.getPath(), mode, FileUtils.S_...

相似回答