diff --git a/Lib/ArrayIO.py b/Lib/ArrayIO.py
index 4a163ac..5b06f92 100755
--- a/Lib/ArrayIO.py
+++ b/Lib/ArrayIO.py
@@ -1,82 +1,102 @@
-# port of StringIO.py using arrays
-# ArrayIO.py
-# jjk  02/28/96  001  direct mod of StringIO, test suite checks out
-# jjk  02/28/96  002  inherit from StringIO, test suite checks out
-# jjk  02/28/96  003  add __xx__() functions
-#
-# class ArrayIO implements  file-like objects that read/write a
-# string buffer (a.k.a. "memory files"). 
-#
-# all methods that interface with ArrayIO pass strings. Internally, however,
-# ArrayIO uses an array object.
-#
-# the interface is the same as StringIO.py
-# also handles len(a), a[i], a[i]='x', a[i:j], a[i:j] = aString
-#
+"""File-like objects that read/write an array buffer.
+
+This implements (nearly) all stdio methods.
+
+f = ArrayIO()       # ready for writing
+f = ArrayIO(buf)    # ready for reading
+f.close()           # explicitly release resources held
+flag = f.isatty()   # always false
+pos = f.tell()      # get current position
+f.seek(pos)         # set current position
+f.seek(pos, mode)   # mode 0: absolute; 1: relative; 2: relative to EOF
+buf = f.read()      # read until EOF
+buf = f.read(n)     # read up to n bytes
+buf = f.readline()  # read until end of line ('\n') or EOF
+list = f.readlines()# list of f.readline() results until EOF
+f.write(buf)        # write at current position
+f.writelines(list)  # for line in list: f.write(line)
+f.getvalue()        # return whole file's contents as a string
+
+Notes:
+- This is very similar to StringIO.  StringIO is faster for reading,
+  but ArrayIO is faster for writing.
+- ArrayIO uses an array object internally, but all its interfaces
+  accept and return strings.
+- Using a real file is often faster (but less convenient).
+- fileno() is left unimplemented so that code which uses it triggers
+  an exception early.
+- Seeking far beyond EOF and then writing will insert real null
+  bytes that occupy space in the buffer.
+- There's a simple test set (see end of this file).
+"""
 
 import string
-import array
-import StringIO
+from array import array
 
-class ArrayIO(StringIO.StringIO):
-# jjk  02/28/96
+class ArrayIO:
 	def __init__(self, buf = ''):
-	#jjk  02/28/96
-		self.buf = array.array('c', buf)
+		self.buf = array('c', buf)
 		self.pos = 0
 		self.closed = 0
-	def __len__(self): 
-	#jjk  02/28/96
-		return len(self.buf)
-	def __getitem__(self, key): 
-	#jjk  02/28/96
-		return self.buf[key]
-	def __setitem__(self, key, item): 
-	#jjk  02/28/96
-		self.buf[key] = item
-	def __getslice__(self, i, j): 
-	#jjk  02/28/96
-		return self.buf[i:j].tostring()
-	def __setslice__(self, i, j, aString): 
-	#jjk  02/28/96
-		self.buf[i:j] = array.array('c', aString)
-	def read(self, n = 0):
-	#jjk  02/28/96
-		r = StringIO.StringIO.read(self, n)
-		return (r.tostring())
-	def _findCharacter(self, char, start):
-        #probably very slow
-	#jjk  02/28/96
-		for i in range(max(start, 0), len(self.buf)):
-			if (self.buf[i] == char):
-				return(i)
-		return(-1)
-	def readline(self):
-	#jjk  02/28/96
-		i = self._findCharacter('\n', self.pos)
-		if i < 0:
+		self.softspace = 0
+	def close(self):
+		if not self.closed:
+			self.closed = 1
+			del self.buf, self.pos
+	def isatty(self):
+		return 0
+	def seek(self, pos, mode = 0):
+		if mode == 1:
+			pos = pos + self.pos
+		elif mode == 2:
+			pos = pos + len(self.buf)
+		self.pos = max(0, pos)
+	def tell(self):
+		return self.pos
+	def read(self, n = -1):
+		if n < 0:
 			newpos = len(self.buf)
 		else:
-			newpos = i+1
+			newpos = min(self.pos+n, len(self.buf))
 		r = self.buf[self.pos:newpos].tostring()
 		self.pos = newpos
 		return r
-	def write(self, s):
-	#jjk  02/28/96
-		if not s: return
-		if self.pos > len(self.buf):
-			self.buf.fromstring('\0'*(self.pos - len(self.buf)))
-		newpos = self.pos + len(s)
-		self.buf[self.pos:newpos] = array.array('c', s)
+	def readline(self):
+		i = string.find(self.buf[self.pos:].tostring(), '\n')
+		if i < 0:
+			newpos = len(self.buf)
+		else:
+			newpos = self.pos+i+1
+		r = self.buf[self.pos:newpos].tostring()
 		self.pos = newpos
+		return r
+	def readlines(self):
+		lines = string.splitfields(self.read(), '\n')
+		if not lines:
+			return lines
+		for i in range(len(lines)-1):
+			lines[i] = lines[i] + '\n'
+		if not lines[-1]:
+			del lines[-1]
+		return lines
+	def write(self, s):
+		if not s: return
+		a = array('c', s)
+		n = self.pos - len(self.buf)
+		if n > 0:
+			self.buf[len(self.buf):] = array('c', '\0')*n
+		newpos = self.pos + len(a)
+		self.buf[self.pos:newpos] = a
+		self.pos = newpos
+	def writelines(self, list):
+		self.write(string.joinfields(list, ''))
+	def flush(self):
+		pass
 	def getvalue(self):
-	#jjk  02/28/96
 		return self.buf.tostring()
 
 
 # A little test suite
-# identical to test suite in StringIO.py , except for "f = ArrayIO()"
-# too bad I couldn't inherit this :-)
 
 def test():
 	import sys
