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

处理流

BufferInputStreamDataInputStream

OutputStream

节点流

FileOutputSteam

处理流

BufferOutputStreamDataOutputStream

 

4. 对象序列化流

Serializable接口

对象序列化:把对象转化为字节流。将对象保存到磁盘文件中或者在网络中的传输对象。

反序列化:把字节流转化为对象。

序列化运行时,每个可序列化的类关联一个版本号,称为SerializableUID,它在反序列化过程中使用,以验证序列化对象的发送者和接收者是否加载了与序列化兼容的类。

当类修改时,如果类中没有显示的定义SerializableUID,则类默认的UID会改变,反序列化异常

Student implements Serializable{

private static final long serializableUID=112L;

// transient 不参与序列化

private transient int age;

 

}

 

posted @ 2021-12-16 09:29  烁妈妈  阅读(57)  评论(0)    收藏  举报