Tag: random access

Java:从具有缓冲输入的随机访问文件中读取字符串

我之前从未接触过Java IO API的经验,现在我真的很沮丧。 我发现很难相信它有多奇怪和复杂,做一个简单的任务有多难。 我的任务:我有2个位置(起始字节,结束字节), pos1和pos2 。 我需要读取这两个字节之间的行(包括起始字节,不包括结尾字节),并将它们用作UTF8字符串对象。 例如,在大多数脚本语言中,它将是一个非常简单的1-2-3-liner(在Ruby中,但对于Python,Perl等基本相同): f = File.open(“file.txt”).seek(pos1) while f.pos < pos2 { s = f.readline # do something with "s" here } Java IO API很快就会出现问题;)实际上,我看到了两种从常规本地文件中读取行(以\n结尾)的方法: RandomAccessFile有getFilePointer()和seek(long pos) ,但它的readLine()读取非UTF8字符串(甚至不是字节数组),但编码破坏的字符串非常奇怪,并且没有缓冲(这可能意味着每次read*()调用将被翻译成单个不正确的OS read() =>相当慢)。 BufferedReader有很好的readLine()方法,它甚至可以用skip(long n)进行一些搜索,但它无法确定已经读取的偶数字节数,也没有提到文件中的当前位置。 我试过用类似的东西: FileInputStream fis = new FileInputStream(fileName); FileChannel fc = fis.getChannel(); BufferedReader br = new BufferedReader( new InputStreamReader( fis, […]

使用StAX为XML创建索引以便快速访问

有没有办法使用StAX和JAX-B创建索引,然后快速访问XML文件? 我有一个大型XML文件,我需要在其中查找信息。 这用于桌面应用程序,因此它应该在RAM很少的系统上运行。 所以我的想法是这样的:创建索引然后快速访问大文件中的数据。 我不能只分割文件,因为它是一个我想要不加改变地使用的官方联邦数据库。 使用XMLStreamReader我可以快速找到一些元素,然后使用JAXB来解组元素。 final XMLStreamReader r = xf.createXMLStreamReader(filename, new FileInputStream(filename)); final JAXBContext ucontext = JAXBContext.newInstance(Foo.class); final Unmarshaller unmarshaller = ucontext.createUnmarshaller(); r.nextTag(); while (r.hasNext()) { final int eventType = r.next(); if (eventType == XMLStreamConstants.START_ELEMENT && r.getLocalName().equals(“foo”) && Long.parseLong(r.getAttributeValue(null, “bla”)) == bla ) { // JAX-B works just fine: final JAXBElement foo = unmarshaller.unmarshal(r,Foo.class); […]