IO流总结

IO流

IO流用于读写文件中的数据,I:input O:output

在这里插入图片描述

输出流是程序流向文件,输入流是文本流向

在这里插入图片描述

他们都是抽象类,需要使用他们的实现类

FilefOutputstream FilefInputstream

他们在创建对象时会出现编译时异常,一定要进行异常声明

字节流

FilefOutputstream

FilefOutputstream创建的时候需要抛出异常,异常是检验输进去的路径是否存在 创建对象时参数可以是字符串也可以是file对象,如果文件不存在会创建一个新的文件但要保证它的父级路径是存在的,如果父级路径不存在就会报错

如果文件已经存在,文件内容就会被清空

write方法可以添加数据,参数是int类型的表示的是ascll码值

释放资源防止文件被占用

void write(int b)                      一次写一个字节数据
void write( byte[] b)                  一次写一个字节数组数据 
void write(byte[], int off,int len)    一次写一个字节数组的部分数据

注:write()方法中len参数代表的是长度而不是终止索引

可以通过把想添加的内容用字符串表示,然后通过Arrays中的getByte()方法把字符串中的每个字符转化为ascll码值并返回一个byte数组,直接用write方法调用数组直接进行添加

换行符\r\n(不能直接输入,还是要用ascll码值间接)

如果要续写需要再创建对象的时候,写第二个参数true

FilefInputstream

FileInputSream在创建对象时参数是文件的路径,如果路径不存在直接报错

读取数据的方法read(),一次是读一个字节的,读出来的是数据在ascll上对应的数字

读到文件末尾了,read发()方法返回-1.空格也是数据

read()方法一次只能读一个字节数据可以使用循环来读取文件的全部数据

read方法

public int read()                         一次读一个字节数据
public int read(byte[] buffer)            一次读一个字节数组数据

read(byte[] buffer) 方法的返回值int表示本次读取到了多少个数据

具体读多少个字节数据跟数组的长度有关

read(byte[] buffer) 在使用时如果数组的的长度小于文件数据的长度时进行了多次读取,那么最后一次读取数组的长度大于剩余数据长度,除了读取到剩余的数据意外数组中还含有上次1读取的数据,原因是数组读取数据后,下次读取的数据会对上次读取的数据进行覆盖,但最后文件剩余数据小于数组长度只能覆盖住一部分,打印该数组时会打印出未覆盖的元素

在这里插入图片描述

在这里插入图片描述

此时我们可以通过string(byte[],off,len)来指定打印长度

打印文件数据
FileInputStream fis=new FileInputStream ("一个路径");
int b;
  while((b=fis.read())!=-1){
      System.out.println((char)b)
  }
fis.close;

这里要定义一个变量b,通过打印b来间接打印文件数据

FileIntputStream fis=new FileInputStream ("一个路径");
int b;
  while((b=fis.read())!=-1){
      System.out.println(fis.read();)
  }
fis.close;

如果在打印函数中同样书写read()方法来进行打印,那么打印函数中的read方法会和while方法判断语句中的read方法一前一后轮流接着读取文件中的数据.参考迭代器中的next方法

文件的拷贝

代码如下:

FileInputStream fis= new FileIntputStream("需要拷贝文件的路径");
FilefOutputStream fos =new FilefOutputstream ("拷贝到新文件的路径");
int b;
  while((b=fis.read())!=-1){
    fos.write(b)
  }
  fos.close();
  fis.close();

FileInputStream fis= new FileIntputStream("需要拷贝文件的路径");
FilefOutputStream fos =new FilefOutputstream ("拷贝到新文件的路径");
int len;
byte[] bytes=new byte[1024*1024*5]
  while((len=fis.read(bytes))!=-1){
    fos.write(bytes,0,len)
  }
  fos.close();
  fis.close();

下面的代码上面的更快

try catch异常

 try{
   FilefOutputStream fos =new FilefOutputstream ("文件的路径");
     fos.write(97);
        fos.close();
 }catch(IOException e){
     e.printStackTrace();
 }

如果我们这样写那么fos.close()前面出现异常时,会直接创建异常对象并跳到catch语句中,就无法释放资源,这时候我们可以用

在这里插入图片描述

UTB-8中中文是用3个字节储存的且首位为1,英文是用1个字节储存的首位为0

JAVA中编码的方法

public  byte[] getBytes()                    使用默认方式进行编码
public  byte[] getBytes(String charsetName)  使用指定方式进行编码

JAVA中解码的方法

String (byte[] bytes)                        使用默认方式进行解码
String (byte[] bytes, String charsetName )   使用指定方式进行解码

字符流

在这里插入图片描述

FileReader

构造方法

public FileReader(File file)                创建字符输入流关联本地文件
public Filereader(String pathname)          创建字符输入流关联本地文件

读取数据方法

public int read()                           读取单个数据,读到末尾返回-1
public int read(char[] buffer)              读取多个数据,读到末尾返回-1

按字节进行读取,遇见中文,一次读多个字节,读取后解码,返回一个整数(方法的底层会对所读取的字节二进制数进行解码并转化为十进制数,返回十进制数,这些十进制数也是字符集上的数,想看到这些内容就要进行强转)

读到文件末尾了,read方法返回-1

read的有参方法中包含了强制转换这一步,并将转换后的字符放到字符数组中

FileWriter

构造方法

public FileWrite(File file)                       创建字符输出流关联本地文件
public FileWrite(String pathname)                 创建字符输出流关联本地文件 
public FileWrite(File file, boolean append)       创建字符输出流关联本地文件,续写 
public FileWrite(String pathname,boolean append)  创建字符输出流关联本地文件,续写 

写出数据方法

void write(int c)                            写一个字符
void write(String str)                       写一个字符串
void write(String str,int off,int len)       写一个字符串的一部分
void write(char[] cbuf)                      写出一个字符数组
void write(char[] cbuf,int off,int len)      写出字符数组的一部分

缓冲流

字节缓冲流:

public BufferedInputStream( InputStream is)         将基本流包装为高级流提高读出数据性能
public BufferedOutputStream( OutputStream os )      将基本流包装为高级流提高写出数据性能

原理:底层自带了胀肚为8192的缓冲区提高性能

释放资源时不需要对字节流进行关闭,只需要关闭字节缓冲流,字节缓冲流的底层代码中有关闭字节流的代码

字符缓冲流

构造方法和字节缓冲流类似

特有的方法:

public String readLine()  读取一行的数据,如果没有数据课读了就返回null
public void newLine()      跨平台的换行

new方法会判断你是什么平台然后弄相关的换行符

缓冲流为什么能提高性能:

1.缓冲流自带8192的字节数组缓冲区

2.利用显著提高字节流的读写性能

3.对于字节流提升并不明显,对于字符缓冲流而言关键点是两个特有的方法

(字符流中也含有缓冲区)

转换流

将字节流转换为字符流

转换流是一种处理流,它可以将一种数据类型转换为另一种数据类型。

它通常用于解决两个系统之间数据格式不兼容的问题。例如,在将字符串从一个系统传输到另一个系统时,转换流可以将字符串转换为二进制数据,并在接收系统中将其转换回字符串。

转换流也可以用于将不同编码的字符串转换为另一种编码的字符串,或者将一种数据类型转换为另一种数据类型以便在程序中使用。

总的来说,转换流允许我们在不同类型的数据之间转换和传输数据,使得不同的系统和应用程序能够进行交互。

转换输入流InputStreamReader 转换输出流OutputStreamWriter

字节流使用字符流中的方法

InputStreamReader Isr=new InputStreamReader(Fileinputstream file,String  charsname) 
OutputStreamWriter Isr=new OutputStreamWriter(FileOutputstream file,String   charsname)

打印流

打印流分为两类:printstream printwrite

打印流只能操作文件的目的地,不操作数据源

特有的方法可以实现,数据原样写出,特有的写出方,可以实现自动刷新自动换行

字节打印流
构造方法
public PrintStream(OutputStream /File/String)                               关联字节输出流/文件/文件路径
public  PrintStream( String filename,Charset charset )                      指定字符编码
public PrintStream(OutputStream,boolean autoflush)                          自动刷新  
public PrintStream(OutputStream,boolean autoflush,String encoding)          指定字符编码且自动刷新 

字节流是没有缓冲区的,开不开自动刷新都一样

成员方法
public void write(int b)                                                 将指定的字节打印出来
public void println(Xxx xx)                                              打印任意数据,自动刷新,自动换行                                           
public void print(Xxx xx)                                                打印任意数据,不换行                  
public void printf(String format,Object....args )                        带有占位符的打印语句,不换行

后三个方法可以实现数据的原样写出,是打印流特有的方法

字符打印流

构造方法和成员变量与字节打印流基本相同

序列流

序列流可以把Java中的对象写道本地文件中

序列化流的构造方法和成员变量

public objectOutputStream(OutputStream out)    把基本流包装为高级流
public final void writeObject(Object obj)      把对象序列化写到文件中

使用对象输出流保存到文件时会出现NotSerializableException异常

解决方案:需要让javabean类实现Serializable接口,表明这个javabean类可以被序列化,这个接口没有内容是一个标记接口

反序列化的构造方法和成员变量

public objecyInputStream(InputStream out)     把基本流包装为高级流
public final void readObject(Object obj)      把序列化到文件的对象,读取到程序中

序列化流中如果教案javabean类内容发生改变,反序列化流就无法读取序列化到文件的对象,每一个javabean类都有一个版本号,我们可以通过声明一个固定的版本号防止版本号发生变化private static final long serialVersionUID=版本号l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值