我的目标是读取文本文件中的行并在文件中查找位置,然后使用Java中的randomaccessfile IO从该位置读取字符串直至给定长度。我已经编写了以下代码,我的代码将进入无限循环并始终打印第一行。下面是代码。有人能帮我吗? 包装测试;
import java.io.RandomAccessFile;
import java.util.LinkedHashMap;
import java.util.Map;
public class MyTest {
static byte[] b;
static Map<String, Integer> pos = new LinkedHashMap<>();
static Map<String, Integer> length = new LinkedHashMap<>();
static RandomAccessFile raf;
static String str = null;
public static void main(String[] args) throws Exception {
pos.put("name", 0);
pos.put("age", 3);
pos.put("gender", 8);
length.put("name", 2);
length.put("age", 6);
length.put("gender", 10);
raf = new RandomAccessFile("mytext", "r");
while ((str = raf.readLine()) != null) {
for (Map.Entry<String, Integer> map : pos.entrySet()) {
String key = map.getKey();
read("mytext", map.getValue(), length.get(key));
}
}
}
public static void read(String path, int position, int length) throws Exception {
b = new byte[500];
raf.seek(position);
raf.read(b, position, length);
System.out.println(new String(b));
}
}
答案 0 :(得分:1)
documentation将readLine()
指定为
从该文件读取下一行文本。此方法从当前文件指针开始连续读取文件中的字节,直到到达行终止符或文件末尾为止。 [...]
和seek(long pos)
为
设置文件指针偏移量,从该文件的开头开始测量,在该位置下一次读取或写入。 [...]
因此,在您的read()
中,将指针设置为readLine()
循环中的另一个位置。如果该位置再次是文件的开头,您将一次又一次地读取第一行。
答案 1 :(得分:0)
在这个例子中,我们首先将数据写入一个具有 ramdom 访问文件的文件中,然后我们读取它。
public static void main(String[] args) throws IOException {
int[] listaNumeros = new int[20];
ArrayList<Integer> num1 = new ArrayList();
for (int i = 0; i < 20 ; i++) {
listaNumeros[i]=numAleatorios(20,40);
}
try(RandomAccessFile doc = new RandomAccessFile("ficheros/numeros2.txt","rw");){
for(int n:listaNumeros)
doc.writeInt(n);
//System.out.println(doc.length());
//String s = String.valueOf(doc.read());
//System.out.println(s);
//num1.add(doc.read());
}catch (IOException e){
e.printStackTrace();
}
try(RandomAccessFile doc = new RandomAccessFile("ficheros/numeros2.txt","rw");){
while(doc.getFilePointer()<doc.length()){
System.out.println(doc.readInt());
num1.add(doc.readInt());
}
System.out.println(media(num1));
}catch (IOException e){
e.printStackTrace();
}
}
不要忘记使用不同的 RamdomAccessFil 写入和读取。