java之IO流的简单操作

是什么

I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。

File类的使用

File类的使用
文件和文件目录路径的抽象表示形式。File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。File对象可以作为参数传递给流的构造器

构造方法

方法含义
public File(String pathname);以pathname为路径创建File对象,可以是绝对路径或者相对路径

路径分隔符
路径中的每级目录之间用一个路径分隔符隔开。

  • windows和DOS系统默认使用“\”来表示
  • UNIX和URL使用“/”来表示

使用File.separator;动态的提供分隔符

常用方法

方法含义
getAbsolutePath();获取绝对路径
getPath() ;获取路径
getParent();获取上层文件目录路径
length() ;获取文件长度(即字节数)
list() ;获取指定目录下的所有文件或者文件目录的名称数组
listFiles();获取指定目录下的所有文件或者文件目录的File数组
isDirectory();判断是否是文件目录
isFile();判断是否是文件
exists();判断是否存在
createNewFile();创建文件
mkdir();创建文件目录,上层目录不存在,也不创建
mkdirs();创建文件目录,如果上层文件目录不存在,一并创建
delete();删除文件或者文件夹

IO流使用

字节流

字节流操作字节,比如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt

字节流
简单复制文件,实现开发不用这种

    @Test
    public void Test1(){
        File file = new File("C:/work/TestIoCopy.txt");

        try(FileOutputStream outputStream = new FileOutputStream(file);
            FileInputStream inputStream = new FileInputStream("C:/work/TestIo.txt")) {

            file.createNewFile();

            int len = 0;
            while ((len = inputStream.read()) != -1) {
                outputStream.write(len);
            }

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

自写缓冲区的字节流
有一个缓冲区会快很多

    @Test
    public void Test2(){
        File file = new File("C:/work/TestIoCopy.txt");

        try(FileOutputStream outputStream = new FileOutputStream(file);
            FileInputStream inputStream = new FileInputStream("C:/work/TestIo.txt")) {

            byte[] buffer=new byte[1024];

            file.createNewFile();

            int len = 0;
            while ((len = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer,0,len);
            }

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

字符流

字符流操作字符,只能操作普通文本文件。最常见的文本文件:.txt,.java,.c,.cpp 等语言的源代码。

自写缓冲区的字符流

    @Test
    public void test3(){
        try(FileReader reader = new FileReader("C:/work/TestIoread.txt");
            //true表示不覆盖文件,即可以续写
            FileWriter writer = new FileWriter("C:/work/TestIoread.txt",true);) {

            char[] buf = new char[1024];
            int len = 0;

            while ((len=reader.read(buf))!=-1){
                String s = new String(buf,0,len);
                System.out.println(s);
            }
            
            writer.write("啊啊啊");
            
        }catch (Exception e){
            e.printStackTrace();
        }
    }

缓冲流

Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。
缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:

  • BufferedInputStream 和 BufferedOutputStream
  • BufferedReader 和 BufferedWriter

字节缓冲流

    @Test
    public void test4(){
        try(FileInputStream inputStream = new FileInputStream("C:/work/work2.zip");
            BufferedInputStream bufferIn = new BufferedInputStream(inputStream);
            FileOutputStream outputStream = new FileOutputStream("C:/work/workTest.zip");
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);) {

            byte[] bytes = new byte[1024];
            int len = 0;

            while ((len = bufferIn.read(bytes))!=-1){
                bufferedOutputStream.write(bytes, 0, len);
            }

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

字符缓冲流

    @Test
    public void test5(){
        try(FileReader reader = new FileReader("C:/work/TestIoread.txt");
            BufferedReader bufferedReader = new BufferedReader(reader);
            FileWriter writer = new FileWriter("C:/work/TestIoread.txt",true);
            BufferedWriter bufferedWriter = new BufferedWriter(writer);) {

            char[] chars = new char[1024];
            int len = 0;

            while ((len = bufferedReader.read(chars))!=-1){
                bufferedWriter.write(chars, 0, len);
                bufferedWriter.write("复制文本追加".toCharArray());
            }
            
        }catch (Exception e){
            e.printStackTrace();
        }
    }

转换流

转换流提供了在字节流和字符流之间的转换。很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能

  • InputStreamReader:将InputStream转换为Reader
  • OutputStreamWriter:将Writer转换为OutputStream

转换流
这里我用gbk进行读取,utf-8进行写入,实现了乱码操作

    @Test
    public void test6(){
        try(FileInputStream inputStream = new FileInputStream("C:/work/TestIoread.txt");
            InputStreamReader streamReader = new InputStreamReader(inputStream, "gbk");
            FileOutputStream outputStream = new FileOutputStream("C:/work/TestIoread2.txt");
            OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream,"utf-8");) {

            char[] chars = new char[1024];
            int len = 0;

            while ((len=streamReader.read(chars))!=-1){
                streamWriter.write(chars,0,len);
            }

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

打印流

PrintStream和PrintWriter 适用于文本输出
打印流
这里我用了自动刷新

    @Test
    public void test7(){
        try(PrintStream ps = new PrintStream(new FileOutputStream("C:/work/TestIoread3.txt"),true);
            PrintWriter pw = new PrintWriter(new FileOutputStream("C:/work/TestIoread4.txt"),true)) {

            ps.print("我是你爹");
            pw.println("来吧展示");

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

对象流

若某个类实现了 Serializable 接口,对该类的对象进行序列化

ObjectOutputStream

    @Test
    public void test8(){
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:/work/data1.txt"));
            ) {
            oos.writeObject(new Dog("旺财", 123));

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

ObjectInputStream

    @Test
    public void test9(){
        try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:/work/data1.txt"));) {
            Dog dog = (Dog) ois.readObject();
            System.out.print(dog.toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

随机流

支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件

RandomAccessFile 类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值