JAVA常用IO流

IO流

输入:从磁盘到内存(当 read() 返回的 -1 代表文件已经读到末尾)

输出:从内存到磁盘

在流的处理过程中,要想把磁盘上一个文件从一个地方写入到另一个地方,需要保证写入的文件目录存在

分类:

字节流

FileInputStream:

字节输入流,继承 InputStream 抽象类,主要方法 read() 把磁盘文件内容读取到内存

read():表示每次读取一个字节并返回该字节代表的 Ascii 码(0~127)

read(byte[] byte):表示返回每次读取 byte 长度的字节并存入 byte 数组,且返回数组长度

FileOutputStream:

字节输出流,继承 OutputStream 抽象类,主要方法 write() 把内存的文件写入到磁盘

write(int Ascii):表示每次写入一个字节 Ascii 码所对应的字符

write(byte[] byte):表示将 byte 数组中的内容一次性写入到磁盘

字符流

FileReader:

字符输入流:继承 InputStreamReader(字节输入流转字符输入流的桥梁),主要方法 read()

read():读一个字符到内存(运行内存 DDR3 or 4),返回其 Ascii 码

read(char[] ch):返回每次读取 char 数组长度的字符并存入 char 数组,返回数组长度

FileWriter:

字符输出流:继承 OutputStreamWriter(字符输出流转字节输出流),主要方法 write()

write(int Ascii):写一个 Ascii 码所代表的字符到磁盘

write(char[] ch):表示将字符数组中的内容一次性写入磁盘

缓冲流

与字符输入输出流相比,多了一块缓冲区,减少磁盘与内存的交换,进而提高 cpu 效率

BufferedReader:

字符输入缓冲流:继承抽象类 Reader,新增 readLine() 读文件中的一行数据

BufferedWriter:

字符输出缓冲流:继承抽象类 Writer,每次将字符写入磁盘,现存入缓冲区,当调用 flush() 方法 或 关闭流时缓冲区的内容才会写入到磁盘

转换流

字节流与字符流之间的相互转换

InputStreamReader:

字节输入流转字符输入流

/**
* 字节输入流转字符输入流
*/
// 字节输入流对象
FileInputStream inputStream = new FileInputStream("hello");
// 字符输入流对象
InputStreamReader streamReader = new InputStreamReader(inputStream);
// operate
//		System.out.println((char)streamReader.read());// A
int len;
char[] cs = new char[5];
while ((len=streamReader.read(cs)) != -1) {
System.out.print(new String(cs, 0, len));
}
streamReader.close();
inputStream.close();
OutputStreamWriter:

字符输出流转字节输出流

OutputStream out = new FileOutputStream("hello", true);
/**
 * 字符输出流转字节输出流
 */
OutputStreamWriter writer = new OutputStreamWriter(out);
String s = "\n人生路漫漫";
writer.write(s);
// 刷新,从缓冲区存入磁盘
writer.flush();
writer.close();

编码集

  1. Ascii 码:0 ~ 127 代表字符,符号
  2. GBK:两个字节代表一个汉字,英文占据一个字节
  3. UTF-8:1 ~ 4 个字节代表一个符号,一个汉字占据三个字节,英文占据三个字节

编码与节码不一致将产生乱码

String s = "山海经";
// getBytes() 转换为默认字符节码,这里为 utf-8,一个字符转三个字节
byte[] utf8 = s.getBytes();
// [-27, -79, -79, -26, -75, -73, -25, -69, -113]
System.out.println(Arrays.toString(utf8));

// gbk 每个字符用两个 byte 来表示
byte[] gbk = s.getBytes("gbk");
// [-55, -67, -70, -93, -66, -83]
System.out.println(Arrays.toString(gbk));

FileOutputStream stream = new FileOutputStream("hello", true);
stream.write(gbk);// 我的 eclipse 设置默认 utf-8编码集,写入 gbk 将是乱码
stream.close();

JDK 1.7 IO异常处理

try ( 需要关闭得流资源 ) {

​ 可能出现异常得代码;

} catch ( 异常类型 对象 ) {

}

随机访问文件 RandomAccessFile

较其他流主要新增(详情查阅 API):

void seek(long pos):设置文本指针偏移量,从文本的偏移量位置开始读取或写入

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值