Java I/O详细笔记

1.什么是流

内存与存储设备之间传输数据的通道。

2.流的分类

2.1根据方向分为输入流输出流

输入流:将存储设备中的内容读取到内存中。

输出流:将内存中的内容写入到存储设备中。

2.2根据单位分为字节流与字符流

字节流:以字节为单位读取输入流,支持所有数据。

字符流:以字符为单位读取输入流,只能是文本数据。

2.3根据功能分为节点流与过滤流

节点流:实际传输数据的读写功能。

过滤流:在节点流的基础之上增强功能。

3.字节流

字节流的父类InputStream与OutputStream,都是抽象类。

InputStream:字节输入流

int read()读取下一个字节,字节值范围是0-255。如果返回-1代表已到流的末尾。
int read(byte[] b)以指定长度的字节数组读取流。返回读取到的实际字节数组个数,如果返回-1代表已到流的末尾。
int read(byte[] b,int off,int len)以指定的字节数组读取流,并可以通过off指定字节数组覆盖位置,len指定字节输入覆盖的长度。如果返回-1代表已到流的末尾。

OutputStream:字节输出流

void write(int b)将指定的字节写入该输出流中
void write(byte[] b)将指定的字节数组写入该输出流
void write(byte[] b,int off,int len)将指定的字节数组写入该输出流,off指定字节输入写入的起始位置,len指定写入的字节数组长度。

4.FileInputStream

文件读取流。

FileInputStreamStudy.txt内容:

  1. abcdefg

示例代码:  

package com.gisapartment.java.io;
import java.io.FileInputStream;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class FileInputStreamStudy {
	public static void main(String[] args) throws IOException {
		FileInputStream fileInputStream = new FileInputStream("FileInputStreamStudy.txt");
		System.out.println("方法1:使用read()方法:");
		int t;
		while ((t=fileInputStream.read())!=-1){
			System.out.print((char) t);
		}
		fileInputStream.close();
		fileInputStream = new FileInputStream("FileInputStreamStudy.txt");
		System.out.println();
		System.out.println("方法2:使用read(byte b[])方法:");
		byte[] temp = new byte[3];
		int count;
		while ((count=fileInputStream.read(temp))!=-1){
			System.out.print(new String(temp,0,count));
		}
		fileInputStream.close();
		System.out.println();
		System.out.println("读取完毕!");
	}
}

5.FileOutputStream

文件输出流。

注意:可以通过FileOutputStream构造函数指定是否追加输出,而不是覆盖输出。

示例代码:

package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class FileOutputStreamStudy {
	public static void main(String[] args) throws IOException {
		FileOutputStream fileOutputStream = new FileOutputStream("FileOutputStreamStudy.txt",true);
		String content = "www.gisapartment.com\n";
		fileOutputStream.write(content.getBytes());
		fileOutputStream.close();
		System.out.println("输出完毕!");
	}
}

6.字节流复制文件

示例代码:

package com.gisapartment.java.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class CopyFile {
	public static void main(String[] args) throws IOException {
		FileInputStream fileInputStream = new FileInputStream("FileInputStreamStudy.txt");
		FileOutputStream fileOutputStream = new FileOutputStream("FileInputStreamStudyCopy.txt");
		byte[] content = new byte[1024];
		int count = 0;
		while ((count=fileInputStream.read(content))!=-1){
			fileOutputStream.write(content, 0, count);
		}
		fileInputStream.close();
		fileOutputStream.close();
	}
}

7.字节缓冲流

缓冲流:BufferedInputStream/BufferedOutputStream

  • 提高IO效率,减少访问磁盘的次数。
  • 数据存储在缓冲区中,flush将缓冲区的内容写入文件中,也可以直接close。

BufferedInputStream示例代码:

package com.gisapartment.java.io;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class BufferedInputStreamStudy {
	public static void main(String[] args) throws IOException {
		BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("FileInputStreamStudy.txt"));
		byte[] content = new byte[1024];
		int count = 0;
		while ((count=bufferedInputStream.read(content))!=-1){
			System.out.print(new String(content,0,count));
		}
		bufferedInputStream.close();
	}
}

BufferedOutputStream示例代码:

package com.gisapartment.java.io;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class BufferedOutputStreamStudy {
	public static void main(String[] args) throws Exception {
		BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("BufferedOutputStreamStudy.txt"));
		for (int i = 0; i < 10; i++) {
			bufferedOutputStream.write("www.gisapartment.com\n".getBytes());
			bufferedOutputStream.flush();
		}
		bufferedOutputStream.close();
	}
}

8.对象流

ObjectInputStream/ObjectOuputStream

  • 增强了缓冲区功能。
  • 增强了读写8种基本数据类型和字符串功能。
  • 增强了读写对象的功能:readObject() 从流种读取一个对象;writeObject(Object obj)向流中写入一个对象。

序列化示例代码:

package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class SerializationStudy {
	public static void main(String[] args) throws IOException {
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("SerializationStudy.object"));
		Person person = new Person();
		person.setAge(20);
		person.setName("GIS公寓");
		objectOutputStream.writeObject(person);
		objectOutputStream.close();
	}
}

反序列化示例代码:

package com.gisapartment.java.io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class DeserializationStudy {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("SerializationStudy.object"));
		Object object = objectInputStream.readObject();
		if (object instanceof Person){
			System.out.println(object);
		}
		objectInputStream.close();
	}
}

输出结果:

Person{name='GIS公寓', age=20}

注意:

  1. 序列化的类必须实现Serializable接口。
  2. 序列化类中的每个对象属性必须实现Serializable接口。
  3. 序列化ID(serialVersionUID)是对象版本号,保证序列化的类与反序列化的类是同一个类。
  4. 使用transient(短暂的)修饰的属性,不能被序列化。
  5. 静态属性不能被序列化。
  6. 序列化多个对象,可以通过集合实现。

9.常见字符编码

编码方式与解码方式不一致时,会出现乱码。

名称范围字节数
ISO-8859-1收录ASCII、西欧、希腊语、泰语、阿拉伯语、希伯来语1
UTF-8针对Unicode码表的的可变长度字符编码,包含所有国家常见字符1、2、3
GB2312简体中文1、2
GBK简体中文、扩充1、2
BIG5台湾,繁体中文2

10.字符流

字符流的父类Reader与Writer,都是抽象类。

Reader:字符输入流

  • int read()
  • int read(char[] c)
  • int read(char[] b,int off,int len)

Writer:字符输出流

  • void write(int n)
  • void write(String str)
  • void write(char[] c)

11.文件字符流

FileReader:文件字符读取流。

示例代码:

package com.gisapartment.java.io;
import java.io.FileReader;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class FileReaderStudy {
	public static void main(String[] args) throws IOException {
		FileReader fileReader = new FileReader("FileReaderStudy.txt");
		System.out.println("方法1:使用read()方法:");
		int count = 0;
		while ((count=fileReader.read())!=-1){
			System.out.print((char) count);
		}
		fileReader.close();
		System.out.println();
		System.out.println("方法2:使用read(byte b[])方法:");
		char[] content = new char[1024];
		fileReader = new FileReader("FileReaderStudy.txt");
		while ((count=fileReader.read(content))!=-1){
			System.out.print(new String(content, 0, count));
		}
		System.out.println();
		fileReader.close();
	}
}

FileWriter:文件字符写入流。

示例代码:

package com.gisapartment.java.io;
import java.io.FileWriter;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class FileWriterStudy {
	public static void main(String[] args) throws IOException {
		FileWriter fileWriter = new FileWriter("FileWriterStudy.txt");
		for (int i = 0; i < 10; i++) {
			fileWriter.write("GIS公寓\n");
			fileWriter.flush();
		}
		fileWriter.close();
	}
}

12.字符流复制文件

注意:只能复制文本文件,不能复制图片、视频等其它文件。

示例代码:

package com.gisapartment.java.io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class CopyFileUseCharStream {
	public static void main(String[] args) throws IOException {
		FileReader fileReader = new FileReader("FileWriterStudy.txt");
		FileWriter fileWriter = new FileWriter("CopyFileUseCharStream.txt");
		int count = 0;
		while ((count=fileReader.read())!=-1){
			fileWriter.write(count);
		}
		fileWriter.close();
		fileReader.close();
	}
}

13.字符缓冲流

缓冲流:BufferedReader/BufferedWriter。

  • 高效读写。
  • 支持输入换行符,调用指定的方法。
  • 可一次写一行、读一行。

BufferedReader示例代码:

package com.gisapartment.java.io;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class BufferedReaderStudy {
	public static void main(String[] args) throws IOException {
		BufferedReader bufferedReader = new BufferedReader(new FileReader("BufferWriterStudy.txt"));
		String line = null;
		while ((line=bufferedReader.readLine())!=null){
			System.out.println(line);
		}
		bufferedReader.close();
	}
}

BufferedWriter示例代码:

package com.gisapartment.java.io;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class BufferedWriterStudy {
	public static void main(String[] args) throws IOException {
		BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("BufferWriterStudy.txt"));
		for (int i = 0; i < 10; i++) {
			bufferedWriter.write("GIS公寓");
			bufferedWriter.newLine();
			bufferedWriter.flush();
		}
		bufferedWriter.close();
	}
}

14.打印流

PrintWriter:

  • 封装了print()/println()方法,支持写入后换行。
  • 支持数据原样打印。

示例代码:

package com.gisapartment.java.io;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class PrintWriterStudy {
	public static void main(String[] args) throws FileNotFoundException {
		PrintWriter printWriter = new PrintWriter("PrintWriterStudy.txt");
		printWriter.println(1024);
		printWriter.println("GIS公寓");
		printWriter.println(13.14);
		printWriter.println(true);
		printWriter.close();
	}
}

15.转换流

桥转换流:InputStreamReader/OutputStreamWriter

  • 可将字节流转换为字符流。
  • 可设置字符的编码方式。

InputStreamReader示例代码:

package com.gisapartment.java.io;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class InputStreamReaderStudy {
	public static void main(String[] args) throws IOException {
		InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("InputStreamReaderStudy.txt"), StandardCharsets.UTF_8);
		int data = 0;
		while ((data=inputStreamReader.read())!=-1){
			System.out.print((char) data);
		}
		inputStreamReader.close();
	}
}

OutputStreamWriter示例代码:

package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class OutputStreamWriterStudy {
	public static void main(String[] args) throws IOException {
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("OutputStreamWriterStudy.txt"), StandardCharsets.UTF_8);
		for (int i = 0; i < 10; i++) {
			outputStreamWriter.write("GIS公寓\n");
			outputStreamWriter.flush();
		}
		outputStreamWriter.close();
	}
}

16.File类

概念:代表物理盘符中的一个文件或者文件夹。

常用方法:

方法名解释
createNewFile()创建一个新文件
mkdir()创建一个新目录
delete()删除文件或空目录
exists()判断文件或文件夹是否存在
getAbsolutePath()获取文件的绝对路径
getName()获取文件名,注意会带文件后缀
getParent()获取文件/目录所在的目录
isDirectory()判断是否是目录
isFile()是否为文件
length()获取文件的长度
listFiles()列出目录中的所有内容
renameTo()修改文件名为
deleteOnExit()jvm退出后删除文件
canWrite()判断文件是否可写入

FileFilter示例代码:

package com.gisapartment.java.io;
import java.io.File;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class FileFilterStudy {
	public static void main(String[] args) {
		File file = new File(System.getProperty("user.dir"));
		File[] files = file.listFiles(pathname -> pathname.getName().endsWith("txt"));
		for (File file1 : files) {
			System.out.println(file1);
		}
	}
}

17.Properties

属性集合,线程安全。

特点:

  1. 存储属性名和属性值。
  2. 属性名和属性值都是字符串类型。
  3. 没有泛型。
  4. 和流有关。

示例代码:

package com.gisapartment.java.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.Set;
/**
 * @author www.gisapartment.com
 * Copyright © www.gisapartment.com
 */
public class PropertiesStudy {
	public static void main(String[] args) throws IOException {
		Properties properties = new Properties();
		properties.setProperty("String_Title", "PropertiesStudy");
		properties.setProperty("String_Name", "Properties");
		Set<String> strings = properties.stringPropertyNames();
		for (String string : strings) {
			System.out.println("Key:"+string+";"+properties.getProperty(string));
		}
		
		// 输出
		PrintWriter printWriter = new PrintWriter("PropertiesStudy.txt");
		properties.list(printWriter);
		printWriter.close();
		// 加载
		FileOutputStream fileOutputStream = new FileOutputStream("PropertiesStudyStore.txt");
		properties.store(fileOutputStream, "www.gisapartment.com");
		fileOutputStream.close();
	}
}

PropertiesStudy.txt内容:

-- listing properties --
String_Name=Properties
String_Title=PropertiesStudy

PropertiesStudyStore.txt内容:

#www.gisapartment.com
#Wed Apr 28 21:27:36 CST 2021
String_Name=Properties
String_Title=PropertiesStudy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值