• JavaIO流

首先要理解这个“流”(stream)字:Java把不同的输入,输出源抽象成为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入,输出源。把这里的“流”简单的理解成从起源到接受的有序数据就好了。

  • IO流的分类:

一共有3种分类方式:

1,按流向分:

输入流;输出流

2,按处理的单位:

字节流(8 位的字节);字符流(16 位的字节)

3,按流的角色:

节点流:可以从一个特定的 IO 设备读/写数据的流

处理流:对一个已存在的流进行连接和封装,通过封装后的流来实现数据读/写操作。



Java的io流一共涉及40多个类,虽然多但是别慌,他是有规则的。记住一下3点就好了:

1,所有的类都是从4个抽象类中派生出来的。这4个抽象类是:InputStream & Reader;OutputStream & Writer。

2,输入和输出没有什么区别,只不过一个是读,一个是写而已。字节流和字符流也没什么区别,只不过他们操作的数据单元不同:一个是字节,一个是字符。通常来说:如果需要进行输入和输出的内容是文本内容,就考虑使用字符流,如果需要进行输入和输出的内容是二进制内容,这个时候就使用字节流。

3,使用高级流:

1),转换流:将字节流转换成字符流(InputStreamReader,OutputStreamWriter)。  

2),处理流:使用处理流来包装节点流,程序通过处理流来执行输入和输出。识别处理流也非常的简单:只要流的构造器参数不是一个物理节点,而是一个已经存在的流,那么这种流就是处理流。下面来实现一种比较常用的处理流的用法:Java使用system.in代表标准输入,即键盘输入,但是这个标准输入流是InputStream类的一个实例,使用的时候不是很方便,而且我们也知道键盘输入的内容都是文本内容,所以我们可以使用InputStreamReader将其转换成字符输入流,普通的reader读取输入内容还是不太方便,我们可以将reader包装成BufferReader,利用BufferReader的readline方法就可以一次读取一行内容了。



以下几块代码用来演示具体的常用的几种流:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Linkin
{ public static void main(String[] args) throws IOException
{
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
// 创建字节输入流
fis = new FileInputStream("src/Linkin.java");
// 创建字节输出流
fos = new FileOutputStream("src/newFile.java");
byte[] bbuf = new byte[32];
int hasRead = 0;
// 循环从输入流中取出数据
while ((hasRead = fis.read(bbuf)) > 0)
{
// 每读取一次,即写入文件输出流,读了多少,就写多少。
fos.write(bbuf, 0, hasRead);
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
if (fis != null)
{
fis.close();
}
if (fos != null)
{
fos.close();
}
}
}
}
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Linkin
{ public static void main(String[] args) throws IOException
{
FileReader fr = null;
FileWriter fw = null;
try
{
// 创建字符输入流
fr = new FileReader("src/Linkin.java");
// 创建一个长度为32的“竹筒”
char[] cbuf = new char[32];
// 用于保存实际读取的字符数
int hasRead = 0;
// 使用循环来重复“取水”过程
while ((hasRead = fr.read(cbuf)) > 0)
{
// 取出“竹筒”中水滴(字符),将字符数组转换成字符串输入!
System.out.print(new String(cbuf, 0, hasRead));
}
fw = new FileWriter("poem.txt");
fw.write("锦瑟 - 李商隐\r\n");
fw.write("锦瑟无端五十弦,一弦一柱思华年。\r\n");
fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n");
fw.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n");
fw.write("此情可待成追忆,只是当时已惘然。\r\n");
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
if (fr != null)
{
fr.close();
}
if (fw != null)
{
fw.close();
}
}
}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream; public class Linkin
{ public static void main(String[] args) throws IOException
{
FileOutputStream fos = null;
PrintStream ps = null;
try
{
fos = new FileOutputStream("test.txt");
ps = new PrintStream(fos);
// 使用PrintStream执行输出
ps.println("普通字符串");
// 直接使用PrintStream输出对象
ps.println(new Linkin());
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
if (ps != null)
{
ps.close();
}
}
}
}
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter; public class Linkin
{ public static void main(String[] args) throws IOException
{
StringReader sr = null;
StringWriter sw = null;
String src = "从明天起,做一个幸福的人\n" + "喂马,劈柴,周游世界\n" + "从明天起,关心粮食和蔬菜\n" + "我有一所房子,面朝大海,春暖花开\n" + "从明天起,和每一个亲人通信\n" + "告诉他们我的幸福\n";
char[] buffer = new char[32];
int hasRead = 0;
try
{
sr = new StringReader(src);
// 采用循环读取的访问读取字符串
while ((hasRead = sr.read(buffer)) > 0)
{
System.out.print(new String(buffer, 0, hasRead));
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
try
{
// 创建StringWriter时,实际上以一个StringBuffer作为输出节点
// 下面指定的20就是StringBuffer的初始长度
sw = new StringWriter();
// 调用StringWriter的方法执行输出
sw.write("有一个美丽的新世界,\n");
sw.write("她在远方等我,\n");
sw.write("哪里有天真的孩子,\n");
sw.write("还有姑娘的酒窝\n");
System.out.println("----下面是sw的字符串节点里的内容----");
// 使用toString()方法返回StringWriter的字符串节点的内容
System.out.println(sw.toString());
}
catch (Exception ioe)
{
ioe.printStackTrace();
}
finally
{
if (sr != null)
{
sr.close();
}
if (sw != null)
{
sw.close();
}
}
}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Linkin
{ public static void main(String[] args) throws IOException
{
InputStreamReader reader = null;
BufferedReader br = null;
try
{
// 将Sytem.in对象转换成Reader对象
reader = new InputStreamReader(System.in);
//将普通Reader包装成BufferedReader
br = new BufferedReader(reader);
String buffer = null;
//采用循环方式来一行一行的读取
while ((buffer = br.readLine()) != null)
{
//如果读取的字符串为"exit",程序退出
if (buffer.equals("exit"))
{
System.exit(1);
}
//打印读取的内容
System.out.println("输入内容为:" + buffer);
}
}
catch (Exception ioe)
{
ioe.printStackTrace();
}
finally
{
if (br != null)
{
br.close();
}
}
}
}



关于上面几段代码,有几点要注意:

1,在使用低级流的时候往往会new一个1024的字节数组,这个相当于一个竹筒用来操作流,指针对应向后跳就好了

2,使用IO流结束后,要记得关闭流。因为程序打开的文件IO资源不属于内存里面的资源,垃圾回收无法回收。使用IO流执行结束后关闭流,不仅可以流的物理资源被回收,还可以将输出流缓存的数据flush到物理节点中。当我们在使用了处理流来包装底层几点流之后,只需要关闭最上层的流就好了,下面的低级流也会自动跟着关闭的。

3,PrintStream类的输入功能非常强大,通常如果我们需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。

输入和输出--IO流的更多相关文章

  1. C++ Primer高速学习 第一章 获得二:输入和输出 (IO)

    什么是输入输出.即Input-Output,缩写是非常装B的IO?请看经典民间解释: C++语言的输入输出是指信息从外部输入设备(如键盘.磁盘等)向计算机内部(内存)输入(即Input)和从内存向外单 ...

  2. 我爱Java系列之《JavaEE面试宝典》---【IO流面试总结】

    1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 答案 Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 Byte是计算机操作数据的最小 ...

  3. 第54节:Java当中的IO流(中)

    Java当中的IO流(中) 删除目录 // 简书作者:达叔小生 import java.io.File; public class Demo{ public static void main(Stri ...

  4. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  5. Java当中的IO流(中)

    Java当中的IO流(中) 删除目录 import java.io.File; public class Demo{ public static void main(String[] args){ / ...

  6. 【Java基础】IO 流

    IO 流 File 类 java.io.File 类是文件和文件目录路径的抽象表示形式,与平台无关. File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身. 如果需要访问文件内 ...

  7. IO流(一)

    内容概要: Java以流的形式处理所有输入和输出.流是随通信路径从源移动到目的地的字节序列. 内存与存储设备之间传输数据的通道 流的分类: 按方向 输入流:将存储空间中的内容读到内存中   硬盘--& ...

  8. C++:文件的输入和输出

    1.共同的打开文件方式: fin.open("test.txt",ios::binary) fout.open("test.txt",ios::binary) ...

  9. java IO流 (六) 其它的流的使用

    1. 标准的输入输出流:System.in:标准的输入流,默认从键盘输入System.out:标准的输出流,默认从控制台输出 修改默认的输入和输出行为:System类的setIn(InputStrea ...

随机推荐

  1. SpringMVC handleMapping 处理器映射器 属性清单

    映射器的属性清单 defaultHandler         在映射与所有处理器都不匹配的情况下,指定默认的处理器(处理器即你定义的Controller(action)类) order        ...

  2. MySQL5.7新特性:lossless replication 无损复制

    MySQL的三种复制方式 asynchronous 异步复制 fully synchronous 全同步复制 Semisynchronous 半同步复制 asynchronous replicatio ...

  3. MATLAB数字图像处理学习笔记

    我们都知道一幅图片就相当于一个二维数组,可以用一个矩阵来表示,而MATLAB可以说就是为矩阵运算而生的,所以学习图像处理,学习MATLAB势在必行! 一. MATLAB基础知识 1. 读取图像 %im ...

  4. VueI18n插件的简单应用于国际化

    作为一个前端小白,刚刚接触学习Vue.js框架结合Element-ui组件开发项目.由于最近需要实现国际化功能,在看element-ui的开发文档时,只有简单的引入没有应用实例,对于我这种小白不能ge ...

  5. bzoj 2806: [Ctsc2012]Cheat

    传送门 好久没刷bzoj惹…… 题意不说可以嘛. 首先二分答案. SAM的事情搞完以后就是dp辣. 我们已经对于每个位置i,找到了最小的一个k,使得[k,i]这个子串在模版串中出现过.那么我们需要做的 ...

  6. 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  7. HDU4355-Party All the Time-三分

    Party All the Time Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. BZOJ2744: [HEOI2012]朋友圈

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2744 最大团是一个np问题.. 对于本题,做它的逆问题,建反图做最大独立集. 对于A最多取出两 ...

  9. oracle ebs form开发总结

    item的布局千万不要去乱动,只要调好长宽和y轴的坐标就好了.form内部集成了很多代码对布局进行动态的调整,而且有一些代码的长宽什么的还是写死了的,我们一动,form可能就识别不了了,然后就显示出来 ...

  10. class not found: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    用jdk1.8版本配完SSH框架后,进行数据库的Hibernate reverse engineering后,,最下面的log.error会报错,然后看网上说是因为jdk1.8,换成了1.7就好了(剩 ...