programing

java.io을 입수하려면 어떻게 해야 하나요?java.lang의 InputStream.스트링?

goodsources 2022. 9. 5. 23:20
반응형

java.io을 입수하려면 어떻게 해야 하나요?java.lang의 InputStream.스트링?

는 나나 a a a가 있다StringInputStream. Java 1.0에서는 를 사용할 수 있지만 이는@Deprecrated을 사용법문자 집합 인코딩을 지정할 수 없습니다.

이 클래스는 문자를 바이트로 올바르게 변환하지 않습니다.1.은 JDK 1.1을 사용하는 입니다.StringReader를 누릅니다

를 사용하여 생성할 수 있지만 사용할 어댑터가 없습니다.Reader 해서 '만들다'를 만들어요.InputStream.

대체품을 찾는 고대 벌레를 찾았지만, 그런 건 없어요. 제가 알기로는요.

자주 권장되는 회피책은 에 대한 입력으로 사용하는 것입니다.

public InputStream createInputStream(String s, String charset)
    throws java.io.UnsupportedEncodingException {

    return new ByteArrayInputStream(s.getBytes(charset));
}

실현을 합니다.String바이트 배열로서 메모리에 저장되며 스트림의 목적을 저하시킵니다.대부분의 경우 이것은 큰 문제가 되지 않지만 스트림의 의도를 보존할 수 있는 데이터를 찾고 있었습니다. 가능한 한 적은 데이터만 메모리에 구현됩니다.

업데이트: 이 답변은 OP가 원하지 않는 것입니다.다른 답을 읽어주세요.

메모리로 데이터를 재작성해도 상관없는 경우, 다음을 사용해 주십시오.

new ByteArrayInputStream(str.getBytes("UTF-8"))

commons-io 패키지에 의존해도 괜찮다면 IOUtils.toInputStream(String text) 메서드를 사용할 수 있습니다.

Apache Commons-IO에서 Reader에서 InputStream으로 적응하는 어댑터가 있습니다.이 어댑터는 ReaderInputStream이라고 불립니다.

코드 예:

@Test
public void testReaderInputStream() throws IOException {
    InputStream inputStream = new ReaderInputStream(new StringReader("largeString"), StandardCharsets.UTF_8);
    Assert.assertEquals("largeString", IOUtils.toString(inputStream, StandardCharsets.UTF_8));
}

참고 자료: https://stackoverflow.com/a/27909221/5658642

가장 쉬운 방법은 라이터를 통해 데이터를 푸시하는 것입니다.

public class StringEmitter {
  public static void main(String[] args) throws IOException {
    class DataHandler extends OutputStream {
      @Override
      public void write(final int b) throws IOException {
        write(new byte[] { (byte) b });
      }
      @Override
      public void write(byte[] b) throws IOException {
        write(b, 0, b.length);
      }
      @Override
      public void write(byte[] b, int off, int len)
          throws IOException {
        System.out.println("bytecount=" + len);
      }
    }

    StringBuilder sample = new StringBuilder();
    while (sample.length() < 100 * 1000) {
      sample.append("sample");
    }

    Writer writer = new OutputStreamWriter(
        new DataHandler(), "UTF-16");
    writer.write(sample.toString());
    writer.close();
  }
}

사용하고 있는 JVM 실장은 8K 청크로 데이터를 푸시하지만, 한 번에 쓰는 문자 수를 줄이고 플러시를 호출함으로써 버퍼 크기에 영향을 줄 수 있습니다.


Writer를 사용하여 데이터를 인코딩하기 위해 CharsetEncoder 래퍼를 직접 작성하는 대신 올바른 작업을 수행하는 것이 어렵습니다.이것은 신뢰성이 높은(효율적이지 않은) 구현이어야 합니다.

/** Inefficient string stream implementation */
public class StringInputStream extends InputStream {

  /* # of characters to buffer - must be >=2 to handle surrogate pairs */
  private static final int CHAR_CAP = 8;

  private final Queue<Byte> buffer = new LinkedList<Byte>();
  private final Writer encoder;
  private final String data;
  private int index;

  public StringInputStream(String sequence, Charset charset) {
    data = sequence;
    encoder = new OutputStreamWriter(
        new OutputStreamBuffer(), charset);
  }

  private int buffer() throws IOException {
    if (index >= data.length()) {
      return -1;
    }
    int rlen = index + CHAR_CAP;
    if (rlen > data.length()) {
      rlen = data.length();
    }
    for (; index < rlen; index++) {
      char ch = data.charAt(index);
      encoder.append(ch);
      // ensure data enters buffer
      encoder.flush();
    }
    if (index >= data.length()) {
      encoder.close();
    }
    return buffer.size();
  }

  @Override
  public int read() throws IOException {
    if (buffer.size() == 0) {
      int r = buffer();
      if (r == -1) {
        return -1;
      }
    }
    return 0xFF & buffer.remove();
  }

  private class OutputStreamBuffer extends OutputStream {

    @Override
    public void write(int i) throws IOException {
      byte b = (byte) i;
      buffer.add(b);
    }

  }

}

가능한 한 가지 방법은 다음과 같습니다.

  • 작성하다
  • 파이프로 연결하다
  • 를 에 둘러쌉니다.PipedOutputStream(컨스트럭터에서 인코딩을 지정할 수 있습니다.)
  • 에트 볼라, 네가 쓴 글은OutputStreamWriter에서 읽을 수 있다PipedInputStream!

물론, 이것은 꽤 해킹적인 방법처럼 보이지만, 적어도 그것은 방법이다.

해결책은 직접 롤링을 해서InputStream사용할 가능성이 높은 구현java.nio.charset.CharsetEncoder각각 부호화하다char또는 의 덩어리char의 바이트 배열에 대해서InputStream필요에 따라서

org.hsqldb.lib 라이브러리를 사용할 수 있습니다.

public StringInputStream(String paramString)
  {
    this.str = paramString;
    this.available = (paramString.length() * 2);
  }

이것이 오래된 질문인 것은 알지만, 저도 오늘 같은 문제가 있었습니다.그리고 이것이 저의 해결책이었습니다.

public static InputStream getStream(final CharSequence charSequence) {
 return new InputStream() {
  int index = 0;
  int length = charSequence.length();
  @Override public int read() throws IOException {
   return index>=length ? -1 : charSequence.charAt(index++);
  }
 };
}

언급URL : https://stackoverflow.com/questions/837703/how-can-i-get-a-java-io-inputstream-from-a-java-lang-string

반응형