Java 기본 iO 소개
接着上一篇,继续做学习笔记。学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了。添加、修改、删除啥的,几行代码就可以搞定了。这只是我一个初学者的一点小心思,IO背后的大用处,相信还有很多很多。继续学习ing....
一、缓冲流和装饰模式
缓冲流(包装类),缓冲区的出现提高了对数据读写的效率,它可以用来对流进行包装,在流的基础上对流的功能进行了增强。和底层系统提供的缓冲区有什么区别?底层直接和目标设备交换数据,包装类中,通过被包装的对象。
BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedReader 的构造函数有两个:
---- BufferedReader(Reader in)
---- BufferedReader(Reader in, int sz) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
//例子 BufferedWriter 的使用FileWriter w=new FileWriter("2.txt"); BufferedWriter bw=new BufferedWriter(w); bw.write("这是一行内容"); bw.newLine(); //这是包装类提供的功能bw.write("这又是一行内容"); bw.flush(); //用缓冲流,不要忘了flush()bw.close(); //它就相当于关闭 w,这么写了以后,就不用再写 w.close() 了
//例子 BufferedReader 的使用public static void main(String[] args)throws IOException { List<String> nameList= demo2();for(String s:nameList) { System.out.println(s); } } static List<String> demo2() throws IOException { List<String> nameList=new ArrayList<String>(); FileReader r=new FileReader("C:/名单.txt"); BufferedReader br=new BufferedReader(r); String str=null;while( (str=br.readLine())!=null ){ nameList.add(str); } br.close();return nameList; }
二、装饰设计模式
Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。当要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有对象的功能,并提供加强功能。那么自定义的该类就称为装饰类。装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
public class Teste3 {public static void main(String[] args) { Japan japan=new Japan(); NiceJapan niceJapan=new NiceJapan(japan); niceJapan.speak(); } }class Japan{void speak(){ System.out.println("我们都是好学生"); } }class NiceJapan{ NiceJapan(Japan japan){this.japan=japan; }private Japan japan; //组合void speak(){ System.out.println("清清嗓子");//其他动作System.out.println("晃晃脑袋"); japan.speak(); System.out.println("磕几个头"); System.out.println("发几声惨叫"); } }
三、字节流概述
在不考虑负数的情况下,每个字节中的数据,都是0-255之间的值(因为一个字节为8位,最大为255)
如果一个文件中的每个字节或每相邻的几个字节的数据都可以表示成某个字符,则可以将这个文件称为文本文件,其实这是二进制的一个特例。
(你可以打开一个记事本,然后把一张图片拉进去,会发现一大堆的乱码,它就是二进制的特例,图片上的信息有的能与码表对上就被显示出来,有的不能就乱了。这是因为,字节流操作的时候,操作单位都是以字节为单位进行的操作的对象不一定有码表对应。
概述:
1.所有字节输入流类都是抽象类InputStream的子类
int read() 从源中读取一个字节的数据,返回字节值
int read(byte b[])从源中试图读取b.length个字节到b中,返回实际读取的字节目
void close()关闭输入流
2.所有字节输出流类都是抽象类OutputStream的子类
void write(int n) 向输出流写入单个字节。
void write(byte b[])向输出流写入一个字节数组
void flush()把缓冲区中内容输出并清空缓冲区(刷新)
void close()关闭输出流
3.例子,使用字节流进行文件的读写
FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。
FileOutputStream 的write方法的几种重载形式如下:
//void write(byte[] b) //注意返回类型是void
//void write(byte[] b, int off, int len)
//void write(int b) 将指定字节写入此文件输出流。
//FileInputStream 的read方法的几种重载形式如下
//int read() 从此输入流中读取一个数据字节。 返回读到的字节,到尾返回-1
//int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中 返回读的字节数,到尾返回-1
//int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
//对于字节流来说,每次读到的就是一个字节,如果是英文,正好一个英文对应一个字节,如果中文,就可能对应两个字节
static void demo1() throws IOException{ OutputStream out=new FileOutputStream("c:/file1.txt"); out.write("abcEnlish中国".getBytes()); //字节流不刷新也能写出去 out.close(); InputStream in=new FileInputStream("c:/file1.txt");int ch=0;while((ch=in.read())!=-1 ){ System.out.println((char)ch); //可以发现,如果是英文,能显示出来,但中文会乱码 } in.close(); }
//例子,用字节数组进行接收static void demo1()throws IOException { InputStream in=new FileInputStream("c:/名单.txt");byte [] buff=new byte[3]; //1024int len=0;while( (len=in.read(buff)) !=-1 ){ String str=new String(buff,0,len); System.out.println(str); //有乱码 } }
//例子 available 的利用static void demo2()throws IOException{ InputStream in=new FileInputStream("c:/名单.txt");byte [] buff=new byte[in.available()]; //in.available();当前流中还有多少个字节可读 in.read(buff); System.out.println(new String(buff)); in.close(); }
//例子.图片的复制static void demo3()throws IOException { InputStream in=new FileInputStream("C:\\image\\lengtu.jpg");byte [] buff=new byte[in.available()]; in.read(buff); OutputStream out=new FileOutputStream("E:/tuzi.jpg"); out.write(buff); in.close(); out.close(); }
补充:
前面,字符流有包装类
BufferedReader, BufferedWriter
字节流也有包装类
BufferedInputStream, BufferedOutputStream
四、转换流 InputStreamReader , OutputStreamWriter
把字节输入流转为字符输入流:
InputStreamReader
public class InputStreamReader extends Reader
把字节输出流转为字符输出流:
OutputStreamWriter
public class OutputStreamWriter extends Writer
1) InputStreamReader
它有四个构造函数:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, Charset cs)
InputStreamReader(InputStream in, CharsetDecoder dec) //CharsetDecoder 解码器
InputStreamReader(InputStream in, String charsetName)
2) OutputStreamWriter
它有四个构造函数:
OutputStreamWriter(OutputStream out) //创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc) // 创建使用给定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) // 创建使用给定字符集编码器的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) // 创建使用指定字符集的 OutputStreamWriter。
//例子,用缓冲流包装转换流,转换流转换字节流InputStream in=new FileInputStream("c:/1.txt"); InputStreamReader inputReader=new InputStreamReader(in); BufferedReader br=new BufferedReader(inputReader); String str=null;while((str=br.readLine())!=null){ System.out.println(str); }
//例子 从键盘读入数据,转成大写打印出来public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader( new InputStreamReader(System.in)); String msg=null;while((msg=br.readLine())!=null){ System.out.println(msg.toUpperCase()); } }
五、 ByteArrayInputStream 与ByteArrayOutputStream
它是用来以IO流的方式,完成对字节数组内容的读写,支持类似内存虚拟文件或内存映象文件的功能。
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
//ByteArrayInputStream(byte[] buff)
//ByteArrayInputStream(byte[] buff,int offset,int length)
//ByteArrayOutStream () //没有传参,则默认创建一个32字节的缓冲区,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和toString()获取数据。
//ByteArrayOutStream(int size) 根据指定大小创建缓冲区
//ByteArrayOutStream 的 byte[] toByteArray() 创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中
//例子,使用 ByteArrayOutputStream ByteArrayOutputStream byteOut=new ByteArrayOutputStream(); byteOut.write("这是放在虚拟内存中的数据".getBytes()); byte[] byteArray=byteOut.toByteArray(); String str=new String(byteArray); System.out.println(str);
//加强 从输入流中,读取字符,然后把字符变成大写,写入到输出流中public static void main(String[] args) throws IOException {/* 示例1 用 ByteArrayInputStream 和 ByteArrayOutputStream ByteArrayInputStream in=new ByteArrayInputStream("abcdef".getBytes()); ByteArrayOutputStream out=new ByteArrayOutputStream(); transform(in,out); byte [] contents=out.toByteArray(); String str=new String(contents); System.out.println(str); */// 示例2 用键盘输入输出流 transform(System.in,System.out); // 示例3 用文件输入输出流InputStream in =new FileInputStream("c:/1.txt"); OutputStream out =new FileOutputStream("e:/big.txt"); transform(in,out); } static void transform(InputStream in,OutputStream out) throws IOException{int ch=0;while((ch=in.read())!=-1){ out.write(Character.toUpperCase(ch)); } }
위 내용은 Java 기본 iO 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
