java.io을 입수하려면 어떻게 해야 하나요?java.lang의 InputStream.스트링?
는 나나 a a a가 있다String
InputStream
. 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
'programing' 카테고리의 다른 글
하나의 쿼리로 mysql 데이터를 일괄 업데이트하려면 어떻게 해야 합니까? (0) | 2022.09.05 |
---|---|
__init__ 내의 클래스 함수를 호출합니다. (0) | 2022.09.05 |
urlib 및 python을 통한 사진 다운로드 (0) | 2022.09.05 |
PHP에서 @ 기호의 용도는 무엇입니까? (0) | 2022.09.05 |
파일:// URL에서 실행 중인 응용 프로그램에서 발생한 요청에 대한 "Origin null은 Access-Control-Allow-Origin에 의해 허용되지 않습니다" 오류입니다. (0) | 2022.09.04 |