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
.io
;
17 import java
.io
.IOException
;
18 import java
.io
.RandomAccessFile
;
19 import java
.nio
.charset
.Charset
;
21 public class BufferedRandomAccessFile
extends RandomAccessFile
{
23 private static final int DEFAULT_BUF_SIZE
= 8192;
24 private static final Charset CHARSET_UTF8
= Charset
.forName("UTF-8"); //$NON-NLS-1$
31 StringBuilder sb
= new StringBuilder();
33 public BufferedRandomAccessFile(String name
, String mode
) throws IOException
{
34 this(name
, mode
, DEFAULT_BUF_SIZE
);
37 public BufferedRandomAccessFile(File file
, String mode
) throws IOException
{
38 this(file
, mode
, DEFAULT_BUF_SIZE
);
41 public BufferedRandomAccessFile(String name
, String mode
, int bufsize
) throws IOException
{
45 buffer
= new byte[BUF_SIZE
];
48 public BufferedRandomAccessFile(File file
, String mode
, int bufsize
) throws IOException
{
52 buffer
= new byte[BUF_SIZE
];
56 public final int read() throws IOException
{
57 if (buf_pos
>= buf_end
) {
58 if (fillBuffer() < 0) {
65 return buffer
[buf_pos
++];
70 public int read(byte b
[], int off
, int len
) throws IOException
{
71 int leftover
= buf_end
- buf_pos
;
72 if (len
<= leftover
) {
73 System
.arraycopy(buffer
, buf_pos
, b
, off
, len
);
77 for(int i
= 0; i
< len
; i
++) {
89 public long getFilePointer() throws IOException
{
91 return (l
- buf_end
+ buf_pos
);
95 public void seek(long pos
) throws IOException
{
96 int n
= (int) (real_pos
- pos
);
97 if(n
>= 0 && n
<= buf_end
) {
98 buf_pos
= buf_end
- n
;
105 public final String
getNextLine() throws IOException
{
107 if (buf_end
- buf_pos
<= 0) {
108 if (fillBuffer() < 0) {
113 for (int i
= buf_pos
; i
< buf_end
; i
++) {
114 if (buffer
[i
] == '\n') {
120 sb
.delete(0, sb
.length());
122 while (((c
= read()) != -1) && (c
!= '\n')) {
125 if ((c
== -1) && (sb
.length() == 0)) {
128 if (sb
.charAt(sb
.length() - 1) == '\r') {
129 sb
.deleteCharAt(sb
.length() - 1);
131 return sb
.toString();
133 if (lineend
> 0 && buffer
[lineend
- 1] == '\r' && lineend
> buf_pos
) {
134 str
= new String(buffer
, buf_pos
, lineend
- buf_pos
- 1, CHARSET_UTF8
);
136 str
= new String(buffer
, buf_pos
, lineend
- buf_pos
, CHARSET_UTF8
);
138 buf_pos
= lineend
+ 1;
142 private int fillBuffer() throws IOException
{
143 int n
= super.read(buffer
, 0, BUF_SIZE
);
152 private void invalidate() throws IOException
{
155 real_pos
= super.getFilePointer();
This page took 0.039812 seconds and 5 git commands to generate.