Java I/O输入输出(文件)学习总结

181 篇文章 3 订阅

I/O输入输出

为了把数据永久性的存储起来,使用Java中的I/O输入输出技术就可以把数据保存到文本文件,二进制文件,zip压缩文件中。

输入输出流

流是一种有序的数据序列,根据操作的类型分为输入和输出流
在这里插入图片描述
在这里插入图片描述

输入流

在这里插入图片描述
该类中所有方法遇到错误时都会引发IOException异常
常用方法及说明:

  • read():从输入流中读取数据的下一个字节,返回0~255的int字节值,若已经到达流末尾而没有可用字节,则返回-1
  • read(byte[] b):从输入流中读入一定长度的字节, 并以整数的形式返回字节数
  • mark(int readlimit):在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数
  • reset():将输入指针返回到当前所做标记处
  • skip(long n):跳过输入流上的n个字节并返回实际跳过的字节数
  • markSupported():如果当前流支持mark()/reset()操作就返回true
  • close:关闭输入流与该流关联的所有系统资源

由于InputStream类是用来处理字节的,并不适合处理字符文本,所以使用Reader类。
在这里插入图片描述

输出流

在这里插入图片描述
OutputStream类中所有方法都返回void,遇到错误时都会引发IOException异常
常用方法和说明:

  • write(int b):将指定的字节写入此输出流
  • write(byte[] b):将b个字节从指定的byte数组写入此输出流
  • write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此输出流
  • flush():彻底完成输出并清空缓存区
  • close():关闭输出流

在这里插入图片描述

File类

它是唯一代表磁盘文件本身的类,通过该类中的方法可以进行创建,重命名,删除文件等操作。
1.文件的创建

File file = new File(String pathname)

pathname表示路径名称(包含文件名)

File file = new File(String parent,String child)

parent表示父路径(C:/user)
child表示子路径

File file = new File(File f,String child)

f表示父路径对象(就是比父路径多个/ C:/user/)
child表示子路径
在这里插入图片描述

例子:

import java.io.File;

public class file_deal {
    public static void getdate(File f){
        String fname = f.getName();
        Boolean can_write = f.canWrite();
        Boolean can_read = f.canRead();
        long len = f.length();
        String path = f.getAbsolutePath();
        String f_path = f.getPath();
        long change_time = f.lastModified();
        System.out.println("name:"+fname);
        System.out.println("whether canread?:"+can_read);
        System.out.println("whether canwrite? :"+can_write);
        System.out.println("path:"+path);
        System.out.println("father path: "+f_path);
        System.out.println("file length:"+len);
        System.out.println("the last change time:"+change_time);
    }

    public static void main(String[] args) {
        File f = new File("C:\\Users\\Syf200208161018\\Desktop\\a1.docx");
        if (f.exists()) {
           getdate(f);
           f.delete();
            System.out.println("the file has been deleted!");
        } else {
            try {
                f.createNewFile();
                getdate(f);
                System.out.println("文件已经创建成功");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文件输入输出流

FileInputStream和FileOutputStream类
用于操控磁盘文件,如果用户的文件读取需求比较简单,则可以使用FileInputStream类,它提供了基本的文件写入能力。
FileInputStream的构造方法:

  1. FileInputStream(String name)
    使用给定的文件名name创建一个FileInputStream对象,比较简单
  2. FileInputStream(File file)
    使用File对象创建FileInputStream对象,允许把文件连接输入流之前对文件做进一步分析

FileOutputStream和FileInputStream具有相同的构造方法。
创建FileOutputStream对象时可以指定不存在的文件名,但此文件不能是已被其他程序打开的。
例子:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class file_deal2 {
    public static void main(String[] args) {
        File f = new File("C:\\Users\\Syf200208161018\\Desktop\\a2.txt");
        try{
            FileOutputStream out = new FileOutputStream(f);
            byte b[] = "this is a docx called a2".getBytes();
            out.write(b);
            out.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        try{
            FileInputStream in = new FileInputStream(f);
            byte b2[] = new byte[1024];
            int len = in.read(b2);
            System.out.println(new String(b2,0,len));
            in.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

程序展示:
在这里插入图片描述
在这里插入图片描述
FileReader和FileWrite类
FileInputStream(内容读取)和FileOutputStream(写入数据)类只提供对于字节和字节数组的读取方法,汉字可能出现乱码情况所以使用FileReader和FileWrite类。

例子:

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class file_deal3 {
    public static void main(String[] args) {
        File f = new File("C:\\Users\\Syf200208161018\\Desktop\\a3.txt");
        try{
            FileWriter f_w = new FileWriter(f);
            String word = "这是a3.txt文件!\n 创建时间:20210804";
            f_w.write(word);
            f_w.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        try{
            FileReader f_r = new FileReader(f);
            char c[] = new char[1024];//缓存字符串数组
            int len = f_r.read(c);//将文件中的字符读入缓存数组
            System.out.println(new String(c,0,len));
            f_r.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

程序展示:
在这里插入图片描述
在这里插入图片描述

带缓存的输入输出流

缓存是一种性能优化,缓存流为I/O流增加了内存缓存区
BufferedInputStream和BufferedOutputStream类
BufferedInputStream的构造方法:

  1. BufferedInputStream(InputStream in)
    创建了一个有32个字节的缓存区
  2. BufferedInputStream(InputStream in,int size)
    按照指定的大小来创建缓存区

一个最优的缓存区取决于它所在的操作系统,可用的内存空间以及机器配置

使用BufferedOutputStream类和OutputStream类输出信息完全一样但多了一个flush()方法用于将缓存区的数据强制输出完
BufferedOutputStream类的构造方法:

  1. BufferedInputStream(InputStream in)
    创建了一个有32个字节的缓存区
  2. BufferedInputStream(InputStream in,int size)
    按照指定的大小来创建缓存区

BufferedReader与BufferedWriter类

BufferedReader类的常用方法:

  • read():读取单个字符
  • readLine():读取一个文本行,将其返回为字符串,无数据则返回null

BufferedWriter类的常用方法(返回void)

  • write(String s,int off,int len):写入字符串的某一部分
  • flush():刷新该流的缓存
  • newLine():写入一个行分隔符

在使用BufferedWriter类的write方法时,数据并没有立刻被写入输出流,而是首先进入缓存区中,若想要立刻将缓存区中的数据写入输出流,一定要调用flush()方法
例子:

import java.io.*;
import java.lang.reflect.Field;
import java.util.Scanner;

public class file_deal4 {
    public static void main(String[] args) {
        String word[] = {"你好","is"};
        File f = new File("C:\\Users\\Syf200208161018\\Desktop\\a_3.txt");
        try{
            FileWriter f_w = new FileWriter(f);
            BufferedWriter bw = new BufferedWriter(f_w);
            for (int j = 0; j <word.length ; j++) {
                bw.write(word[j]);
                bw.newLine();
            }
            bw.close();
            f_w.close();
        }catch(IOException e){
            e.printStackTrace();
        }
        try{
            FileReader fr = new FileReader(f);
            BufferedReader br = new BufferedReader(fr);
            String tmp = null;
            int i = 1;
            while ((tmp = br.readLine())!= null){
                System.out.println("第"+i+"行"+tmp);
                i++;
            }
            br.close();
            fr.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

程序展示:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值