IO流——字节流

IO流分类

按数据流向分:

1.输入流		Reader
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181219183139602.png)
2.输出流		Writer
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181219183219933.png)

按数据操作单位分:

1.字节流		InputStream
2.字符流		OutputStream

主要学习read(读)和write(写)的方法

常见用途

(1)记事本的保存功能
(2)开发中的日志功能
。。。。。。

字节流——InputStream&OutputStream

(1)文件输入流(FileInputStream)

构造方法:

 FileInputStream(File file)  // 表示从file指向的文件中读取
 FileInputStream(String name) // name表示文件的路径名(路径+文件名) 

读取方法:

int read() 
		调用一次读到一个数据字节,返回的int值就是读到的数据
		如果已到达文件末尾,则返回 -1		 	
int read(byte[] b) 
		调用一次本方法表示可以读取多个数据
		读到的内容保存传入的byte数组b中
		返回的是本次调用方法读到的数据字节个数
	 思考? b数组是有长度,干嘛还要单独返回读到的个数呢?
int read(byte[] b, int off, int len) 
		和上面的第二个类似,可以指定从b数组什么位置开始装

Code:
读取单个字节

FileInputStream fis = new FileInputStream("C:/test.txt");
int read = fis.read();
System.out.println((char)read);

使用循环读取整个文件内容

int n;
while ((n = fis.read()) != -1) {
	System.out.println((char)n);
}

使用一次读取一个数组的方式


int i ; //-1表示已经结束
byte[] byt = new byte[1024*2];
while ((i = fis.read(byt)) != -1) {
	展示读到的数据很麻烦,便利byte数组一个一个的强转
	其实,可以直接以byte数组为参数来new一个字符串String  (String中有对应的构造方法)
	System.out.println(new String(byt,0,i));
}

(2)文件输出流(FileOutputStream)

构造方法:

FileOutputStream(File file) 
FileOutputStream(String name)

下面的两个构造方法,可以设置是否向文件中追加数据
FileOutputStream(File file, boolean append) 
FileOutputStream(String name, boolean append) 

写入方法:

void write(int b)	  //调用一次写入一个数据字节
void write(byte[] b)   //调用一次,可以把一个byte数组中的数据写入
void write(byte[] b, int off, int len)  //调用一次,把b数组中的一部分数据写入

注意:
1.文件不存在会自己创建文件并写入
2.如果路径不存在会报错
3.只有文件可以读写,数据也只有写入文件(文件夹不行)
4.当写入与文件一致的字符编码时,得到相应的字符
5.磁盘已经存在抽象路径时,并且是文件夹,就不能创建,并且拒绝方法

Code:
写入单个字节

OutputStream fos = new FileOutputStream("C:/test.txt");
fos.write(97);  写入一个字节

写入一个字符串

fos.write("1wdsads".getBytes());

读写乱码问题

1.乱码原因
(1)解码与编码规则不一致
(2)字符编码不支持中文

一个中文是不是一个数据字节,有可能是两个,也可能是三个,具体是几个看字符编码, read() 一次读到的是一个数据字节,所以解码时会乱码

编码 : String —> byte[]
String中有对应的方法:
byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列
byte[] getBytes(Charset charset) 使用指定的字符编码来编码字符串
byte[] getBytes(String charsetName) 使用指定的字符编码来编码字符串

解码 : byte[] —> String
String中有对应的构造方法:
String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组
String(byte[] bytes, Charset charset) 使用指定的字符集来解码指定的byte数组
String(byte[] bytes, String charsetName) 使用指定的字符集来解码指定的byte数组

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值