"또 나야."

"안녕, 엘리!"

"오늘은 BufferedReaderBufferedWriter 에 대한 모든 것을 알려드리려고 합니다 ."

"당신은 이미 그것들에 대해 나에게 말했지요. 그것들은 정말로 그렇게 복잡하지 않습니다."

"좋아. 그럼 BufferedReader가 어떻게 작동하는지 말해줘 ."

" BufferedReader 는 110/220V 변환기와 같습니다."

" 데이터를 읽을 Reader 개체를 BufferedReader 생성자 에 전달해야 합니다 . BufferedReader 개체는 Reader 에서 큰 데이터 청크를 읽고 내부적으로 버퍼에 저장합니다. 그래서 BufferedReader 를 사용하여 Reader 에서 읽는 것이 더 빠릅니다. Reader 에서 직접 읽는 것보다 ."

"그렇습니다. 그리고 BufferedWriter는 어떻습니까 ?"

"이것은 식은 죽 먹기입니다. FileWriter 에 쓴다고 가정해 봅시다 . 데이터는 즉시 디스크에 기록됩니다. 소량의 데이터를 자주 쓰면 디스크에 많이 부딪히게 되어 프로그램 속도가 많이 느려집니다. 그러나 BufferedWriter 를 '변환기' 로 사용하면 쓰기 작업이 훨씬 빨라 집니다 . 하나의 큰 청크. 이것이 훨씬 빠릅니다."

"음. 알아봐. 근데 뭘 잊은거야?"

"쓰기를 마친 후에는 BufferedWriter 개체에서 flush() 메서드를 호출하여 버퍼에 남아 있는 모든 데이터를 Writer 로 강제로 보내야 합니다 ."

"그리고 또 뭐?"

"또 뭐야? 오! 버퍼가 Writer 에 기록되지 않은 한 데이터를 삭제 및/또는 교체할 수 있습니다."

"아미고! 감명 받았습니다! 당신은 전문가입니다! 그럼 새로운 클래스인 ByteArrayStreamPrintStream 에 대해 말씀드리겠습니다  ."

"예를 들어, ByteArrayInputStreamByteArrayOutputStream ."

"이 클래스는 StringReaderStringWriter 와 약간 비슷합니다 . StringReader는 문자열( String )에서 문자( char ) 를 읽지 만 InputStream은 바이트 배열( ByteArray )에서 바이트를 읽습니다."

StringWriter는 문자( char )를 문자열에 쓰고 ByteArrayOutputStream은 바이트를 내부 바이트 배열에 씁니다. StringWriter 에 쓰면 내부 문자열이 길어지고 ByteArrayOutputStream 에 쓰면 내부 바이트 배열도 동적으로 확장됩니다.

"지난 수업에서 주어진 예를 기억하십시오."

reader 개체에서 읽고 writer 개체에 쓰기:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 StringReader reader = new StringReader(test);

 StringWriter writer = new StringWriter();

 executor(reader, writer);

 String result = writer.toString();

 System.out.println("Result: "+ result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 String line;
 while ((line = br.readLine()) != null) {
 StringBuilder sb = new StringBuilder(line);
 String newLine = sb.reverse().toString();

 writer.write(newLine);
 }
}

"문자 대신 바이트를 사용하여 작동하는 경우의 모습은 다음과 같습니다."

InputStream 객체에서 읽고 OutputStream 객체에 쓰기:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 InputStream inputStream = new ByteArrayInputStream(test.getBytes());

 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

 executor(inputStream, outputStream);

 String result = new String(outputStream.toByteArray());
 System.out.println("Result: "+ result);
}

public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
 BufferedInputStream bis = new BufferedInputStream(inputStream);
 while (bis.available() > 0)
 {
  int data = bis.read();
  outputStream.write(data);
 }
}

"모든 것이 위의 예와 동일합니다. String을 ByteArray로, Reader를 InputStream으로, Writer를 OutputStream으로 바꾼 것을 제외하고."

"다른 두 단계는 문자열을 ByteArray로 변환하고 다시 변환하는 것뿐입니다. 보시다시피 이 작업은 매우 쉽게 수행됩니다."

문자열을 ByteArray로 변환하고 다시 역변환
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 byte[] array = test.getBytes();

 String result = new String(array);
 System.out.println("Result: "+ result);
}

"ByteArrayOutputStream에 이미 추가된 바이트를 가져오려면 toByteArray () 메서드를 호출하십시오."

"아. StringReader/StringWriter와의 유사성은 특히 당신이 나에게 지적한 후에 매우 강력합니다. Ellie, 정말 흥미로운 교훈에 대해 감사합니다."

"그렇게 급하게 어디로 가십니까? 아직 작은 선물이 있습니다. PrintStream 수업에 대해 말씀드리고 싶습니다."

"PrintStream? 그 클래스에 대해 처음 들어보네요."

"네. 특히 자바 공부 첫날부터 사용했다는 사실을 빼면요. System.out 기억하시나요 ? 음, System.out 은 System.out 의 정적(클래스) 변수입니다. 클래스이고 그 유형은... PrintStream ! 여기에서 이러한 모든 print, println 등의 메서드가 유래합니다."

"와우. 흥미진진하군. 어쩐지 그런 생각조차 해본 적이 없었어. 더 말해봐."

"좋습니다. 잘 들어보세요. PrintStream 클래스는 읽을 수 있는 출력을 위해 만들어졌습니다. 거의 전적으로 print 및 println 메서드로 구성됩니다. 이 표를 보십시오."

행동 양식 행동 양식
void print(boolean b) void println(boolean b)
void print(char c) void println(char c)
void print(int c) void println(int c)
void print(long c) void println(long c)
void print(float c) void println(float c)
void print(double c) void println(double c)
void print(char[] c) void println(char[] c)
void print(String c) void println(String c)
void print(Object obj) void println(Object obj)
void println()
PrintStream format (String format, Object ... args)
PrintStream format (Locale l, String format, Object ... args)

"형식 문자열을 사용하여 데이터를 출력할 수 있도록 여러 형식 방법도 있습니다. 예를 들면 다음과 같습니다."

문자열을 ByteArray로 변환하고 다시 역변환
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
화면 출력:
My name is Kolan. My age is 25.

"그래, 기억나. 우리는 이미 String 클래스의 포맷 방법을 공부했어."

"지금은 여기까지입니다."

"고마워, 엘리."