docs: public static String readTextFile(File file, int max, String ellipsis) throws IOException {
          InputStream input = new FileInputStream(file);
          try {
              if (max > 0) {  // "head" mode: read the first N bytes
                  byte[] data = new byte[max + 1];
                  int length = input.read(data);
                  if (length <= 0) return "";
                  if (length <= max) return new String(data, 0, length);
                  if (ellipsis == null) return new String(data, 0, max);
                  return new String(data, 0, max) + ellipsis;
              } else if (max < 0) {  // "tail" mode: read it all, keep the last N
                  int len;
                  boolean rolled = false;
                  byte[] last = null, data = null;
                  do {
                      if (last != null) rolled = true;
                      byte[] tmp = last; last = data; data = tmp;
                      if (data == null) data = new byte[-max];
                      len = input.read(data);
                  } while (len == data.length);
  
                  if (last == null && len <= 0) return "";
                  if (last == null) return new String(data, 0, len);
                  if (len > 0) {
                      rolled = true;
                      System.arraycopy(last, len, last, 0, last.length - len);
                      System.arraycopy(data, 0, last, last.length - len, len);
                  }
                  if (ellipsis == null || !rolled) return new String(last);
                  return ellipsis + new String(last);
              } else {  // "cat" mode: read it all
                  ByteArrayOutputStream contents = new ByteArrayOutputStream();
                  int len;
                  byte[] data = new byte[1024];
                  do {
                      len = input.read(data);
                      if (len > 0) contents.write(data, 0, len);
                  } while (len == data.length);
                  return contents.toString();
              }
          } finally {
              input.close();
          }
      }