欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java I/O流

程序员文章站 2022-03-10 16:45:07
...

Java I/O

Java I/O流
数据来源于数据源-》【输入】在程序中进行操作-》【输出】保存到文件中

文件

Java API:java.io.File类

File类访问文件属性

File file = new File(String pathname);// c:/test.txt

File指文件也可以指目录

绝对路径:相对于某个软件的地址

相对路径:完整的路径名

File(); 括号里直接写文件会创建到eclipse的相对路径
Java I/O流

  • file.createNewFile(); 创建一个文件
  • file.exist(); 文件是否存在
  • file.isFile(); 文件是否为文件
  • file.isDirectory(); 文件是否为目录
  • file.delete(); 删除文件
  • file.getName();获取文件名称
  • file.getPath(); 获取文件相对路径
  • file.getAbsolutePath();获取文件绝对路径
  • file.length();获取文件字节

inputStream 输入流 读数据 以Writer作为基类

outputStream 输出流 写数据 以Reader作为基类

按流向分:输入流和输出流

按照处理数据单元分: 字节流和字符流

一个字节8位,一个字符16位

字节流:

​ 字节输入流InputStream基类

​ 字节输出流OutputStream基类

字符流:

​ 字符输入流Reader基类

​ 字符输出流Writer基类

字节流

InputSraeam(抽象类)

int read(); 从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果到了输入流的末尾,返回-1

int read(byte[]);从输入流读取若干字节,把这些字节保存到数组b中,返回的是读取到的字节数,如果到了输入流的末尾,返回-1

int read(byte[] b, int off, int len);从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标,len指读取的字节数目。返回的是读取到的字节数,如果到了输入流的末尾,返回-1

void close(); 关闭流

int available(); 可以从输入流中读取的字节数目

FileInputStream(子类)

FileInputStream fis = new FileInputStream(File file或地址);

OutputStream(抽象类)

  • void write(int c);
  • void write(byte[] buf);
  • void write(byte[], off, len);
  • void close();
  • void flush(); 强制将缓冲区清空

FileOutputStream(子类)

new FileOutputStream(File file);

new FileOutputStream(String path);

new FileOutputStream(String path, boolean append); append为true进行内容追加

字符流

GBK GB2312 中文编码

UTF-8 国际通用

字符输入流(读)

Reader

Reader类

​ read() 挨个读取字符

​ read(char[]) 读取字符到char数组

​ read(char[],off,len) 读取字符到char数组,off起始位置,len字符数目

​ close() 关闭流

InputStreamReader:(适配器模式)可以指定字符编码格式

​ new InputStreamReader(InputStream in)

​ // 指定字符编码charSetName

​ new InputStreamReader(InputStream in,String charSetName)

FileReader(子类)

​ new FileReader(File file) // 构造

​ new FileReader(String path)

常见问题:中文乱码

​ 原因:文件编码格式 和 程序环境的编码格式不一致

解决方案:

​ 字符流去读的时候,指定字符流的编码格式

FileReader 无法指定编码格式,会按照系统默认编码格式读

System.out.println(System.getProperty(“file.encoding”));

所以使用InputStreamReader

FileInputStream fis = new FileInputStream("J:/qingniao/test.txt");
			fr = new InputStreamReader(fis,"GBK");

缓冲流BufferedReader

将数据源的数据一次性读到缓冲区里,避免重复操作文件。

readLine()

输出要关闭缓冲流

字符输出流(写)

Writer

​ write(String)

​ close()

​ flush():清空缓存

​ OutputStreamWriter:(适配器模式)可以指定字符编码格式

​ new OutputStreamWriter(IOutputStream in)

​ // 指定字符编码charSetName

​ new OutputStreamWriter(OutputStream in,String charSetName)

​ FileWriter:一下两种构造,都可以重载,指定一个boolean是否在末尾添加

​ new FileWriter(File file)

​ new FileWriter(String path)

​ BufferedWriter

​ BufferedWriter类是Writer类的子类,带有缓冲区

​ 常用构造方法BufferedWriter(Writer out)

二进制文件的读写

DataInputStream

DataOutputStream

示例:

public class CopyPic {
	public static void main(String[] args) {
		// 输入流
		FileInputStream fis = null;
		DataInputStream dis = null;
		// 输出流
		FileOutputStream fos = null;
		DataOutputStream dos = null;
		try {
			fis = new FileInputStream("j:/qingniao/1.jpg");
			dis = new DataInputStream(fis);
			
			fos = new FileOutputStream("j:/qingniao/2.jpg");
			dos = new DataOutputStream(fos);
			int temp;
			while((temp = dis.read())!=-1) {
				dos.write(temp);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				dis.close();
				fis.close();
				fos.close();
				dos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

序列化和反序列化

内存(Java对象)-流(二进制的字节序列)

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

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

Serializable

ObjectInputStream 反序列化 readObject()->>类型转换

ObjectOutputStream 序列化 writeObject(stu)

常见异常:

NotSerializableException:类没有实现Serializable

transient屏蔽某些敏感字段的序列化