package com.interview.books.leetcodeoj; /** * Created_By: stefanie * Date: 14-12-30 * Time: 下午8:53 */ public class LOJ158_ReadNCharUsingRead4II { char[] store; int idx = 0; public LOJ158_ReadNCharUsingRead4II(String data){ store = data.toCharArray(); } public int read4(char[] buf){ int offset = 0; while(offset < 4 && idx < store.length){ buf[offset++] = store[idx++]; } return offset; } //save previous read status using private class attribute char[] readBuf, int bufIdx, int bufSize //when there is remain data in readBuf, copy it before call read4 again. //while(bufIdx < bufSize && offset < n) buf[offset++] = readBuf[bufIdx++]; //offset still smaller than n, call read4 and copy data when (bufIdx < bufSize && offset < n) //if(bufSize < 4) break the while loop since there is no more data. private char[] readBuf = new char[4]; int bufIdx = 0, bufSize = 0; public int read(char[] buf, int n) { int offset = 0; while(bufIdx < bufSize && offset < n) buf[offset++] = readBuf[bufIdx++]; while(offset < n){ bufSize = read4(readBuf); for(bufIdx = 0; bufIdx < bufSize && offset < n; bufIdx++) buf[offset++] = readBuf[bufIdx]; if(bufSize < 4) break; } return offset; } public static void main(String[] args){ LOJ158_ReadNCharUsingRead4II reader = new LOJ158_ReadNCharUsingRead4II("ab"); char[] buf = new char[1]; System.out.println(reader.read(buf, 1)); System.out.println(String.valueOf(buf)); buf = new char[2]; System.out.println(reader.read(buf, 2)); System.out.println(String.valueOf(buf)); } }