Окончательно у меня получился вот такой класс , который может читать построчно , но с конца текстового файла
Код |
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.RandomAccessFile; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.Arrays; import java.util.LinkedList;
public class ReverseRead {
private String filePath; private File file; private RandomAccessFile reader; private FileOutputStream fileOS; private OutputStreamWriter writer;
public ReverseRead(String filePath) throws FileNotFoundException, UnsupportedEncodingException { this.filePath = filePath; file = new File(filePath); fileOS = new FileOutputStream(file, true); writer = new OutputStreamWriter(fileOS, "UTF-8"); reader = new RandomAccessFile(file, "rw"); }
public void writeText(String text) throws IOException { writer.write(text); writer.flush(); writer.close(); } // метод делает следущее
// -перемещаясь в цикле с конца файла в начало считывает байты, // записывая их во временный LinkedList; // -когда позиция считывания доходит до начала строки, массив байтов, // полученный из LinkedList, реверсируется, декодируется,из него отсекается // ненужное содержимое (~ нули в конце строчки) и этот массив передается в // конструктор String,строка выводится на консоль.
public void readFileInReverse() throws IOException { LinkedList<Byte> singleStr = new LinkedList<Byte>(); Byte read;
for (int i = (int) file.length() - 1; i >= 0; i--) { reader.seek(i); read = reader.readByte(); singleStr.addFirst(read);
if ((char) read.byteValue() == '\n'|| i==0) { if((char) read.byteValue() == '\n')singleStr.pollFirst(); if (singleStr.size() == 0) { continue; } byte reverseStr[] = new byte[singleStr.size()];
for (int j = 0; j < singleStr.size(); j++) { reverseStr[j] = singleStr.get(j).byteValue();
} singleStr = new LinkedList<Byte>(); Charset charset = Charset.forName("UTF-8"); CharsetDecoder decoder = charset.newDecoder(); ByteBuffer buf = ByteBuffer.wrap(reverseStr);
CharBuffer charBuf = decoder.decode(buf);
char[] msgBytes = Arrays.copyOf(charBuf.array(), charBuf.limit()); String line = new String(msgBytes); System.out.println(line); }
} } public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException, IOException { ReverseRead reverse = new ReverseRead("rTest.txt"); reverse.writeText("первая строчка\nвторая строчка\nтретья строчка"); reverse.readFileInReverse();
} }
|
|