1 /*******************************************************************************
2 * Copyright (c) 2010 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Patrick Tasse - Initial API and implementation, based on article by Nick Zhang
11 * (http://www.javaworld.com/javatips/jw-javatip26.html)
12 ******************************************************************************/
14 package org
.eclipse
.linuxtools
.tmf
.core
.io
;
17 import java
.io
.IOException
;
18 import java
.io
.RandomAccessFile
;
19 import java
.nio
.charset
.Charset
;
22 * A class to mitigate the Java I/O inefficiency of RandomAccessFile.
25 * @author Patrick Tasse
27 public class BufferedRandomAccessFile
extends RandomAccessFile
{
29 private static final int DEFAULT_BUF_SIZE
= 8192;
30 private static final Charset CHARSET_UTF8
= Charset
.forName("UTF-8"); //$NON-NLS-1$
37 StringBuilder sb
= new StringBuilder();
39 public BufferedRandomAccessFile(String name
, String mode
) throws IOException
{
40 this(name
, mode
, DEFAULT_BUF_SIZE
);
43 public BufferedRandomAccessFile(File file
, String mode
) throws IOException
{
44 this(file
, mode
, DEFAULT_BUF_SIZE
);
47 public BufferedRandomAccessFile(String name
, String mode
, int bufsize
) throws IOException
{
51 buffer
= new byte[BUF_SIZE
];
54 public BufferedRandomAccessFile(File file
, String mode
, int bufsize
) throws IOException
{
58 buffer
= new byte[BUF_SIZE
];
62 public final int read() throws IOException
{
63 if (buf_pos
>= buf_end
) {
64 if (fillBuffer() < 0) {
71 return buffer
[buf_pos
++];
75 public int read(byte b
[], int off
, int len
) throws IOException
{
76 int leftover
= buf_end
- buf_pos
;
77 if (len
<= leftover
) {
78 System
.arraycopy(buffer
, buf_pos
, b
, off
, len
);
82 for(int i
= 0; i
< len
; i
++) {
94 public long getFilePointer() throws IOException
{
96 return (l
- buf_end
+ buf_pos
);
100 public void seek(long pos
) throws IOException
{
101 int n
= (int) (real_pos
- pos
);
102 if(n
>= 0 && n
<= buf_end
) {
103 buf_pos
= buf_end
- n
;
110 public final String
getNextLine() throws IOException
{
112 if (buf_end
- buf_pos
<= 0) {
113 if (fillBuffer() < 0) {
118 for (int i
= buf_pos
; i
< buf_end
; i
++) {
119 if (buffer
[i
] == '\n') {
125 sb
.delete(0, sb
.length());
127 while (((c
= read()) != -1) && (c
!= '\n')) {
130 if ((c
== -1) && (sb
.length() == 0)) {
133 if (sb
.charAt(sb
.length() - 1) == '\r') {
134 sb
.deleteCharAt(sb
.length() - 1);
136 return sb
.toString();
138 if (lineend
> 0 && buffer
[lineend
- 1] == '\r' && lineend
> buf_pos
) {
139 str
= new String(buffer
, buf_pos
, lineend
- buf_pos
- 1, CHARSET_UTF8
);
141 str
= new String(buffer
, buf_pos
, lineend
- buf_pos
, CHARSET_UTF8
);
143 buf_pos
= lineend
+ 1;
147 private int fillBuffer() throws IOException
{
148 int n
= super.read(buffer
, 0, BUF_SIZE
);
157 private void invalidate() throws IOException
{
160 real_pos
= super.getFilePointer();
This page took 0.036621 seconds and 6 git commands to generate.