Java7의 기존 I/O - 문자 클래스 StringReader 및 StringWriter
public class StringWriter extends Writer {
private StringBuffer buf; // 、
public StringWriter() {
buf = new StringBuffer();
lock = buf; // lock Object
}
public StringWriter(int initialSize) {
if (initialSize < 0) {
throw new IllegalArgumentException("Negative buffer size");
}
buf = new StringBuffer(initialSize);
lock = buf;
}
public void write(int c) {
buf.append((char) c);
}
public void write(char cbuf[], int off, int len) {
if ((off < 0) || (off > cbuf.length) || (len < 0) || ((off + len) > cbuf.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return;
}
buf.append(cbuf, off, len);
}
public void write(String str) {
buf.append(str);
}
public void write(String str, int off, int len) {
buf.append(str.substring(off, off + len));
}
//...
}
전재:http://www.it165.net/pro/html/201402/9351.html
이 두 가지 클래스는 String 클래스를 Reader와 Writer 인터페이스에 잘 어울린다. String Writer 클래스가 실현되는 과정에서 진정으로 사용하는 것은 String Buffer이다. 앞에서 말했듯이 String Buffer는 가변 클래스로 Writer 클래스에 많은 문자열의 조작이 있기 때문에 이 클래스를 사용하는 것이 비교적 편리하다.StringReader 클래스에서 하나의 String 클래스만 정의하면 됩니다. 클래스의 읽기와 관련된 작업만 있고 수정 등의 작업이 없기 때문에 여러 문자열을 만들어서 자원 낭비를 초래하지 않습니다.
1. StringWriter 클래스
이를 통해 알 수 있듯이 다양한 write () 방법을 제공했다. 예를 들어 문자열 끝에 문자 그룹을 추가하고 문자열 끝에 하나의 문자를 추가하는 등 원본 코드의 실현은 매우 간단하다. 다음은 예를 들어 다음과 같다.
public class testStringWriter {
public static void main(String[] args) {
char[] x = { 'm', 'n' };
StringWriter s = new StringWriter(20);
s.write(x, 0, 1);
s.write('a');
s.write("bcd");
s.write("012", 1, 2);
System.out.println(s.toString());
}
}
마지막 출력 결과는 다음과 같습니다.
mabcd12
또는 append () 방법으로 추가할 내용을 문자열 끝에 추가할 수 있습니다.소스 코드는 다음과 같습니다.
public StringWriter append(CharSequence csq) {
if (csq == null)
write("null");
else
write(csq.toString());
return this;
}
public StringWriter append(CharSequence csq, int start, int end) {
CharSequence cs = (csq == null ? "null" : csq);
write(cs.subSequence(start, end).toString());
return this;
}
public StringWriter append(char c) {
write(c);
return this;
}
2. StringReader 클래스
다음은 StringReader 클래스의 read() 방법을 살펴보겠습니다.
public int read() throws IOException {
synchronized (lock) {
ensureOpen();
if (next >= length)
return -1;
return str.charAt(next++);
}
}
public int read(char cbuf[], int off, int len) throws IOException {
synchronized (lock) {
ensureOpen();
if ((off < 0) || (off > cbuf.length) || (len < 0) ||
((off + len) > cbuf.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
if (next >= length)
return -1;
int n = Math.min(length - next, len);
str.getChars(next, next + n, cbuf, off);
next += n;
return n;
}
}
한 번에 한 문자씩 읽을 수도 있고 여러 문자를 한 번에 한 배열로 읽을 수도 있습니다.읽기 프로세스에서는 읽기 예비(fallback) 읽기, 점프 읽기 등의 작업도 지원됩니다.
StringWriter 클래스를 초기화할 때 버프 실례가 부여되었습니다.StringBuffer는 라인이 안전하기 때문에 읽을 때 같은 StringBuffer 실례를 잠그면 쓰기와 읽기의 동기화를 실현할 수 있습니다.기본 잠금은 StringReader 클래스의 실례이기 때문에, StringBuffer와 동기화할 수 없습니다.
읽을 때 입력 출력 흐름이 열려 있는지 확인해야 합니다. (ensureOpen () 방법은 다음과 같습니다.
private void ensureOpen() throws IOException {
if (str == null)
throw new IOException("Stream closed");
}
즉, 읽을 수 있는 내용이 있는지 확인하는 것이다.없으면 바로 이상을 던진다.
다음은 태그를 사용하여 문자열을 읽는 주요 3가지 방법입니다.
private int next = 0; //
private int mark = 0; //
public boolean markSupported() { //
return true;
}
/**
* , reset() .
*/
public void mark(int readAheadLimit) throws IOException {
if (readAheadLimit < 0){
throw new IllegalArgumentException("Read-ahead limit < 0");
}
synchronized (lock) {
ensureOpen();
mark = next; //
}
}
public void reset() throws IOException {
synchronized (lock) {
ensureOpen();
next = mark;
}
}
mark () 와reset () 방법도 동기화가 필요합니다.그래서 StringReader와StringWriter류는 라인이 안전하다는 것을 알 수 있다.
다음은 이 유형의 중요한 방법의 응용을 간단하게 예시해 보겠다.
StringReader sr=new StringReader("abcdefg");
System.out.println((char)sr.read()); // a
// , , b
if(sr.markSupported()){
sr.mark(3); // , 3 。
}
System.out.println((char)sr.read()); // b
System.out.println((char)sr.read()); // c
sr.reset(); // mark
System.out.println((char)sr.read()); // mark , b
char[] x=new char[3];
sr.read(x,0,2);
System.out.println(String.valueOf(x));// bc
public void close() {
str = null;
}
JVM이 가능한 한 빨리 객체를 회수할 수 있도록 도와줍니다.생각: 만약 이 방법을 사용하지 않는다면 메모리 유출이 발생하지 않을까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.