IO流,字节流和字符流
一、概述
IO流用来处理设备之间的数据传输 上传文件和下载文件
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
二、IO流的分类:
(1)流向:
输入流 读取数据
输出流 写出数据
(2)数据类型:
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
三、字节流
1、字节输出流(OutputStream抽象类,FileOutputStream实现)
FileOutputStream
(1)步骤
1、创建字节输出流对象
2、调用方法,写数据
3、释放资源
(2)构造方法:
FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件,没有文件,自动创建文件
(3)字节输出流写数据的几种方法:
public void write(int b):写入的是对应的ASCII码值
public void write(byte[] b):写入字节数组,也是对应的ASCII码值
public void write(byte[] b,int off,int len) :off是指定位置开始,len是写入的长度。
FileOutputStream fos = new FileOutputStream("c.txt");//创建文件输出流,可以将数据写入文件
// System.out.println(fos);//调用方法,写数据fos.write("大数据,yyds".getBytes());//方法参数是字节数组,把字符窜转换成字节数组//释放资源,防止资源浪费//close()关闭此文件输出流并释放与此流相关联的任何系统资源。fos.close();fos.write("继续写入".getBytes());//关闭了输出流,在写入会报错。
(4)close()关闭此文件输出流并释放与此流相关联的任何系统资源
释放资源,防止资源浪费
(5)写入数据后如何继续追加写入数据,和换行(\r\n)
//FileOutputStream(String name, boolean append)//创建文件输出流以指定的名称写入文件。//true表示的是可以追加写入数据FileOutputStream fos = new FileOutputStream("e.txt", true);fos.write("\r\n今天下雪了\r\n".getBytes());fos.write("但是没有看到积雪".getBytes());//释放资源fos.close();//....
2、字节输入流(InputStream抽象类,FileInputStream实现)
FileInputStream(一个文件只能读取一次,两次读取只显示一个结果,且close()后不能读取报错)
(1)构造方法
FileInputStream(File file) :参数是File类
FileInputStream(String name):参数是文件名,若文件不存在,运行报错。
(2)成员方法
public int read():一次只读一个字节,返回的是ASCII码值
public int read(byte[] b):一次读取一个字节数组
FileInputStream fis=new FileInputStream("a.txt");//第一种一次只读一个字符
// int i=0;
// while ((i=fis.read())!=-1){
// System.out.print((char) i);//强制转换
// }
// fis.close();//一次读取一个字节数组byte[] b=new byte[1024];int length=0; //这里的length表示文件里的真实字节长度while ((length=fis.read(b))!=-1){System.out.println(new String(b,0,length));}fis.close();
3、应用:a文件复制到b文件,读取a文件,写入b文件
FileInputStream fls=new FileInputStream("a.txt");//a文件必须存在FileOutputStream fps=new FileOutputStream("b.txt");//b文件可以不存在// int i=0;
// while ((i=fls.read())!=-1){
// fps.write(i);
// }byte[] b=new byte[1024];int length=0;while ((length=fls.read(b))!=-1){fps.write(b,0,length);}fls.close();fps.close();
4、字节缓冲流(方法相同,构造方法里参数是字节流对象)
(1)字节缓冲输出流
BufferedOutputStream
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("g.txt"));
(2)字节缓冲输入流
BufferedInputStream
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("g.txt"));
5、编码,解码
/*String(byte[] bytes, Charset charset)构造一个新的String,由指定charset编码表将字节数组解码。byte[] getBytes(Charset charset)使用给定的charset将该String编码为字节序列,将结果存储到新的字节数组中。 如果两个编码表不同,则解码失败
*/String s = "你好";byte[] bytes2 = s.getBytes("Unicode");编码printArray(bytes2);//输出字节数组的自定义方法System.out.println();//byte[] -- StringString s1 = new String(bytes2, "Unicode");解码System.out.println(s1);
-2,-1,79,96,89,125,
你好
四、字符流(=字节流+编码表)
1、字符输出流 (Writer类,子类OutputStreamWriter)
(1)OutputStreamWriter:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("写文件的名字"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("bbb.txt"),"GBK");
不加编码表的简化写法:FileWriter
FileWriter fw = new FileWriter("写文件的名字");
(2)方法:写入对应的编码表,默认ASCII码表
public void write(int c)
public void write(char[] cbuf)
public void write(char[] cbuf,int off,int len)
public void write(String str)
public void write(String str,int off,int len)
注意:当没有调用close()方法时,运行write()方法,发现文件中没有写入数据,文件实际上在硬盘存储的是字节,需要手动转换一下进行存储,可以调用flush()方法,close和flush方法都能进行转换,但flush不能关闭流对象。
2、字符输入流(Reader类 InputStreamReader子类)
(1)InputStreamReader
InputStreamReader isr = new InputStreamReader(new FileInputStream("bbb.txt"));
InputStreamReader isr = new InputStreamReader(new FileInputStream("ccc.txt"),"GBK");
简化写法:FileReader
FileReader fr = new FileReader("读取数据的文件名");
(2)方法
1、一次读取一个字符int ch = 0;while((ch = fr.read())!=-1){System.out.print((char) ch);}fr.close();2、一次读取一个字符数组char[] chars = new char[1024];int length = 0;while((length = fr.read(chars))!=-1){System.out.print(new String(chars,0,length));}fr.close();
3、字符缓冲流
(1)字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("a2.txt"));
(2)字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
(3)特殊方法
BufferedWriter:
void newLine()
写一行行分隔符。 行分隔符字符串由系统属性line.separator定义,并不一定是单个换行符('\ n')字符。
BufferedReader:
public String readLine()
读一行文字。 一行被视为由换行符('\ n'),回车符('\ r')中的任何一个或随后的换行符终止。
public class BufferedDemo1 {public static void main(String[] args) {try {write();} catch (Exception e) {e.printStackTrace();}try {read();} catch (Exception e) {e.printStackTrace();}}public static void read() throws Exception{//创建字符缓冲输入流对象BufferedReader br = new BufferedReader(new FileReader("a.txt"));//public String readLine() 一次读取一行文字//用循环读取String line = null;while ((line = br.readLine())!=null){System.out.println(line);}br.close();}public static void write() throws Exception{//创建字符缓冲输出流对象BufferedWriter bw = new BufferedWriter(new FileWriter("a3.txt"));for(int i=1;i<=10;i++){bw.write("大数据"+i);bw.newLine(); //根据系统写入换行符bw.flush();}bw.close();}
}
应用
/*把ArrayList集合中的字符串数据存储到文本文件*/
public class IOTest1 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();//向集合中添加元素list.add("hello");list.add("world");list.add("java");list.add("bigdata");BufferedWriter bw = null;//创建字符缓冲输出流对象try {bw = new BufferedWriter(new FileWriter("a4.txt"));for(String s : list){bw.write(s);bw.newLine();bw.flush();}} catch (IOException e) {e.printStackTrace();}finally {try {bw.close();} catch (IOException e) {e.printStackTrace();}}}
}
IO流,字节流和字符流相关推荐
- java byte char io流_吃透Java IO:字节流、字符流、缓冲流
前言有人曾问fastjson的作者(阿里技术专家高铁):"你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?" 高铁答道:"因为热爱本身, ...
- 吃透Java IO:字节流、字符流、缓冲流
IO流是Java中的一个重要构成部分,也是我们经常打交道的. 下面几个问题(问题还会继续补充),如果你能对答如流,那么恭喜你,IO知识掌握得很好,可以立即关闭文章.反之,你可以在后面得文章中寻找答案. ...
- 【Java基础】吃透Java IO:字节流、字符流、缓冲流
文章目录 [Java基础-3]吃透Java IO:字节流.字符流.缓冲流 一.初识java IO 1.1 IO流分类 1.1.1 输入流与输出流 1.1.2 字节流与字符流 1.1.3 节点流和处理流 ...
- java字符流字节流场景_【120期】Java IO:字节流、字符流、缓冲流
IO流是Java中的一个重要构成部分,也是我们经常打交道的.这篇关于Java IO的博文干货满满,堪称全网前三(请轻喷!) 下面几个问题(问题还会继续补充),如果你能对答如流,那么恭喜你,IO知识掌握 ...
- fileoutputstream 字节乱码_吃透Java IO:字节流、字符流、缓冲流
前言 有人曾问fastjson的作者(阿里技术专家高铁):"你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?" 高铁答道:"因为热爱本身 ...
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...
- Java基础---认识IO流---字节流、字符流---缓冲流---转换流
一.认识IO流 I/O就是用于设备之间进行数据交互的对象所属的类型 IO流的体系结构:根据分类,有四种流对象类型 字节流:可以直接操作字节信息的流对象 字节输入流:InputStream 字节输出流: ...
- IO流——字节流、字符流
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 流的分类 ① 流按其流向分为"输入流 ...
- Java 常用IO流(字节流和字符流)详解
一,简介及分类 IO流用来处理设备之间的数据传输:JAVA对数据的操作是通过流的方式:JAVA用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操作类型分为两种: 字节流 : 字节流 ...
- Java文件流字节流和字符流的区别
字节流和字符流的区别: 读写单位不同:字节流以字节(8bit)为单位, 字符流以字符为单位 处理对象不同:字节流能处理所有类型的文件,包括图片,视频等,而字符流只能处理字符类型的数据 字节流:一次读入 ...
最新文章
- shell的date
- 用CNN做NLP文本分类竞赛
- 指定 年 周 星期 获取这周的开始日期和结束日期
- ORM(Object Relational Mapping,对象/关系映射)
- linux下使用select实现精确定时器
- Javaweb学习笔记——使用Jdom解析xml
- 求5的阶乘和1-5的阶乘和
- [发布] QQGame 连连看辅助工具(限制功能版)
- 数据可视化之美-动态图绘制(以Python为工具)
- linux poodle漏洞,SSL POODLE[贵宾犬]漏洞的解决办法
- SpringBoot工程接入第三方支付渠道支付宝(C扫B支付)
- 小白都能学会的Spring Boot!
- 实时填报推送微信消息及审核(帆软报表)
- 推荐:(链接)幽默男女--绝对搞笑!!(每日更新)
- 阿里云免费的ssl证书到期怎么续费
- c语言自定义函写计算器,C语言实现计算器功能
- 遇到空指针异常的时候我们应该怎么办
- 套接字I/O模型-WSAEventSelect(转载)
- 差钱吗?周杰伦线上演唱会没关打赏惹争议,看看同时直播的腾格尔
- MySQL理论:脏读、不可重复读、幻读