字节流读写数据

字节

InputStream是字节输入流的抽象类,是所有字节输入流的父类

InputStream类是用来处理字节的,不适合处理文字,Java为字符文本的输入提供了单独的类---Reader类,但Reader类并不是InputStream类的替换者,只是在处理字符串时简化了编程

OutputStream是字节输出流的抽象类,该抽象类是表示输出字节流的所有类的父类,该类中所有方法均返回void

子类名特点:子类名称都是以其父类名作为子类名的后缀

写数据

package IO;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo01 {
    public static void main(String[] args) throws IOException {//异常处理
        //创建字节输出流对象  创建文件输出流以指定的名称写入文件
        FileOutputStream fos = new FileOutputStream("fos.txt");//默认路径是java\\src  在这直接写fos.txt就行

        //void write(int b):将指定的字节写入此文件输出流
        fos.write(97);
        fos.write(57);
        fos.write(55);//输入到fos.txt中会转换为字符,对应ASCII码表进行转换

        //使用IO流,最后都要释放资源
        //void close(),关闭此文件输出流并释放与此文件相关联的任何系统资源
        fos.close();
    }
}

//创建的fos.txt文件中的数据为a97

三个方法写数据

package IO;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class Demo02 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("fos.txt");

        //void write(int b):将指定的字节写入此文件输出流
        fos.write(100);

        //void write(byte[] b):将b.length字节从指定的字节数组写入此文件输出流
        //byte[] b={97,98,99};
        //byte[] getBytes():返回字符串对应的字节数组
        byte[] b = "abc".getBytes();//与上面效果相同
        fos.write(b);

        //void write(byte[] b,int off,int len):将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流
        fos.write(b,1,2);

        fos.close();
    }
}

字节流写数据实现换行

fos.write("\n".getBytes());//换行

注意:不同系统换行符不一样。

​ window:\n

​ linux:\n

​ mac:\r

实现追加写入

就是每执行一次,就在原来的基础上写入一次

//public FileOutputStream(String name,Boolean append);在后面加一个Boolean
//Boolean参数为true,从文件的末尾开始追加写入文件,否则则在开头写
FileOutputStream fos = new FileOutputStream("fos.txt",true);

异常处理

  1. 用try、catch、finally
FileOutputStream fos = null;//初始化
try{
    fos = new FileOutputStream("fos.txt");
    fos.write("h".getBytes());
}catch (IOException e){
    e.printStackTrace();
}finally {
    if(fos!=null){
    	try {
        	fos.close();//若将它写在上面的try/catch中,会造成资源没有释放的问题
            	        //finally解决了这个问题,finally中的语句一定可以实现
    	} catch (IOException e) {
        	e.printStackTrace();
        }
    }
}
  1. 也可以直接添加异常到方法签名
public static void main(String[] args) throws IOException {
    FileOutputStream fos = new FileOutputStream("fos.txt");
    fos.write("h".getBytes());
    fos.close();
}

注:

fos.flush();//将数据缓冲区中的数据强制输出,并清空缓冲区

读数据

步骤:

  1. 创建字节输入流对象
  2. 调用对象的读数据方法
  3. 释放资源

int read() 读一个字节的数据

FileInputStream fis = new FileInputStream("fos.txt");
 //调用字节输入流对象的读数据方法:int read() 读一个字节的数据
/*
 //第一次读数据
 int x= fis.read();
 System.out.println(x);//104
 System.out.println((char)x);//h

 //第二次读数据
 x = fis.read();
 System.out.println(x);//101
 System.out.println((char) x);//e
 //可以接着往下读取数据,不过一次只能读一个
*/

 /*
 //以上可用循环代替
 int x = fis.read();
 while(x!=-1){//可知当文件结束时读到的是-1
     System.out.print((char) x);//hello
     x = fis.read();
 }
  */
 //优化上面的程序
 int x;
 while((x= fis.read())!=-1){
     System.out.print((char)x);//输出的与原文件中的格式一样
 }
 fis.close();

读一个字节数组的数据

import java.io.FileInputStream;
import java.io.IOException;

public static void main(String[] args) throws IOException {
    FileInputStream fis = new FileInputStream("fos.txt");

    
    //创建一个数组
    byte[] b=new byte[5];
    //第一次读数据
    int len=fis.read(b);  //读取的数组长度
    System.out.println(len);
    System.out.println(new String(b));//数组内容

    //第二次读数据
    len=fis.read(b);  //读取的数组长度
    System.out.println(len);
    System.out.println(new String(b));//数组内容
    /*
    输出
    5
    hello
    5

    jav
    原因:原文件为hello
                java
        每个单词后边都有\r\n,也分别占一个字符,第二次读数据先读hello后面的\r\n,再读接下来的jav
     */
    //第三次读数据
    len=fis.read(b);  //读取的数组长度
    System.out.println(len);
    //System.out.println(new String(b));//数组内容
    System.out.println(new String(b,0,len));//指读到哪输出到哪,一般都写这样的
    /*
    输出3
       a
       av
    读了三个字符,后面的av是之前的bys数组原有的,这次读取只是替换可数组中的前三个元素
     */

    
    
    fis.close();
}

简化代码

import java.io.FileInputStream;
import java.io.IOException;

public static void main(String[] args) throws IOException {
    FileInputStream fis = new FileInputStream("fos.txt");
    //没有数据时,len值为-1,上面的代码简化
    byte[] b=new byte[1024];//1024或1024的整数倍
    int len;
    while((len=fis.read(b))!=-1){
        System.out.println(new String(b,0,len));
    }
    fis.close();
}
posted @ 2022-03-31 15:08  valder-  阅读(71)  评论(0)    收藏  举报