IO流、文件字节输出流FileOutputStream、文件字节输入流FileInputStream

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013317445/article/details/82790222

IO流

IO流分为:
输出流——写出数据
输入流——读取数据

数据类型不同,有:字节流字符流

字节流的抽象基类:InputStream、OutputStream
字符流的抽象基类:Reader、Writer

字节输出流OutputStream

如,写出数据到文件,是文件字节输出流FileOutputStream(输出流对象指向文件)。

字节输出流OutputStream操作步骤

    1.创建字节流对象
    2.写数据
    3.释放资源

文件字节输出流FileOutputStream

把一个字符串写到F:\testIOStream\1.txt文件里

是字节输出流,先要把String字符串——>byte[]字节数组
如:将“hello”转换为字节数组:“hello”.getbytes()

code V1:

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

public static void main(String[] args) throws IOException {
      
        /*
        方式一:
        String path="F:\\testIOStream\\1.txt";
        //File(String pathname) File的一个构造方法:构造File实例
        //封装成一个File
        File file= new File(path);

        //创建文件输出流
        //构造方法FileOutputStream(File file)
        FileOutputStream fos= new FileOutputStream(file);
        */

        //文件输出流指向了要操作的文件
        //构造方法:FileOutputStream(String name)
        FileOutputStream fos= new FileOutputStream("F:\\testIOStream\\2.txt");
        /**
        这一句代码创建字节输出流做了哪些事:
        调用系统功能创建文件;
        创建流对象;
        把流对象指向这个文件。
         */

        //要写出的数据
        String content="public static void main(String[] args{}); 文件.";
        //将字符串转换为字节数组
        byte[] b= content.getBytes();

        //写出到文件
        fos.write(b);

        //释放资源
        //关闭此文件输出流并释放与此流有关的所有系统资源
        fos.close();
        /**
         * 为什么一定要close()呢:
         * 让流对象变成垃圾,可以被垃圾回收器回收;
         * 通知系统去释放跟文件相关的资源
         */

    }
}

public void write(byte[] b, int off, int len) 只写一部分数据

实现数据的换行

写入换行符号。如,fos.write("\n".getbytes());

注意,不同系统的换行标识符不一样
windows: \r\n
linux: \n
Mac: \r
一些常见的高级记事本是可以识别任意换行符号的。

实现数据的追加

构造方法FileOutputStream(String name,boolean append)+ append是true。
构造方法FileOutputStream(File file, boolean append)
append - 如果是 true ,那么字节将被写入文件的末尾,而不是开头 。

把一个字符串写到F:\testIOStream\1.txt文件里,一起做异常处理

public class FileOutputStreamDemo2 {
    public static void main(String[] args){

        //准备数据
        String s= "我要写入数据到这个文件hhh\r\nhello, IO.";
        byte[] b= s.getBytes();

        FileOutputStream fos= null;
        try{
            //创建流对象
            fos= new FileOutputStream("F:\\javalearnCode\\IOstream\\testIOStream\\1.txt");
            //写入到1.txt文件
            fos.write(b);
        } catch( IOException e){
            e.printStackTrace();
        } finally{
            
            try {
                fos.close();//放到finally里,保证一定执行
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
    }
}

文件字节输入流FileInputStream

从文件读数据

1.一次读一个字节
public int read()一次读一个字节。返回值是int类型的ASCii码值哦。 读到文件末尾,返回值为-1,所以可以拿-1做判断读完没。
public int read()一次读一个字节数据 返回值为intASCii码值,,读到文件末尾,返回值为-1,所以可以拿-1做判断

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

public class FileInputStreamDemo {
    public static void main(String[] args) {
        FileInputStream fis= null;
        try{
            fis= new FileInputStream("F:\\javalearnCode\\IOstream\\testIOStream\\1.txt");
            int data=0;
            //(data=fis.read())!=-1)读取 赋值 判断 都做了
            while((data=fis.read())!=-1){ //public int read()一次读一个字节数据 返回值为int,读到文件末尾,返回值为-1,所以可以拿-1做判断
                                            //注意:读不出中文
                System.out.print((char)data);
            };

        }catch(IOException e){
            e.printStackTrace();
        }finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

2.一次读一个字节数组
public int read(byte[] b)
**字节数组b就是一个临时的空间,用来放每次读取的数据的。**第1次读取完数据,第2次读取的会把第一次的覆盖掉…到读完。
要定义一个字节数组,开辟一个空间。

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

public class FileInputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis= new FileInputStream("F:\\javalearnCode\\IOstream\\FileDemo.java");

        //字节数组就是一个临时的空间,用来放每次读取的数据的
        //字节数组的长度一般是1024或者1024的整数倍(给的每次可读取的空间的大小)
        byte[] bys= new byte[1024];
        int len= 0;
        while((len=fis.read(bys))!=-1){//fis.read(bys) 读取到的存在了bys字节数组里。返回的是读取到的实际长度
            System.out.print(new String(bys, 0, len)); //String的构造方法之用字符数组构造新的String:String(byte[] bytes)和String(byte[] bytes, int offset, int length)
        }
        
		fis.close();
    }
}

猜你喜欢

转载自blog.csdn.net/u013317445/article/details/82790222