Java中流-----个人总结心得
流
字符流
字节流
缓冲区
数据流---用于传输数据。IO流---Input/Output流。数据从外部流向程序---输入流;数据从程序流向外部的时候--输出流。读取一个文件---数据从文件流向程序---输入流;向一个文件中写入数据---数据从程序流向文件---输出流
根据数据流动的方向:输入流/输出流
根据数据传输的形式:字节流/字符流
|
输入流 |
输出流 |
|
|
字节流 |
InputStream |
OutputSteam |
|
字符流 |
Reader |
Writer |


这四个类是Java中四个流的基本类,但是这四个类都是抽象类,都不能用于直接创建对象
数据的来源:硬盘、网络、内存、输入设备
向一个文件中去写入数据---txt文件---字符流、输出流、文件流---
最简单的一个输入流,写入缓冲区中,再从缓冲区中读取出来
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String c; //设置一个字符串去接收缓冲区
InputStreamReader IsReader=new InputStreamReader(System.in);//输入流:键盘输入
BufferedReader bReader=new BufferedReader(IsReader);//将输入的存入缓冲区中
System.out.println("输入字符按q退出");
do {
c= bReader.readLine();//从缓冲区中读取
System.out.println(c);
} while (!c.equals("q"));
}
字符流
FileWriter
构造函数
FileWriter(String name)--传入文件路径,操作对应的文件---当文件不存在的时候,会创建这个文件;如果文件存在,则创建一个新文件覆盖源文件。
重要方法
write(String s)---写出字符串。数据不是直接写到目的地而是写到缓冲区中,等到缓冲区满了之后才会写到目的地中
flush()---冲刷缓冲区
close()---关闭流。流在关闭之前会自动的冲刷缓冲区。
代码实现:
public static void main(String[] args) throws IOException {
//创建一个FileWriter对象,并指定文件路径,该文件会被创建到指定目录下。如果该目录有同名文件,那么该文件将被覆盖。
FileWriter fw = new FileWriter("1.txt");
//调用write的方法将字符串写到流中
fw.write("hello world!");
//刷新流对象缓冲中的数据,将数据刷到目的地中
fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据。当我们结束输入时候,必须close();
fw.write("刷新");
fw.close();
//flush和close的区别:flush刷新后可以继续输入,close刷新后不能继续输入。
}
流的异常处理
1. 流对象要外置定义内置初始化
2. 判断流对象是否初始化成功---判断流对象是否为空
3. 关流操作无论成功与否,都需要将流对象值为null
FileReader
| 1 | public int read() throws IOException 读取单个字符,返回一个int型变量代表读取到的字符 |
| 2 | public int read(char [] c, int offset, int len) 读取字符到c数组,返回读取到字符的个数 |
代码实现:
public static void main(String[] args) throws IOException {
//创建FileReader对象,并读取1.txt文件
FileReader fr = new FileReader("1.txt");
//单字符读取 。。。。。。多字符的读取,创建数组将1.txt文件存入数组中,在读取出来char [] buf = new char[6];
int ch = 0;
//一直读取文件中的内容直到文件的尾部
while((ch = fr.read())!=-1) {
/* 输出字符串
*
* String(char[] value , int offest,int count) 分配一个新的String,包含从offest开始的count个字符 new String(buf,0,ch}
* */
System.out.print((char)ch);
}
fr.close(); //关闭流
}
两个结合可以实现一个文件的拷贝
将1.txt文件内容拷贝到2.txt中
代码实现:
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("1.txt");//先读取需要拷贝的文件
FileWriter fw=new FileWriter("2.txt");//拷贝文件内容复制到的另个文件路径
int ch=0;
while ((ch=fr.read())!=-1) { //读个读取内容
fw.write((char)ch); //将读取的内容写入文件中
}
fr.close(); //关闭读取流
fw.close();//关闭写入流
}
字节流
其实字节流和字符流是差不多的形式,看懂了上面,下面就不用多说了
文件输入流: FileInputStream类
简要的说是打开文件,将文件数据读取到内存中
代码实现:
public static void main(String[] args) throws IOException {
FileInputStream fStream=new FileInputStream("1.txt");//创建文件输入流对象
int ch=0;
while ((ch=fStream.read())!=-1) { //依次读取文件内容赋值给ch
System.out.print((char)ch); //输出内容-----(char)ch转换成字符输出
}
}
文件输出流: FileOutputStream类
目的是将内存中的数据读取到文件中
代码实现:
public static void main(String[] args) throws IOException {
int count, n = 20;
//创建字节数组
byte buffer[] = new byte[n];
//将输入的字节存入字节数组中
count = System.in.read(buffer);//System.in.read()返回的是输入数值的 ASKII 码(一个 int 整数)
FileOutputStream fO=new FileOutputStream("1.txt"); //创建文件输出流对象,指定文件路径
fO.write(buffer, 0, count); //将字节写入文件,显示字符
fO.close();//关闭流
}
FileInputStream流和FileOutputStream的应用
将1.txt文件拷贝到2.txt 文件中
代码实现:
public static void main(String[] args) throws IOException {
FileInputStream fIn=new FileInputStream("1.txt");//创建文件输入流对象 拷贝对象文件,指定文件路径
FileOutputStream fOut=new FileOutputStream("2.txt");//创建文件输出流对象,,指定写入内容的文件路径
int ch=0;
while ((ch=fIn.read())!=-1) {//循环读取
fOut.write(ch);//将内容写入
}
fIn.close();//关闭流
fOut.close();//关闭流
}
OutputStreamWriter---将一个字节输出流转化为字符输出流
代码演示:
public static void main(String[] args) throws IOException {
String string="sadkjsdfadsfdaasd"; //需要写入的字符串
FileOutputStream fStream=new FileOutputStream("1.txt");//创建输出流对象,指定写入文件的路径
OutputStreamWriter oWriter=new OutputStreamWriter(fStream, "utf-8");//-将一个字节输出流转化为字符输出流 ---可以指定编码格式utf-8
oWriter.write(string);//写入文件内容
fStream.close();//关闭字节输出流
oWriter.close();//关闭字符输出流
}
InputStreamReader---将一个字节输入流转化为字符输入流
代码演示:
public static void main(String[] args) throws IOException {
FileInputStream fStream=new FileInputStream("1.txt");//创建输入流对象,并指定读取文件路径
InputStreamReader iReader=new InputStreamReader(fStream);//将一个字节输入流转化为字符输入流
StringBuffer sBuffer=new StringBuffer(); //创建一个字符串接收
while (iReader.ready()) { //读取字符输入流内容
sBuffer.append((char)iReader.read());//添加到字符中
}
System.out.println(sBuffer.toString());//输出显示
fStream.close();//关闭字节输入流
iReader.close(); //关闭字符输入流
}
OutputStreamWriter和InputStreamReader结合应用
将1.txt中的数据读取到内存,在从内存中数据读取到2.txt
代码演示:
public static void main(String[] args) throws IOException {
FileInputStream fStream=new FileInputStream("1.txt");
InputStreamReader iReader=new InputStreamReader(fStream);
FileOutputStream fStream2=new FileOutputStream("2.txt");
OutputStreamWriter oWriter=new OutputStreamWriter(fStream2, "utf-8");
while (iReader.ready()) {
oWriter.write((char)iReader.read()); //将输入字符流给输出字符流,写入文件中
oWriter.flush(); //这是个循环需要刷新缓存
}
iReader.close();//关闭流
oWriter.close();
fStream.close();
fStream2.close();
}
将内存数据写入文件1.txt,在从文件1.txt中的数据读取出来到内存中
代码演示:
public static void main(String[] args) throws IOException {
String string="style周";
FileOutputStream fOutputStream=new FileOutputStream("1.txt");
OutputStreamWriter oWriter=new OutputStreamWriter(fOutputStream,"utf-8");//创建字符输出流,设置字符编码
oWriter.write(string); //将字符串写入字符输出流中,写入文件
oWriter.close(); //关闭流
fOutputStream.close();
FileInputStream fInputStream=new FileInputStream("1.txt");
InputStreamReader iReader=new InputStreamReader(fInputStream,"utf-8");//创建字符输入流,字符编码设置
StringBuffer sBuffer=new StringBuffer(); //设置一个字符变量接收
while (iReader.ready()) {
sBuffer.append((char)iReader.read()); //添加到字符串中
}
iReader.close();//关闭流
fInputStream.close();
System.out.println(sBuffer);
}
这里我需要讲解一下flush用法
flush的作用是用于在数据缓存中数据满了之后刷新该缓存,然后对剩下的数据继续进行缓存。如果要写入的数据量很小,或者你自己定义的缓存足够大到可以保存所有数据的话,不用flush也不会丢失数据,但是如果要写入的数据大小操作缓存大小,则需要循环多步才能处理完,这时不用flush就会导致只有最前面的一些数据能够写入,而剩下的数据会丢失。只有字符流才有刷新
缓冲区
计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。为此,除了程序和流节点间交换数据必需的读写机制外,还应该增加缓冲机制。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。
1. 字符流的缓冲区:BufferedReader和BufferedWreiter
* 缓冲区的出现时为了提高流的操作效率而出现的.
* 需要被提高效率的流作为参数传递给缓冲区的构造函数
* 在缓冲区中封装了一个数组,存入数据后一次取出
BufferedReader
自带了缓冲区,需要一个Reader对象来构建这个BufferedReader对象---BufferedReader最主要的作用提供缓冲区,从字符输入流中来获取数据;Reader对象来指名数据的具体来源
简单代码实现:
1 public static void main(String[] args) throws IOException {
2 FileReader fReader=new FileReader("1.txt");//创建一个文件读取对象,并读取文件
3 BufferedReader bReader=new BufferedReader(fReader);//将文件内容放入缓冲区中------ 需要被提高效率的流作为参数传递给缓冲区的构造函数
4 StringBuffer sBuffer=new StringBuffer(); //创建一个StringBuffer类的字符串后面接收读出的数据
5 while (bReader.ready()) { //循环读取知道文件尾部
6 sBuffer.append((char)bReader.read());//将文件内容逐一添加到sBuffer中
7 }
8 System.out.println(sBuffer.toString());//输出
9 fReader.close();//关闭读取流
10 bReader.close();//关闭缓冲区读取流
11 }
BufferedWriter
代码实现:
1 public static void main(String[] args) throws IOException {
2 FileWriter fWriter=new FileWriter("1.txt");//创建写入流对象,并指定创建的文件路径;
3 BufferedWriter bWriter=new BufferedWriter(fWriter);//创建写入流的缓冲区
4 bWriter.write("abcdf");//向缓冲区写入字符
5 bWriter.flush(); //刷新缓冲区
6 bWriter.newLine();//newLine()在不同的操作系统下自动转义为当前系统认识对的回车换行
7 bWriter.write("qwer");
8 bWriter.flush(); //刷新缓冲区
9 bWriter.close();//关闭缓冲区
10 fWriter.close();//关闭写入流
11 }
字节流缓冲区
BufferedInputStream:当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。
public static void main(String[] args) throws IOException {
FileInputStream fStream=new FileInputStream("1.txt");
BufferedInputStream bStream=new BufferedInputStream(fStream); //字节输入流缓冲区,,
int ch=0;
while ((ch=bStream.read())!=-1) {
System.out.print((char)ch);
}
fStream.close();//关闭流
bStream.close();
}
BufferedOutputStream :当从向缓冲流读取数据时候,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取数据到缓冲区。
public static void main(String[] args) throws IOException {
int ch=1561;//因为写入的是int类型的,所以用用int,也可以用 System.in.read()键盘输入字符,转换成ASKII 码(一个 int 整数)
FileOutputStream fOutputStream=new FileOutputStream("1.txt");
BufferedOutputStream bStream=new BufferedOutputStream(fOutputStream);//创建字节输出流缓冲区对象
bStream.write(ch); //将字节写入文件中
bStream.close();//关闭流
fOutputStream.close();
}
系统流/标准流---字节流
底层使用字节流来实现的
System.out 标准输出流
System.in 标准输入流
System.err 标准错误流
Java中流-----个人总结心得的更多相关文章
- 《精通并发与Netty》学习笔记(09 - Java中流的概念)
Java中流的概念 java程序通过流来完成输入/输出.流是生产或消费信息的抽象.流通过java的输入/输出与物理设备链接.尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输 ...
- java.math.BigInteger使用心得总结(转)
今天参考课本写了一个关于二进制与十进制转换的程序,程序算法不难,但写完后测试发现不论是二转十还是十转二,对于大于21亿即超过整数范围的数不能很好的转换.都会变成0.参考书籍发现使用使用BigInteg ...
- java考核完的心得
2015年8月13日 星期四 晴 今天上午我们考核了java,就是用Java语言写一个小型的管理系统.考核前的我信心满满,因为我本身是测试专业的,觉得在开发这方面对自己不用要求的那么 ...
- *关于httl开源Java模板的使用心得
1.简介 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. ...
- 一个十年java程序员的心得
展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...
- Java中流的概念
http://wapwenku.baidu.com/view/04714847b307e87101f69656.html?ssid=0&from=1086k&uid=0&pu= ...
- 【JAVA】LOG4J使用心得
一.LOG4J基础: 1.日志定义 简单的Log4j使用只需要导入下面的包就可以了 // import log4j packages import org.apache.log4j.Lo ...
- Java 参数的一些心得
java 对象入参是传入的是引用(一块内存), 基础类型是值(复制内容),测试代码如下 public class TestA { private String name; public String ...
- Java开发核心技术面试心得分析
Java的数据结构有哪些?Map与Set的本质区别是什么? 分析:Java常见的数据结构有Collection和Map,其中Collection接口下包括List和Set接口,其下又有多个实现类如Li ...
随机推荐
- 获取对象属性(key)组成的数组 Object.keys( obj ).md
Object.keys() 方法会返回一个由给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in ...
- MySQL5.6的optimizer_trace
MySQL的explain是各种执行计划选择的结果,如果想看整个执行计划以及对于多种索引方案之间是如何选择的? MySQL5.6中支持这个功能,optimizer_trace 这个是mysql的参数, ...
- mybatis逆向工程使用步骤详解
使用mybatis生成逆向工程的详细步骤,我个人感觉这个是最简单的一个了,虽然网上有很多种的方法来生成逆向工程,可是这个方法最简单.在这里我是使用maven搭建的环境,但是在正常的环境下也是一样的.步 ...
- 五、VueJs 填坑日记之将接口用webpack代理到本地
上一篇博文,我们已经顺利的从cnodejs.org请求到了数据,但是大家可以注意到我们的/src/api/index.js的第一句就是: // 配置API接口地址 var root = 'https: ...
- TCP:传输控制协议
概述: 书中采用了8章来介绍TCP,可见其重要性.TCP是一种面向连接的.可靠的字节流服务,也就是说两方要交换数据必须先建立一个连接. TCP的信息单位称为segment.TCP对字节流的内容不作任何 ...
- HTML5学习的价值是什么?
随着互联网的发展和移动端的发展,很多公司对HTML5前端开发的需求旺盛,市场人才短缺供不应求. 对于HTML5的迅速发展和市场的大量需求,究竟为何HTML5如此受欢迎,它的价值在哪里呢? 语义特性(C ...
- laravel 500错误的一个解决办法
我从svn上update下来了开发环境的目录,结果当我访问本地的根目录的时候却报了500错误,百度了许多,也看了很多博客,发现都没有解决我的问题,所以我觉得我的解决办法值得一写,当你从svn上upda ...
- 2712:细菌繁殖-poj
2712:细菌繁殖 总时间限制: 1000ms 内存限制: 65536kB 描述 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,… ...
- 校门外的树-poj
问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
- Android智能下拉刷新加载框架—看这些就够了
一些值得学习的几个下拉刷新上拉加载开源库 Android智能下拉刷新框架-SmartRefreshLayout 支持所有的 View(AbsListView.RecyclerView.WebView. ...