Java笔记--I/O操作

Java笔记–输入、输出

1,File类

File能新建,删除,重命名文件和目录,但是不能访问文件内容,访问文件本身内容需要使用输入、输出流

import java.io.File;
import java.io.IOException;

public class FileTest {
    public static void main(String[] args) throws IOException{
        //以当前路径创建一个File对象
        File file = new File(".");
        //输出绝对路径
        System.out.println(file.getAbsolutePath());
        //在当前路径创建一个临时文件
        File tmpFile = File.createTempFile("aaa", ".txt",file);
        //退出时删除临时文件
        tmpFile.deleteOnExit();

        //使用当前路径创建一个新的文件
        File newFile = new File("bbb.txt");
        newFile.createNewFile();

        //列出当前路径所有文件和路径
        String[] fileList = file.list();
        for(String filename : fileList) {
            System.out.println(filename);
        }
    }
}

2,IO流基础概念

IO流按照不同的分类方式,可以将流分为三种不同的类型
1,输入流和输出流
输入输出根据程序运行所在内存的角度划分
输入流:InputStream,Reader
输出流:OutputStream,Writer

2,字节流和字符流
字节流:操作的数据单元是8位字节 InputStream OutputStream
字符流:操作的数据单元是16位字节 Reader Writer

3,字点流和处理流
字点流(低级流):可以从、向一个特定的IO设备读、写数据的流
处理流(高级流,包装流):对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能

使用处理流进行输入/输出是,程序不会直接连接到实际的数据源,没有和实际的I/O节点连接,只要使用相同的处理流,程序就可以采用完全相同的I/O代码来访问不同的数据源
这里写图片描述

什么是流

将输入输出设备抽象成管道,那么在管道中传输的就是流,管道中传输的最小介质可分为字节流和字符流,可以类比为水管和水管中的水,一个水滴可以是字节流也可以是字符流

3,字节流和字符流

字符流和字节流其实差不多,区别是操作的数据单元不一样

3.1,InputStream和Reader

int read(byte[] b):从输入流中最多读取b.length个字节的数据,并将其储存在字节数组b中,返回实际读取的字节数

InputStream的使用:

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

public class FileInputStreamTest {
    public static void main(String[] args) throws IOException{
        //创建字节输入流
        FileInputStream fis = new FileInputStream("FileInputStreamTest.java");
        //缓存数组
        //1024这个数值与文件编码有关,防止出现乱码
        byte[] bbuf = new byte[1024];
        //实际读取的字节数
        int hasRead = 0;

        while((hasRead = fis.read(bbuf))>0) {
            //取出缓存数组中的字节,将字节转换成字符串输入
            System.out.println(new String(bbuf,0,hasRead));
        }

        fis.close();

    }

}

结果:控制台以字符串形式显示FileInputStreamTest.java文件中的内容

扫描二维码关注公众号,回复: 4274572 查看本文章

Reader的使用:I/O的正确操作–结束时关闭输入输出流

import java.io.FileReader;

public class FileReaderTest {
    public static void main(String[] args) {
        FileReader fr=null;
        try {
            //创建字符输入流
             fr =  new FileReader("FileReaderTest.java");

            //创建长度为32的缓存数组
            char[]cbuf = new char[32];

            int hasRead=0;

            while((hasRead = fr.read(cbuf))>0) {
                System.out.print(new String(cbuf,0,hasRead));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                fr.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

}

结果:控制台以字符串形式显示FileReaderTest.java文件中的内容

3.1,OutputStream和Writer

void write(byte/char[] buf):将字节/字符数组中的数据传输到指定的输出流中

OutputStream的使用:

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileOutputStreamTest {

    public static void main(String[] args) {
        try (   //创建字节输入流
                FileInputStream fis = new FileInputStream("FileInputStreamTest.java");
                //创建字节输出流
                FileOutputStream fos = new FileOutputStream("FileOutputTest.txt");){

            byte[] bbuf = new byte[32];
            int hasRead = 0;

            while((hasRead = fis.read(bbuf))>0) {
                fos.write(bbuf,0,hasRead);
            }   
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果:先将FileInputStreamTest.java文件的内容读入缓存数组中,再写入FileOutputTest.txt文件中,每读一次就写入文件输出流

Writer的使用:

import java.io.FileWriter;

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

        try (FileWriter fw = new FileWriter("FileWriter.txt");){

            fw.write("11111\r\n");
            fw.write("22222222\r\n");
            fw.write("3333333333333\r\n");
            fw.write("44444444444444444\r\n");
            fw.write("5555555555555555555555\r\n");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果生成FileWriter.txt文件:
11111
22222222
3333333333333
44444444444444444
5555555555555555555555

4,输入输出体系

如果进行输入/输出的内容是文本内容,考虑使用字符流;如果进行输入/输出的内容是二进制内容,考虑使用字节流

4.1,以字符串为物理节点的字符I/O操作

String src = "123\n"+"456\n"+"789\n";
StringReader sr = new StringReader(src);

4.2,转换流

InputStreamReader:将字节输入流转换成字符输入流
OutputStreamWriter:将字节输出流转换成字符输出流

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class KeyinTest {

    public static void main(String[] args) {
        try (
                //将System.in对象转换成Reader对象
                InputStreamReader reader = new InputStreamReader(System.in);
                //将普通的Reader包装成BufferedReader
                BufferedReader br = new BufferedReader(reader);){

            String line = null;
            while((line=br.readLine())!=null) {
                if(line.equals("exit")) {
                    System.exit(1);
                }
                System.out.println("输出内容为:"+line);
            }

            } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Java使用System.in代表标准输入,即键盘输入,但是这个标准输入流是InputStream类的实例,使用不方便,而且键盘输入的内容你那个是文本内容,所以可以使用InputStreamReader将其转换为字符输入流,普通的Reader读取输入内容依然不方便,可以将普通的Reader再次包装BufferedReader

4.2,重定向标准输入输出

static void setErr(PrintStream err):重定向标准错误输出流
static void setIn(InputStream in):重定向标准输入流
static void setOut(PrintStream out):重定向标准输出流

4.3,实现图片的复制

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FinalTest {

    static FileInputStream fis=null;
    static FileOutputStream fos=null;

    public static void main(String[] args) {

        //图片地址
        String filePath1 = "E:\\Java\\eclipse\\work space"
                + "\\SummerTest\\copytest1\\picture.png";
        //图片复制目的地
        String filePath2 = "E:\\Java\\eclipse\\work space"
                + "\\SummerTest\\copytest2\\picture.png";

        try {
            fis = new FileInputStream(filePath1);
            fos= new FileOutputStream(filePath2);

            byte[] bbuf = new byte[32];
            int hasRead = 0;
            while((hasRead=fis.read(bbuf))>0) {
                fos.write(bbuf,0,hasRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                fos.close();
                fis.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

这里写图片描述
done! 后面再补充

猜你喜欢

转载自blog.csdn.net/qq_37438740/article/details/81092660
今日推荐