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]; //
int 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(二)的更多相关文章
- Java基础---IO(二)--File类、Properties类、打印流、序列流(合并流)
第一讲 File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作 3)File类的实例是不 ...
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
随机推荐
- C# 简单反射实现winform左侧树形导航,右侧切换内容
先看看效果: 核心代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...
- .gitignore文件常用写法
一般的项目代码中会涉及到密码.key/secret等隐私内容,不适合上传github公开.这时可以使用.gitignore文件来屏蔽这些文件的提交. 你可能用到的写法如下 写法 含义 /build/ ...
- jzoj4235 序列
取前50個數暴力即可 #include<bits/stdc++.h> using namespace std; int n,m,a[100010],q[5]; int main(){ sc ...
- Jmeter 结构、原理介绍
Jmeter结构.原理介绍 一.Jmeter 简介 1.是基于java语言的开源的应用软件. 2.可以进行接口测试.性能测试.接口及性能的自动化测试. 二.Jmeter体系结构 元件:可以理解为每一个 ...
- 【翻译】 Windows 内核漏洞学习—空指针解引用
Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/windo ...
- mybatis 控制台打印执行的SQL语句
1. Spring boot 集成 mybatis [转载]SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件,加入如下配置: log ...
- Postgresql客户端不能远程连接数据库服务器 org.postgresql.util.PSQLException:
Postgresql安装完成之后,默认情况下是不允许远程客户端直接连接的,并且默认的监听配置文件里边,监听的服务器地址是127.0.0.1即:localhost 报如下错误: org.postgres ...
- Feign status 400 reading 问题分析
背景:项目使用的是微服务架构,采用springboot来开发,所有的服务都是基于内嵌tomcat来运行 问题:项目部署到测试环境之后,偶尔在后台日志会看到这样的日志:Feign status 400 ...
- 【原创】贡献一个项目中用到的js身份证验证-超级准!!!
前言 百度百科解释:身份证号码 首先贡献一个大神的链接:js验证身份证超准 代码 function checkIdcard(idcard) { var Errors = new Array( &quo ...
- Vue + Element UI 实现权限管理系统 前端篇(一):搭建开发环境
技术基础 开发之前,请先熟悉下面的4个文档 vue.js2.0中文, 优秀的JS框架 vue-router, vue.js 配套路由 vuex,vue.js 应用状态管理库 Element,饿了么提供 ...