将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);
}
}
}
}
虽然能正常显示第五个素数
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);
}
}
}
}
这种情况下,虽然文件内容是正常的
所以有没有什么办法,可以同时保证输出正常,同时显示到控制台的内容也是相同的写法,求指教。
写了好久还是不行,问了其他人,用的是别的方法做的,我把那段代码放到自己的里面也能运行,现在把完整的发过来,给你们参考
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和自己的思路:
可能是因为在写入文件时使用了不同的方式(writeInt
和write
),导致文件的编码方式不一致。建议在读取文件时使用相同的方式读取,即使用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个素数,并继续读取文件中的内容。
希望这可以帮助您解决问题。