第三章 输入和输出处理

文章目录

第三章 输入和输出处理

1.文件

相关记录或放在一起的数据的集合

访问文件属性:

JAVA API :java.io.File 类File file = new File( String pathname );

File类 --> 创建文件对象(物理文件或目录)-->通过文件对象的方法,操作文件或目录的属性(路径、权限、日期和时间等)

File类的常用方法

方法名称 说明
boolean exists( ) 判断文件或目录是否存在
boolean isFile( ) 判断是否是文件
boolean isDirectory( ) 判断是否是目录
String getPath( ) 返回此对象表示的文件的相对路径名
String getAbsolutePath( ) 返回此对象表示的文件的绝对路径名
String getName( ) 返回此对象表示的文件或目录的名称
boolean delete( ) 删除此对象指定的文件或目录
boolean createNewFile( ) 创建名称的空文件,不创建文件夹
long length() 返回文件的长度,单位为字节 , 如果文件不存在,则返回 0L
java 复制代码
 public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\Administrator\\Desktop\\html开场.txt");
        boolean bool = file.exists();
        System.out.println("文件或目录是否存在:"+bool);
        System.out.println("是否是文件:"+file.isFile());
        System.out.println("是否是目录:"+file.isDirectory());
        String rPath = file.getPath();
        System.out.println("文件的相对路径:"+rPath);
        String aPath = file.getAbsolutePath();
        System.out.println("文件的绝对路径:"+aPath);
        String fName = file.getName();
        System.out.println("文件或目录的名称:"+fName);
        System.out.println("文件的长度:"+file.length());

        File file1 = new File("C:\\Users\\Administrator\\Desktop\\html.txt");
        bool = file1.createNewFile();
        System.out.println("创建名称的空文件:"+bool);
        bool = file1.delete();
        System.out.println("删除此对象指定的文件或目录:"+bool);
        System.out.println("文件或目录是否存在:"+file1.exists());
        System.out.println("文件的长度:"+file1.length());
    }

运行结果:

java 复制代码
文件或目录是否存在:true
是否是文件:true
是否是目录:false
文件的相对路径:C:\Users\Administrator\Desktop\html开场.txt
文件的绝对路径:C:\Users\Administrator\Desktop\html开场.txt
文件或目录的名称:html开场.txt
文件的长度:1529
创建名称的空文件:true
删除此对象指定的文件或目录:true
文件或目录是否存在:false
文件的长度:0

2.流

流是一组有序的 数据序列,以先进先出方式发送信息的通道,通过流来读写文件

Java流的分类

输入输出流是相对于计算机内存来说的

字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流

1.FileInputStream

  • InputStream类常用方法
    • int read( ):从当前数据流中读取一个字节。若已达到流结尾,则返回-1
    • int read(byte[] b):从当前输入流读取一定的byte数据,并存取在数组中,然后返回读取的byte数据的数量,若已到达流结尾,则返回-1
    • int read(byte[] b,int off,int len):从输人流中的当前位置连续读人len个字节,从数组b的第off+1个元素位置处开始存放,同时返回所读到的字节数
    • void close( ):关闭输入流与外设的连接并释放所占用的系统资源
    • int available():可以从输入流中读取的字节数目
  • 子类FileInputStream常用的构造方法
    • FileInputStream(File file)
    • FileInputStream(String name)

使用FileInputStream 读文本文件

java 复制代码
import java.io.FileInputStream;
import java.io.IOException;

public class FileIS {
    public static void main(String[] args) throws IOException {
        //构造文件输入流FileInputStream对象
        FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\html开场.txt");
        //读取文本文件的数据
        System.out.println( fis.available());  //可以从输入流中读取的字节数目:1529
        System.out.println(fis.read());        //229
        //关闭文件流对象
        fis.close();
    }
}

在实例化字节数组时,一次性实例化足够大的数组

fis.available() 避免乱码

2.FileOutputStream

  • OutputStream类常用方法

    • void write(int c):将参数c的低位字节写入到输出流
    • void write(byte[] buf):将字节数组buf中的全部字节按顺序写入到输出流
    • void write(byte[] b,int off,int len):将字节数组b中第off+1个元素开始的len个数据,顺序地写人到输出流
    • void flush():强制写入所有缓冲的字节数据,强制清空缓冲区并执行向外设写操作
    • void close():关闭输出流与外设的连接并释放所占用的系统资源
  • 子类FileOutputStream常用的构造方法

    • FileOutputStream (File file)
    • FileOutputStream(String name)
    • FileOutputStream(String name,boolean append)

    注意:

    1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容

    2.创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件

使用FileOutputStream 写文本文件

java 复制代码
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOS {
    public static void main(String[] args) throws IOException {
        //构造文件输出流FileOutputStream对象
        FileOutputStream fos = new FileOutputStream("html开场.txt");
        //把数据写入文本文件
        String str = "好好学习Java";
        byte[] words = str.getBytes();
        fos.write(words,0,words.length);
        //关闭文件流对象
        fos.close();
    }
}

复制文本文件

java 复制代码
/*文件"我的青春谁做主.txt"位于D盘根目录下,
 *要求将此文件的内容复制到 C:\myFile\my Prime.txt中
 */
public static void main(String[] args) throws IOException {
    //创建输入输出流
    FileInputStream fis = new FileInputStream("D:\\我的青春谁做主.txt");
    FileOutputStream fos = new FileOutputStream("C:\\myFile\\my Prime.txt");
    //创建字节
    byte[] word = new byte[1024];
    while (fis.read(word)>0){
        fos.write(word,0, word.length);
    }
    fis.close();
    fos.close();
}

3.Reader类

  • Reader类常用方法
    • int read( ):从输入流中读一个字符
    • int read(char[] c):从输入流中读最多c.length个字符,存入字符数组c中
    • read(char[] c,int off,int len):从输入流中读最多len个字符,存入字符数组c中从off开始的位置
    • void close( ):关闭输入流
  • 子类InputStreamReader常用的构造方法
    • InputStreamReader(InputStream in)
    • InputStreamReader(InputStream in,String charsetName)

1.FileReader类

  • FileReader类是InputStreamReader的子类
    • FileReader(File file)
    • FileReader(String name)
  • 该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型
    • System.out.println(System.getProperty("file.encoding"));

使用FileReader读取文件

java 复制代码
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class FileRead {
    public static void main(String[] args) throws IOException {
        //创建FileReader对象
        Reader fr = new FileReader("D:\\Cly\\javagj\\html开场.txt");
        //读取文本文件的数据
        fr.read();
        //关闭相关的流对象
        fr.close();
    }
}

2.BufferedReader类

使用FileReader类与BufferedReader类提高字符流读取文本文件的效率

BufferedReader类是Reader类的子类

BufferedReader类带有缓冲区

按行读取内容的readLine()方法

  • BufferedReader常用的构造方法
    • BufferedReader(Reader in):创建缓冲区字符输入流
  • 子类BufferedReader特有的方法
    • readLine()

使用 BufferedReader读文本文件

java 复制代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class BufferedRead {
    public static void main(String[] args) throws IOException {
        //构造BufferedRead对象和FileReader对象
        Reader fr = new FileReader("D:\\Cly\\javagj\\html开场.txt");
        BufferedReader br = new BufferedReader(fr);
        //调用方法获取数据
        System.out.println(br.readLine());
        //关闭文件流
        br.close();
        fr.close();
    }
}

读取时中文乱码

java 复制代码
FileInputStream fis=new FileInputStream("c:\\myDoc\\hello.txt");
//使用InputStreamReader并设置编码格式
InputStreamReader fr=new InputStreamReader(fis,"UTF-8"); 

4.Writer类

  • Writer类常用方法
    • write(String str):将字符串str输出到流中
    • write(String str,int off,int len):将字符串按指定格式输出
    • void close()
    • void flush()
  • 子类OutputStreamWriter常用的构造方法
    • OutputStreamWriter(OutputStream out)
    • OutputStreamWriter(OutputStream out,String charsetName)

1.FileWriter类

该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

  • FileWriter类是OutputStreamWriter的子类
    • FileWriter (File file)
    • FileWriter (String name):根据所给文件名创建一个可供写人字符数据的输出流对象,原先的文件会被覆盖

使用FileWriter写文件

java 复制代码
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class FileWri {
    public static void main(String[] args) throws IOException {
        //创建FileReader对象
        Writer fw = new FileWriter("D:\\Cly\\javagj\\html开场.txt");
        //写文本文件
        fw.write("好好学习,天天向上");
        //关闭相关的流对象
        fw.close();
    }
}

2.BufferedWriter类

使用FileWriter类与BufferedWriter类,提高字符流写文本文件的效率

BufferedWriter类是Writer类的子类

BufferedWriter类带有缓冲区

  • BufferedWriter常用的构造方法
    • BufferedWriter(Writer out)

使用 BufferedWriter写文件

java 复制代码
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWri {
    public static void main(String[] args) throws IOException {
        //构造FileWriter对象和BufferedWriter对象
        FileWriter fw = new FileWriter("D:\\Cly\\javagj\\html开场.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        //调用方法写数据
        bw.write("hello");
        //清空和关闭
        bw.flush();
        bw.close();
    }
}

5.读写二进制文件

  • DataInputStream类
    • FileInputStream的子类
    • 与FileInputStream类结合使用读取二进制文件
  • DataOutputStream类
    • FileOutputStream的子类
    • 与FileOutputStream类结合使用写二进制文件

使用 DataInputStream 读二进制文件

java 复制代码
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DataIS {
    public static void main(String[] args) throws IOException {
        //构造数据输入流对象
        FileInputStream fis = new FileInputStream("D:\\Cly\\javagj\\pet.txt");
        DataInputStream dis = new DataInputStream(fis);
        //调用read()方法
        dis.read();
        //关闭数据输入流
        dis.close();
    }
}

使用 DataOutputStream写二进制文件

java 复制代码
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOS {
    public static void main(String[] args) throws IOException {
        //构造数据输出流对象
        FileOutputStream fos = new FileOutputStream("D:\\Cly\\javagj\\pet.txt");
        DataOutputStream dos = new DataOutputStream(fos);
        //调用write()方法写二进制文件数据
        dos.write(1);
        //关闭数据输出流
        dos.close();
    }
}

6.序列化和反序列化

序列化和反序列化的过程:

内存:序列化->流

二进制的字节序列:反序列化->java对象

序列化是将对象的状态写入到特定的流中的过程

反序列化则是从特定的流中获取数据重新构建对象的过程

实现序列化:

1.实现Serializable接口

2.创建对象输出流

3.调用writeObject()方法将对象写入文件

4.关闭对象输出流

注意:使用集合保存对象,可以将集合中的所有对象序列化

java 复制代码
//序列化
List<Student> list = new ArrayList<>();
list.add(new Student("张三",18));
list.add(new Student("李四",20));
try {
    创建对象输出流
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student"));
    //调用writeObject()方法将对象写入文件
    oos.writeObject(list);
    oos.flush();

    //关闭对象输出流
    oos.close();
} catch (IOException e) {
    e.printStackTrace();
}

实现反序列化:

1.实现Serializable接口

2.创建对象输入流

3.调用readObject()方法将对象写入文件

4.关闭对象输入流

注意:如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取

java 复制代码
//反序列化
try {
    //创建对象输入流
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student"));
    //调用readObject()方法将对象写入文件
    list = (List<Student>) ois.readObject();
    for (Student stu : list) {
        System.out.println(stu);
    }
    //关闭对象输入流
    ois.close();
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

结果:

Student{name='张三', age=18}

Student{name='李四', age=20}

相关推荐
暗黑起源喵2 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong7 分钟前
Java反射
java·开发语言·反射
王哲晓9 分钟前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_41113 分钟前
无网络安装ionic和运行
前端·npm
理想不理想v14 分钟前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云24 分钟前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:1379712058726 分钟前
web端手机录音
前端
齐 飞32 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
云空32 分钟前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
暮毅37 分钟前
10.Node.js连接MongoDb
数据库·mongodb·node.js