关于#java#的问题:读取100前的素数并放到文件中,如何读取文件中的第五个素数同时保证文件内容不会显示乱码

将2到100中的素数,放入Primenumber.txt文件中,从中读出第5个素数,显示到屏幕上,并将100到500的素数追加到Primenumber.txt中


import java.io.*;
public class Primenumber {
    public static void main(String[] args) throws IOException{
        RandomAccessFile raf=new RandomAccessFile("Primenumber.txt","rw");
        int i,n;
        String s=" ";
        byte b[]=s.getBytes();
        String str=new String(b);
        for(n=2;n<=100;n++) {
            for(i=2;i<=n;i++) {
                if(n%i==0) {
                    break;
                }
            }
            if(i==n) {
                //raf.write(String.valueOf(n).getBytes());
                raf.writeInt(n);
                //raf.writeBytes(str);
                raf.write(b);
            }
        }
        raf.seek(20);
        System.out.println("第五个素数:"+raf.readInt());
        raf.seek(raf.length());
        for(n=100;n<=500;n++) {
            for(i=2;i<=n;i++) {
                if(n%i==0) {
                    break;
                }
            }
            if(i==n) {
                //raf.write(String.valueOf(n).getBytes());
                raf.writeInt(n);
                //raf.writeBytes(str);
                raf.write(b);
            }
        }
    }
}

虽然能正常显示第五个素数

img


但是文件内容里面是乱码

img


或者是另一种情况

import java.io.*;
public class Primenumber {
    public static void main(String[] args) throws IOException{
        RandomAccessFile raf=new RandomAccessFile("Primenumber.txt","rw");
        int i,n;
        String s=" ";
        byte b[]=s.getBytes();
        String str=new String(b);
        for(n=2;n<=100;n++) {
            for(i=2;i<=n;i++) {
                if(n%i==0) {
                    break;
                }
            }
            if(i==n) {
                raf.write(String.valueOf(n).getBytes());
                //raf.writeInt(n);
                raf.writeBytes(str);
                //raf.write(b);
            }
        }
        raf.seek(20);
        System.out.println("第五个素数:"+raf.readInt());
        raf.seek(raf.length());
        for(n=100;n<=500;n++) {
            for(i=2;i<=n;i++) {
                if(n%i==0) {
                    break;
                }
            }
            if(i==n) {
                raf.write(String.valueOf(n).getBytes());
                //raf.writeInt(n);
                raf.writeBytes(str);
                //raf.write(b);
            }
        }
    }
}

这种情况下,虽然文件内容是正常的

img


但是显示出错

img

所以有没有什么办法,可以同时保证输出正常,同时显示到控制台的内容也是相同的写法,求指教。

写了好久还是不行,问了其他人,用的是别的方法做的,我把那段代码放到自己的里面也能运行,现在把完整的发过来,给你们参考

import java.io.*;
public class Primenumber {
   public static void main(String[] args) throws IOException{
       RandomAccessFile raf=new RandomAccessFile("Primenumber.txt","rw");
       int i,n,x;
       String s=" ";
       byte b[]=s.getBytes();
       String str=new String(b);
       for(n=2;n<=100;n++) {
           for(i=2;i<=n;i++) {
               if(n%i==0) {
                   break;
               }
           }
           if(i==n) {
               raf.write(String.valueOf(n).getBytes());
               raf.writeBytes(str);
           }
       }
      RandomAccessFile rf=new RandomAccessFile("Primenumber.txt","r");
      rf.skipBytes(8);
      byte by[]=new byte[1024];
      x=rf.read(by,0,2);
      System.out.println("第5个素数:"+new String(by,0,x));
      rf.seek(rf.length());
       for(n=100;n<=500;n++) {
           for(i=2;i<=n;i++) {
               if(n%i==0) {
                   break;
               }
           }
           if(i==n) {
               raf.write(String.valueOf(n).getBytes());
               raf.writeBytes(str);
           }
       }
   }
}

参考GPT和自己的思路:

可能是因为在写入文件时使用了不同的方式(writeIntwrite),导致文件的编码方式不一致。建议在读取文件时使用相同的方式读取,即使用readInt来读取整数,而不是read方法。此外,在写入文件时,可以使用writeUTF来写入字符串,这样可以保证文件的编码方式一致,同时避免乱码出现。最后,在读取文件时,应该使用try-catch语句来捕获可能出现的异常。

参考GPT和自己的思路:

首先,您需要注意的是,当您用RandomAccessFile类写入文件时,使用writeInt()方法会将数据以二进制形式写入文件,而且不是人类可读的形式。所以在输出到控制台时,如果您使用了readInt()方法,则会导致显示乱码或不正确的数字。因此,您需要使用read()或readByte()方法从文件中读取单个字节,并将其转换为可读的形式。

以下是更新后的代码,可以同时确保输出到控制台和写入文件的内容是正确的:

import java.io.*;

public class Primenumber {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("Primenumber.txt", "rw");
        int i, n, count = 0;
        String s = " ";
        byte b[] = s.getBytes();
        String str = new String(b);
        for (n = 2; n <= 100; n++) {
            for (i = 2; i <= n; i++) {
                if (n % i == 0) {
                    break;
                }
            }
            if (i == n) {
                raf.writeInt(n);
                raf.writeBytes(str);
            }
        }
        raf.seek(0);
        count = 0;
        while (raf.getFilePointer() < raf.length()) {
            int num = raf.readInt();
            raf.readByte(); // 读取空格
            count++;
            if (count == 5) {
                System.out.println("第五个素数:" + num);
            }
        }
        raf.seek(raf.length());
        for (n = 100; n <= 500; n++) {
            for (i = 2; i <= n; i++) {
                if (n % i == 0) {
                    break;
                }
            }
            if (i == n) {
                raf.writeInt(n);
                raf.writeBytes(str);
            }
        }
        raf.close();
    }
}

除了使用read()或readByte()方法外,我们还注意到,您在使用seek()方法进行定位时,第一个数的偏移量应该为0,不是20。此外,最后一定要关闭RandomAccessFile对象。

我们加了一个计数器count来记录读取到的素数的数量,当count=5时,使用System.out.println()方法输出第5个素数,并继续读取文件中的内容。

希望这可以帮助您解决问题。