JAVA--字符、字节流

JAVA–字符、字节流

一、字符流

字符流:就是在字节流的基础上,加上编码,形成的数据流

字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流。

字符输入流:Reader

常用子类:FileReader

文件字符输入流常用方法:

read();

read(char[ ]);

read(char[ ] ,offset,len);

字符输出流: Writer

常用子类:文件字符输出流: Filewriter

文件字符输出常用方法:

writer();

writer(char[ ]);

writer(char[ ],offset,len);

writer(string);

flush()刷新缓冲区

注意:close()方法默认调用了flush()方法,但是flush()方法只刷新缓冲区,而close()还会关闭IO流

字符输入流代码示例:

 1 import java.io.File;
 2 import java.io.FileReader;
 3 import java.io.IOException;
 4 
 5 public class Demo5 {
 6 
 7     public static void main(String[] args) throws IOException{
 8         FileReader fr=new FileReader(new File("1.txt"));
 9         char[] ca=new char[1024];
10         int count=0;
11         while((count=fr.read(ca))!=-1) {
12             System.out.println(new String(ca,0,count));
13         }
14     }
15 }

编码与乱码:

乱码:编码与解码不一致,导致的乱码问题,每一种编码格式都有自己独特的编码,如果编码与解码不一致,势必会导致乱码,例如用Unicode编码,用gbk解码,就会字符与码值不匹配,从而导致乱码。

编码表:编码和解码使用的规则:

ASCII码:美国信息交换标准代码。单字节编码,不支持中文。

gbk:国标码;

Unicode/utf-8 :双字节编码,支持中文(万国码)

转换流

1.InputStreamReader 将字节流转换成字符流 输入
2.OutputStreamWriter 将字节流转换成字符流 输出
3. 构造方法:
① InputStreamReader(InputStream in)
② InputStreamReader(InputStream in, String cs)
③ OutputStreamWriter(OutputStream out)
④ OutputStreamWriter(OutputStream out, String charsetName)

Reader类

抽象类java.io.Reader是所有字符输入流的父类,该类定义了以字符为单位读取数据的基本方法,并在其子类进行了分化和实现。如果输入流的当前位置没有数据,返回-1。出现错误则抛出IOException异常。
在这里插入图片描述
Reader类的主要方法
在这里插入图片描述

writer类

Writer类是Java IO中所有Writer的基类。子类包括BufferedWriter和PrintWriter等等。

构造函数
protected Writer() 创建一个新的字符流 writer,其关键部分将同步 writer 自身。
protected Writer(Object lock) 创建一个新的字符流 writer,其关键部分将同步给定的对象。

方法
Writer append(char c) 将指定字符添加到此 writer。
Writer append(CharSequence csq) 将指定字符序列添加到此 writer。
Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列添加到此 writer.Appendable。
abstract void close() 关闭此流,但要先刷新它。
abstract void flush() 刷新该流的缓冲。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。
Writer类图
在这里插入图片描述
BufferedWriter 字符缓冲输出流
FileWriter 用来写入字符串到文件
OutputStreamWriter 写入字符,同时可以设置编码集。

二、字节流

字节输入流

InputStream 类及其子类的对象表示字节输入流,InputStream 类的常用子类如下。
ByteArrayInputStream 类:将字节数组转换为字节输入流,从中读取字节。
FileInputStream 类:从文件中读取数据。
PipedInputStream 类:连接到一个 PipedOutputStream(管道输出流)。
SequenceInputStream 类:将多个字节输入流串联成一个字节输入流。
ObjectInputStream 类:将对象反序列化。

使用 InputStream 类的方法可以从流中读取一个或一批字节。表 1 列出了 InputStream 类的常用方法。

表 1 InputStream类的常用方法
在这里插入图片描述

注意:在使用 mark() 方法和 reset() 方法之前,需要判断该文件系统是否支持这两个方法,以避免对程序造成影响。

字节输出流

OutputStream 类及其子类的对象表示一个字节输出流。OutputStream 类的常用子类如下。
ByteArrayOutputStream 类:向内存缓冲区的字节数组中写数据。
FileOutputStream 类:向文件中写数据。
PipedOutputStream 类:连接到一个 PipedlntputStream(管道输入流)。
ObjectOutputStream 类:将对象序列化。

利用 OutputStream 类的方法可以从流中写入一个或一批字节。表 2 列出了 OutputStream 类的常用方法。

表 2 OutputStream 类的常用方法
在这里插入图片描述

package demo01;

import java.io.FileInputStream;
import java.io.IOException;

public class Demo02InputStream {
public static void main(String[] args) throws IOException {
	//1.创建FileInputStream对象,构造方法中绑定要读取的数据
	FileInputStream fis = new FileInputStream("F:\\eclipse拓展\\21\\a.txt");
//	byte[] bytes=new byte[2];
//	int len=fis.read(bytes);
//	System.out.println("读取到的常数"+len);
//	System.out.println(bytes[0]);//取出数组里面的值
//	System.out.println(bytes[1]);
//	System.out.println(Arrays.toString(bytes));
//	System.out.println(new String(bytes));
//	
//	len =fis.read();
//	System.out.println("读取到的常数"+len);
//	System.out.println(new String(bytes));
//	
//	len =fis.read();
//	System.out.println("读取到的常数"+len);
//	System.out.println(new String(bytes));
//	
//	len =fis.read();
//	System.out.println("读取到的常数"+len);
//	System.out.println(new String(bytes));
//	
//	len =fis.read();
//	System.out.println("读取到的常数"+len);
//	System.out.println(new String(bytes));
	byte[] bytes =new byte[9];
	int len=0;
	while((len=fis.read(bytes))!=-1) {
		System.out.println(len);
		System.out.println(new String(bytes));
	}
	//3.释放资源
	fis.close();
}
}

package demo01;
import java.io.FileInputStream;
import java.io.IOException;

public class DemoInputStream {
public static void main(String[] args) throws IOException {
	FileInputStream fis = new FileInputStream("F:\\eclipse拓展\\21\\a.txt");
//	byte[] bytes =new bytes[2];
//	int len =fis.read(bytes);
//	System.out.println(len);
//	System.out.println(bytes[0]);
//	System.out.println(bytes[1]);

//	int len = fis.read();
//	System.out.println(len);
//	
//	len=fis.read();
//	System.out.println(len);
//	int len=0;
//	while ((len=fis.read())!=-1) {
		type type = (type) len.nextElement();
//		System.out.println((char)len);
//		
//	}
	byte[] bytes =new byte[8];
	int len=0;
	while ((len=fis.read())!=-1) { 
//	type type = (type) len.nextElement();
	System.out.println(len);
	System.out.println(new String(bytes));
	
}
	fis.close();
//	System.out.println((char)97);
}
}

在这里插入图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值