java——IO流
一. File
- File类可以使用文件路径字符串来创建File实例,该文件路径可以是绝对路径或相对路径
- File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件
二. 流(Stream)
- Stream是从起源(source)到接收(sink)的有序数据
- 按照流向分可以分为输入流和输出流
- 输入流:只能从中读取数据,不能写入数据(基类是InputStream和Reader)
- 输出流:只能向其中写入数据,不能读取数据(基类是OutputStream和Writer)
- 按照操作的数据单元分为字节流和字符流
- 字节流:操作的数据单元是8位的字节(基类是InputStream和OutputStream)
- 字符流:操作的数据单元是16位的字节(基类时Reader和Writer)
- 按照角色可以分为节点流和处理流
- 节点流:可以从/向一个特定的IO设备中读/写数据的流,也被称为低级流
- 处理流:用于对一个已存在的流进行连接或封装来实现读/写功能,也称为高级流或包装流
三、 数据流的基本概念
1.数据流
在Java中把不同的数据源与程序之间的数据传输都抽象表述为“流”(stream),以实现相对统一和简单的输入/输出操作方式。传输中的数据就像流水一样,也称为数据流。
2 .I/O数据流的分类方式
数据流分为输入流和输出流两类。输入流只能读取不能写。而输出流只能写不能读。(这里站在程序的角度来确定出入方向,即将数据从程序外部传送到程序中谓之“输入”数据,将程序中的数据传送到外部谓之“输出”数据。
)
3.缓冲流(Buffered Stream)
对数据流的每次操作都是以字节为单位进行的,既可以向输出流写入一个字节,也可从输入流中读取一个字节。显然效率太低,通常使用缓冲流,即为一个流配置一个缓冲区,一个缓冲区就是专门传送数据的一块内存。
4.数据源(Data Sourcc):是指那些能够提供数据的地方,包括键盘、磁盘文件、网络接口等。
5.数据宿(Data Sink):指能够接收数据的地方,可以是磁盘文件、网络接口以及显示器、打印机等外部设备。(数据宿也可认为是数据传输的目的地)
二、节点流和处理流
根据数据流所关联的是数据源还是其他数据流,可分为节点流(Node Stream)和处理流(Processing Stream)
节点流可以从/向一个特定的地方读/写数据。
处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现增强的数据读/写功能,处理流并不直接连接到数据源。
二、 字符流
1.字符输入流Reader
Reader类为所有面向字符的输入流的超类,声明为java.io中的抽象类。
public int read():读取一个字符,返回的是读到的那个字符。如果读到流的末尾,返回-1。
public int read(char[] cbuf):将读到的字符存入指定的数组中,返回的是实际读取的字符数。如果读到流的末尾,返回-1。
public abstract int read(char[] cbuf,int off,int len):将读到的字符存入数组的指定位置(off),每次最多读len个字符,返回实际读取的字符数。如果读到流的末尾,返回-1。
close():读取字符其实用的是window系统的功能,使用完毕后,进行资源的释放。
2.字符输出流writer
Weiter类为所有面向字符的输出流的超类,声明为java.io中的抽象类。
public void write(int c):将一个字符写入到流中。
public void write(char[]):将数组中的字符依次写出。
public abstract void write(char[] bcbuf,int off,int len):将数组中下标off开始的len个字符写出。
public void write(String):将一个字符串写入到流中。
public abstract void flush():刷新流,将流中的数据刷新到目的地中,流还存在。
public abstreact void close():关闭资源,关闭前会先调用flush,刷新流中的数据去目的地,然后流关闭。
3. FileWriter的使用
该类没有特有的方法。只有自己的构造数。
该类特点:
1.用于处理文本文件。
2.该类中有默认的编码表,
3.该类中有临时缓冲。
构造函数
publicFileWriter(Stringfilename);//调用系统资源,在指定位置,创建一个文件。注意:如果该文件已存在,将会被覆盖。
IO流的几个相关联系题:
eg1:编写Java程序:删除指定的文件或文件夹,如果文件夹中有文件或子文件夹也一并删除。
public void deleteFile(File file){
//分析:
//1.首先判断该路径file是否存在,如果不存在,即终止删除程序,如果存在,进行第2步:
//2.判断路径file是文件还是文件夹,若为文件,则直接删除,若为文件夹,则进入第3布:
//3.判断文件夹是否为空,若为空,直接删除该文件夹
//4.若不为空,则记录文件夹下所有文件列表,利用for-each与递归算法删除所有内容,最后删除该文件夹本身
if(!file.exists()){
return;
}
if(file.isFile()){
file.delete();
System.out.println("正在删除文件:"+file.getAbsolutePath());
return;
}
if(file.isDirectory()){
if(file.list().length==0){
file.delete();
System.out.println("正在删除文件夹:"+file.getAbsolutePath());
return;
}
File[] file1 = file.listFiles();
for(File f:file1){
deleteFile(f);
}
file.delete();
}
}
eg2:编写一个Java程序,要求每次运行该程序时打印出当前是第几次运行,即使计算机重启也能正常计数。
public void getCountTest() throws IOException{
//注意:两个流不能同时访问同一个文件!
//DataOutputStream data1 = new DataOutputStream(new FileOutputStream(file));
//该数据输出流每执行一次都会将原file路径下文件内容刷新一次(即覆盖)
File file = new File("E:/count");
if(!file.exists()){//判断file路径是否存在
file.createNewFile();//创建file路径指定的文件count
}
DataInputStream data = new DataInputStream(new FileInputStream(file));
int x;
try {
x=data.readInt();
data.close();
} catch (EOFException e) { //若x=data.readInt();读不到数据(如果此输入流在读取这四个字节之前到达末尾),则会抛出EOFException异常
data.close();//在使用输出对象data1之前关闭输入管道,避免同时操作
DataOutputStream data1 = new DataOutputStream(new FileOutputStream(file));
data1.writeInt(1);
data1.flush();
data1.close();
System.out.println("程序第"+1+"次运行");
return;
}
DataOutputStream data1 = new DataOutputStream(new FileOutputStream(file));
data1.writeInt(++x);
System.out.println("程序第"+x+"次运行");
data1.flush();
data1.close();
}
eg3:编写Java程序:实现文件夹的复制:
|--该方法实现了将路径file2下文件拷贝至路径file1下文件
@Test
public void testCopy() throws IOException {
File file1 = new File("E:\\");
File file2 = new File("E:\\Desktop\\饮水机项目_20161221_4");
copyOne(file1,file2);
}
public void copyOne(File file1,File file2) throws IOException{
if(!file2.exists()){
return;
}
if(file2.isFile()){
InputStream in = new FileInputStream(file2);
OutputStream out = new FileOutputStream(new File(file1,file2.getName()));
byte[] b = new byte[1024*1024];
int len=-1;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
in.close();
out.flush();
out.close();
return;
}
if(file2.isDirectory()){
File temp = new File(file1,file2.getName());
temp.mkdir();
if(file2.list().length==0){
return;
}
File[] fi = file2.listFiles();
for(File f:fi){
copyOne(temp,f);
}
}
}
eg4:开发一个Java程序,实现将一个GBK编码的文件转为UTF-8编码的文件。
@Test
public void codeChange() throws Exception{
//桥接流:字节流通向字符流的桥接流
InputStreamReader in = new InputStreamReader(
new FileInputStream("E:/my.java"),"GBK"); //解码
//桥接流:字符流通向字节流的桥接流
OutputStreamWriter out = new OutputStreamWriter(
new FileOutputStream("E:/your.java"),"UTF-8"); //编码
int k = -1;
while((k=in.read())!=-1){
out.write(k);
}
in.close();
out.flush();
out.close();
}
@Test //通过桥接字符流的便捷流(子类流)FileReader和FileWriter来快速实现
public void codeChange2() throws Exception{
FileReader in = new FileReader("E:/my.txt"); //解码
FileWriter out = new FileWriter("E:/your.txt"); //编码
int k = -1;
while((k=in.read())!=-1){
out.write(k);
}
in.close();
out.flush();
out.close();
}
eg5:将从控制台输入的信息保存到一个文件中去。(中文不能乱码,建议使用System.in、Scanner和InputStreamReader等)
//方法一:
@Test
public void scannerTest() throws Exception{
Scanner scanner = new Scanner(System.in);
PrintWriter out = new PrintWriter("E:/myWrite");
String line = null;
while(!(line=scanner.nextLine()).equals("exit")){
out.println(line);
}
scanner.close();
out.flush();
out.close();
}
//方法二:
@Test
public void bufferedReaderTest() throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter("E:/myWrite");
String line = null;
while(!(line=in.readLine()).equals("exit")){
out.println(line);
}
in.close();
out.flush();
out.close();
}
eg6:开发一个Java程序,统计每个java源文件的代码行数和所有java源文件的总行数(不含空行)
private static int count;
@Test
public void testGetAllCount() throws Exception{
File file = new File("D:/workspace/Test");
getAllCount(file);
System.out.println(count);
}
public void getAllCount(File file) throws Exception{
if(!file.exists()){
return;
}
if(file.isFile()){
BufferedReader buffer = new BufferedReader(
new InputStreamReader(new FileInputStream(file)));
String line=null;
while((line=buffer.readLine())!=null){
if(line.trim().length()!=0){
count++;
}
}
buffer.close();
}
if(file.isDirectory()){
for(File f:file.listFiles()){
getAllCount(f);
}
}
}
java——IO流的更多相关文章
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- java io流 对文件夹的操作
java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...
- Java IO流题库
一. 填空题 Java IO流可以分为 节点流 和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...
- Java IO流总结
Java IO流分类以及主要使用方式如下: IO流 |--字节流 |--字节输入流 InputStream: int read();//一次读取一个字节 int read(byte[] bys);// ...
- java io流 运行错误时,保存异常到文件里面
java io流 运行错误时,保存异常到文件里面 下面这个实例,运行后,输入数字,为正确,如果输入字符串,则报错,保存错误信息 //运行错误时,保存异常到文件里面 //下面这个实例,运行后,输入数字, ...
- java io流 创建文件、写入数据、设置输出位置
java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...
- java io流 数据流传输
java io流 数据流传输 把这段当公式用就可以了 //数据流传输 import java.io.*; public class Index{ public static void main(Str ...
随机推荐
- eclispe 无法启动调试 cannot connect to VM
eclispe中,点击调试运行java项目,出现 cannot connect to VM 正常的运行项目,没问题: 以为是jdk的安装路径等的问题,还有杀毒软件等等,都没有正常: 后来找到是wins ...
- NSRunLoop详解
1.NSRunLoop是IOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NS ...
- Struts2:效验器——注解
效验器三类: 编程式——Java代码 声明式——xml 注释法——@ 注解验证可以修饰属性的getter方法,也可以修饰执行方法Action中校验失败时,返回input逻辑视图 struts.xml ...
- ORA-04021 timeout occurred while waiting to lock object
用户要求删除一个数据库的用户 GREENPASS,在删除的过程中,报错如下: drop user GREENPASS * ERROR at line 1: ORA-04021: timeout occ ...
- C#对DBF文件的操作
protected void Page_Load(object sender, EventArgs e) { System.Data.Odbc.OdbcConnection conn = new Sy ...
- for 小曦
安装GO 当前版本1.6.2 http://blog.163.com/hehaifeng1984@126/blog/static/690011362013101044011568/ 教程 https: ...
- python基础知识---迭代器、生成器、装饰器
一.迭代器 二.生成器 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html def func(): #定义生成器,和普通函数的区别是 ...
- Nginx限制访问速率和最大并发连接数模块--limit (防止DDOS攻击)
Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/document_cn/http_limit_req_cn ...
- jQuery实现瀑布流
瀑布流布局多用于加载图片,或者图片配上文字.视觉表现为参差不齐的多栏布局.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部.本文就来利用jQuery实现一个图片瀑布流的效果. 1.布局. 首 ...
- eclipse的快捷键(写给eclipse新手)
Eclipse常用的快捷键 1.常用的快捷键 Alt+/:常用于补全单词.方法,以及内容辅助,可以省很多事情 Ctrl+1:用于全局,快速修正 Ctrl+D 删除整行 Ctrl+F 用于全局 , ...