java中输入与输出处理与流的理解

 满招损,谦受益。

目录

JAVA I/O

文件

什么是文件?

文件一般存储在哪里?

Java程序如何访问文件属性?

File类

File类访问文件属性

File类的常用方法

概念:

Java流的分类

InputStream类

InputStream类常用方法

子类FileInputStream常用的构造方法

使用FileInputStream 读文本文件

OutputStream类

OutputStream类常用方法

子类FileOutputStream常用的构造方法

注意:

使用FileOutputStream 写文本文件

Reader类

Reader类常用方法

子类InputStreamReader常用的构造方法

FileReader类

使用FileReader读取文件

BufferedReader类

概念:

注意:

BufferedReader常用的构造方法

子类BufferedReader特有的方法

使用 BufferedReader读文本文件

解决读取时中文乱码

Writer类

Writer类常用方法

子类OutputStreamWriter常用的构造方法

FileWriter类

概念:

使用FileWriter写文件

BufferedWriter类

如何提高字符流写文本文件的效率?

BufferedWriter常用的构造方法

使用 BufferedWriter写文件

读写二进制文件

DataInputStream类

DataOutputStream类

使用 DataInputStream 读二进制文件

使用 DataOutputStream写二进制文件

序列化和反序列化

序列化和反序列化的过程

序列化的步骤

反序列化的步骤

总结:


JAVA I/O

文件

什么是文件?

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

文件一般存储在哪里?

硬盘,u盘、、、、

Java程序如何访问文件属性?

import java.io.File;

File类

File类访问文件属性

// 获取一个File类对象, 这个对象指向计算机F盘中的demo.txt文件
File file1 = new File("F:\\demo.txt");
File file2 = new File("F:/test");

File类的常用方法

方法名称说明
boolean exists( )判断文件或目录是否存在
boolean isFile( )判断是否是文件
boolean isDirectory( )判断是否是目录
String getPath( )返回此对象表示的文件的相对路径名
String getAbsolutePath( )返回此对象表示的文件的绝对路径名
String getName( )返回此对象表示的文件或目录的名称
boolean delete( )删除此对象指定的文件或目录
boolean createNewFile( )创建名称的空文件,不创建文件夹
long length()返回文件的长度,单位为字节*, 如果文件不存在,则返回 0L

概念:

  • 流是一组有序的数据序列

  • 以先进先出方式发送信息的通道

Java流的分类

按流向区分:

  • 输出流:OutputStream和Writer作为基类

  • 输入流:InputStream和Reader作为基类

按照处理数据单元划分:

  • 字节流:

    • 字节输入流InputStream基类

    • 字节输出流OutputStream基类

  • 字符流:

    • 字符输入流Reader基类

    • 字符输出流Writer基类

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

InputStream类

InputStream类常用方法

int read( ) int read(byte[] b) int read(byte[] b,int off,int len) void close( ) int available():可以从输入流中读取的字节数目

子类FileInputStream常用的构造方法

FileInputStream(File file) FileInputStream(String name)

使用FileInputStream 读文本文件

//创建File类对象
File file = new File("F:/a.txt");
//创建FileInputStream类对象
FileInputStream fis = new FileInputStream(file);
        
//读取数据
int num;
while((num=fis.read())!=-1){
    System.out.print((char)num);
}
        
System.out.println("数据读取完毕");
        
//数据读取完毕之后,关闭流
fis.close();

OutputStream类

OutputStream类常用方法

void write(int c) void write(byte[] buf) void write(byte[] b,int off,int len) void close() void flush():强制把缓冲区的数据写到输出流中

子类FileOutputStream常用的构造方法

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

注意:

1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容 2.创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件

使用FileOutputStream 写文本文件

// 创建File类对象
File file = new File("F:/a.txt");
​
// 创建FileOutputStream类对象
FileOutputStream fos = null;
try {
    // 构造方法FileOutputStream(File file)和FileOutputStream(String
    // path):通过这两个构造方法创建的输出流对象在对外进行数据输出的时候,会覆盖文件中原来的数据
    // FileOutputStream fos = new FileOutputStream(file);
    // FileOutputStream(File file,boolean
    // append)和FileOutputStream(String path,boolean
    // append):使用这两个构造方法创建输出流对象的时候,将第二个参数赋值为true,则在对外进行输出数据的时候,不会覆盖文件中原来的数据
    fos = new FileOutputStream(file, true);
    // 调用写的方法,将数据写入到文件中
    fos.write(65);
    System.out.println("数据写入完毕");
​
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 关闭流
    try {
        if (fos != null) {
            fos.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Reader类

Reader类常用方法

int read( ) int read(char[] c) read(char[] c,int off,int len) void close( )

子类InputStreamReader常用的构造方法

InputStreamReader(InputStream in) InputStreamReader(InputStream in,String charsetName)

FileReader类

FileReader类是InputStreamReader的子类

- FileReader(File file)
- FileReader(String name)

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

使用FileReader读取文件

与字节流FileInputStream类实现文本文件读取步骤类似 引入相关的类

import java.io.Reader;
import java.io.FileReader;
Import java.io.IOExceprion;

创建FileReader对象

Reader fr= new FileReader("D:\\myDoc\\简介.txt");

读取文本文件的数据

fr.read(); 

关闭相关的流对象

fr.close();
// 创建FileReader类对象,FileReader类对象只能按照本地平台的编码格式读取文件,如果文件编码和本地平台编码格式不一样,会出先乱码的现象
FileReader fr = null;
try {
    fr = new FileReader("F:/a.txt");
    char[] chs = new char[1024];
    // 读取数据
    int num = fr.read(chs);
    for (int i = 0; i < num; i++) {
        System.out.print(chs[i]);
    }
​
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

BufferedReader类

概念:

BufferedReader类是Reader类的子类 BufferedReader类带有缓冲区 按行读取内容的readLine()方法

注意:

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

BufferedReader常用的构造方法

BufferedReader(Reader in)

子类BufferedReader特有的方法

readLine()

使用 BufferedReader读文本文件

 
// 创建InputStream类对象,但是InputStream类是一个抽象类,不能创建对象,可以将其引用指向子类
InputStream is = null;
// 创建Reader类对象,但是Reader类是一个抽象类,不能创建对象,可以将其引用指向子类(包含孙子类)的实例
Reader reader = null;
// 创建BufferedReader类对象
BufferedReader br = null;
try {
    is = new FileInputStream("F:/demo.txt");
    reader = new InputStreamReader(is);
    br = new BufferedReader(reader);
​
    // 读取文件
    // String str = br.readLine();
    // System.out.println(str);
    // String str2 = br.readLine();
    // System.out.println(str2);
    String str;
    while ((str = br.readLine()) != null) {
        System.out.println(str);
    }
​
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        br.close();
        reader.close();
        is.close();
    } catch (IOException e) {
​
        e.printStackTrace();
    }
}
 

解决读取时中文乱码

FileReader fr = new FileReader("c:\\myDoc\\hello.txt");
BufferedReader br=new BufferedReader(fr); 
​
FileInputStream fis=new FileInputStream("c:\\myDoc\\hello.txt");
//使用InputStreamReader并设置编码格式
InputStreamReader fr=new InputStreamReader(fis,"UTF-8"); 
BufferedReader br=new BufferedReader(fr); 

Writer类

Writer类常用方法

write(String str) write(String str,int off,int len) void close() void flush()

子类OutputStreamWriter常用的构造方法

OutputStreamWriter(OutputStream out) OutputStreamWriter(OutputStream out,String charsetName)

FileWriter类

概念:

FileWriter类是OutputStreamWriter的子类

  • FileWriter (File file)

  • FileWriter (String name)

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

使用FileWriter写文件

与字节流FileOutputStream类实现向文本文件写入数据步骤类似 引入相关的类

import java.io.Reader;
import java.io.FileWriter;
import java.io.IOException;

创建FileReader对象

Writer fw= new FileWriter("D:\\myDoc\\简介.txt");

写文本文件

fw.write(); 

关闭相关的流对象

fw.close(); 
// 创建FileWriter类对象
FileWriter fw = null;
try {
    fw = new FileWriter("F:/demo.txt", false);
    fw.write("hello java");
    System.out.println("文件写入完毕");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        fw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

BufferedWriter类

如何提高字符流写文本文件的效率?

使用FileWriter类与BufferedWriter类 BufferedWriter类是Writer类的子类 BufferedWriter类带有缓冲区

BufferedWriter常用的构造方法

BufferedWriter(Writer out)

使用 BufferedWriter写文件

// 创建Writer类对象,但是Writer类是一个抽象类,不能直接创建对象,但是可以创建引用指向其子类对象
Writer writer = null;
// 创建BufferedWriter类对象
BufferedWriter bw = null;
try {
    writer = new FileWriter("F:/demo.txt", true);
    bw = new BufferedWriter(writer);
    // 先向文件中插入一个换行
    bw.newLine();
    bw.write("hello html");
    bw.newLine();
    bw.write("hello css");
    System.out.println("数据写入完毕");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        bw.close();
        writer.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

读写二进制文件

DataInputStream类

FileInputStream的子类 与FileInputStream类结合使用读取二进制文件

DataOutputStream类

FileOutputStream的子类 与FileOutputStream类结合使用写二进制文件

使用 DataInputStream 读二进制文件

import java.io.FileInputStream; 
import java.io.DataInputStream;
FileInputStream fis=new 
FileInputStream("C:\\HelloWorld.class");
DataInputStream dis=new DataInputStream(fis);
​
dis.read ();
dis.close();

使用 DataOutputStream写二进制文件

import java.io.FileOutputStream; 
import java.io.DataOutputStream;
​
FileOutputStream outFile = new FileOutputStream("C:\\temp.class");
DataOutputStream out=new DataOutputStream(outFile);
​
out.write();
out.close();

序列化和反序列化

序列化和反序列化的过程

 

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

序列化的步骤

 

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

反序列化的步骤

 

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

总结:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值