java06六、IO流
1 泛型
泛型概述:
是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
泛型的好处: 把运行时期的问题提前到了编译期间避免了强制类型转换
1.1 泛型类
定义格式:修饰符 class 类名<类型> { }
例如:public class Generic<T> {}
1.2 泛型方法
定义格式:修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
例如:public class Generic {
public <T> void show(T t) { }
}
1.3 泛型接口
定义格式:修饰符 interface 接口名<类型> { }
例如:public interface Generic<T> { }
1.4 类型通配符
类型通配符<?>
例:List<?> 表示元素类型未知的List,它的元素可匹配任何类型
2 File类
2.1 File类概述和构造方法
File类介绍:
它是文件和目录路径名的抽象表示;
文件和目录是可以通过File封装成对象的;
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
3 IO流
3.1 Io流概述和分类
(一)IO流介绍
IO:输入/输出(Input/Output);
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输;
IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载
(二)IO流的分类
(1)按照数据的流向
输入流:读数据
输出流:写数据
(2)按照数据类型来分
字节流:字节输入流、字节输出流
字符流:字符输入流、字符输出流
(三)IO流的使用场景
如果操作的是纯文本文件,优先使用字符流。
如果操作的是图片、视频、音频等二进制文件,优先使用字节流
如果不确定文件类型,优先使用字节流。字节流是万能的流
3 .1字节流
3.1.1 往文件写数据
字节流写数据如何实现换行:
windows:\r\n
linux:\n
mac:\r
public static void main(String[] args) throws IOException {
//创建字节输出流对象
//FileOutputStream(String name):创建文件输出流以指定的名称写入文件
FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");
/* 做了三件事情:
A:调用系统功能创建了文件
B:创建了字节输出流对象
C:让字节输出流对象指向创建好的文件 */
//将指定的字节写入此文件的输出流
fos.write(97);// --对应a
//释放与此流相关联的任何系统资源。
fos.close(); }
3.1.2 从文件读数据
把文件fos.txt的内容读出来输出到控制台
//创建字节输入流对象
FileInputstream fis=new FileInputstream(name:"myByteStream\\fos.txt")
//从输入流读取一个字节的数据,如果到文件尾返回-1
Int byte=fis.read();
While(byte!=-1){System.out.print(byte)}
//释放资源
fis.close();
3 .2字节缓冲流
BufferedOutputStream(OutputStream out)字节缓冲输出流
BufferedInputStream(InputStream in)字节缓冲输入流
缓冲流的作用:
通过设置一个缓冲区,将数据一次性写入到文件,减少底层系统的调用次数,提高效率;
缓冲流仅仅提供了缓冲区,真正读写数据要依靠基本的字节流对象操作
//输出流写数据
FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");
BufferedOutputSream bos=new BufferedOutputSteam(fos);
bos.write(“hello\r\n”);
bos.close();
3 .3 字符流
3.3.1 为什么会出现字符流?
字符流的介绍:
由于字节流操作中文不是特别的方便,所以Java就提供字符流
字符流 = 字节流 + 编码表
中文的字节存储方式:
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。
3.3.2 编码表
计算机中存储的信息 都是用二进制数表示的,我们看到的汉字,字母等字符是二进制数转化之后的结果。
按照某种规则,将字符存储到计算机中,称为编码。
将存储在计算机中的二进制数按照某种规则解析出来,称为解码。
字符编码:就是一套自然语言的字符与二进制数之间的对应规则。
字符集:是一个系统支持的所有字符的集合,包含文字、标点符号、图形、数字等,常见的字符集ASCII字符集、GBXXX字符集(GBK)、Unicode字符集(UTF-8)。
3.3.3 常用字符流
InputStreamReader:是从字节流到字符流的桥梁
它读取字节,并使用指定的编码将其解码为字符
OutputStreamWriter:是从字符流到字节流的桥梁
使用指定的编码将写入的字符编码为字节
InputStreamReader(InputStream in,Stringchatset)使用指定的字符编码创建InputStreamReader对象
OutputStreamWriter(OutputStream out,Stringcharset)使用指定的字符编码创建OutputStreamWriter对象
(一)字符输入流,读取文件
FileInputStream fis=new FileInputStream(“myFile \\osw.txt”);
InputStreamReader isr=new InputStreamReader(fis,”GBK”);
int ch;
while(ch=isr.read()!=-1){
}
Isr.close();
(二)字符输出流,写文件
FileOutputSteam fos=new FileOutputSream(“myFile\\osw.txt”);
OutputStreamWriter osw=new OutputSreamWriter(fos,“GBK”);
osw.write(“中国”);
osw.close();
3.3.4 字符缓冲流
BufferedWriter(Writer out)创建字符缓冲输出流对象
BufferedReader(Reader in)创建字符缓冲输入流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\bw.txt"));
bw.write("hello\r\n");
bw.write("world\r\n");
bw.close();
3 .4 标准输入输出流
System类有两个静态的成员变量
public static final InputStream in;
public static final PrintStream out
3.5 Io总结
按照流的处理位置分为节点流和处理流。
节点流:可以从/向一个特定的地方读写数据,直接和数据源相接。
处理流:用来包装节点流,是对一个已存在的流的连接和封装。
|
字符流 |
Reader输入流-读取 |
节点流 |
FileReader |
|
处理流 |
InputSteamReader、 BufferReader |
||
|
Writer输出流-写 |
节点流 |
FileWriter |
|
|
处理流 |
OutputStreamWriter、 BufferWriter |
||
|
字节流 |
InputStream |
节点流 |
FileInputStream |
|
处理流 |
BufferInputStream、DataInputStream |
||
|
OutputStream |
节点流 |
FileOutputSteam |
|
|
处理流 |
BufferOutputStream、DataOutputStream |
4. 对象序列化流
Serializable接口
对象序列化:把对象转化为字节流。将对象保存到磁盘文件中或者在网络中的传输对象。
反序列化:把字节流转化为对象。
序列化运行时,每个可序列化的类关联一个版本号,称为SerializableUID,它在反序列化过程中使用,以验证序列化对象的发送者和接收者是否加载了与序列化兼容的类。
当类修改时,如果类中没有显示的定义SerializableUID,则类默认的UID会改变,反序列化异常
Student implements Serializable{
private static final long serializableUID=112L;
// transient 不参与序列化
private transient int age;
}
浙公网安备 33010602011771号