---------------------- ASP.Net+Android+IO开发.Net培训、期待与您交流! ----------------------

0. IO流概述:

  • Java对数据的操作是通过流的方式.
  • IO流用来处理设备之间的数据传输.
  • Java用于操作流的对象都在IO包中.
1. IO流的分类:
  • 按所操作数据: 字节流、字符流
  • 按流向: 输入流、输出流

2. IO流常用基类:

  • 字节流的抽象基类: InputStream, OutputStream
  • 字符流的抽象基类: reader, Writer
  • p.s. 由这四个类派生的子类, 名称都是以其父类名作后缀的.

3. IO程序的一般书写流程: 
  1. 导包.
  2. IO异常处理.
  3. 在finally中关闭流.

==============开始字符流的========================

4. FileWriter的小栗子:

import java.io.*;
class Demo{
public static void main(String args[]) throws Exception{
//创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件
//而且该文件会被创建到指定目录下,如果该目录下已有同名的文件,将被覆盖。
//其实该步就是明确数据要存放的目的地
FileWriter fw = new FileWriter("Demo.txt");
//调用writer方法,将字符串写入到流中,会产生异常
fw.write("abc");
//刷新该流的缓冲。将数据刷新到文件中
fw.write("def");
fw.flush();
//关闭刘子源,但是关闭之前会刷新一次内部的缓冲的数据。,将数据刷到目的地中,和flush区别,flush(),刷新后,流可以继续使用,close刷新后,会将流关闭。
//操作完,必须关闭
fw.close();
}
public static void sop(Object obj){
System.out.println(obj.toString());
}
}
5. FileWriter的异常处理例子:

import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw=null;//需要在代码块外边建立引用.
try
{
fw=new FileWriter("demo.txt",true);
fw.write("accd\r\nde");
}
catch (IOException e)
{
System.out.println(e.toString());
}
finally
{
if(fw!=null)//判断fw是否为空.如果输入盘符错误的话.fw会是null;将执行不到close所以要判断
try
{
fw.close();
}
catch (IOException e)
{
System.out.println("关闭资源失败");
}
}
}
}

6. 读取的例子(先读入到数组中):

import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw=null;//需要在代码块外边建立引用.
try
{
fw=new FileWriter("demo.txt",true);
fw.write("accd\r\nde");
}
catch (IOException e)
{
System.out.println(e.toString());
}
finally
{
if(fw!=null)//判断fw是否为空.如果输入盘符错误的话.fw会是null;将执行不到close所以要判断
try
{
fw.close();
}
catch (IOException e)
{
System.out.println("关闭资源失败");
}
}
}
}

7. ** 复制文本文件的栗子:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class CopyText { public static void main(String[] args) throws IOException{ //copy_1();
copy_2();
} //一个char一个char地复制, 不建议
public static void copy_1() throws IOException
{
FileReader fr = new FileReader("C:\\CCCC.txt");
FileWriter fw = new FileWriter("D:\\CCCC.txt"); int ch=0; while((ch = fr.read()) != -1)
{
fw.write(ch);
} fw.close();
fr.close(); } //用数组做缓冲, 建议这样
public static void copy_2()
{
FileWriter fw = null; //* 养成习惯, 局部变量直接初始化一下.
FileReader fr = null; try
{
fr = new FileReader("C:\\CCCC.txt");
fw = new FileWriter("D:\\CCCC.txt"); char[] buf = new char[1024]; int len = 0;
while((len = fr.read(buf)) != -1)
{
fw.write(buf, 0, len);
}
}
catch(IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
if(fr!=null) //先判断一下
try
{
fr.close();
}
catch(IOException e)
{
}
if(fw!=null) //先判断一下
try
{
fw.close();
}
catch(IOException e)
{
}
}
} }

8. 字符流的缓冲区: 
  • 对应类: BufferedWriter, BufferedReader
  • 缓冲区提高了读写效率
  • 缓冲区要结合流才能使用
  • 在流的基础上对流的功能进行了增强
  • * 关闭缓冲区, 其实就是关闭缓冲区里的流对象

9. 
BufferedWriter
例子:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; class Test2
{
public static void main(String [] args) throws IOException
{
FileWriter fw = new FileWriter("buf.txt"); BufferedWriter bufw = new BufferedWriter(fw); bufw.write("abcde");
bufw.newLine(); //换行, 跨平台实现. bufw.flush(); //用到缓冲区都要flush bufw.close(); //缓冲区关闭, 其实就是在关闭fw流
} }

10. BufferedReader栗子:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; class Test2
{
public static void main(String [] args) throws IOException
{
FileReader fr = new FileReader("buf.txt"); BufferedReader bufr = new BufferedReader(fr); String line = null; while((line=bufr.readLine()) != null)
{
System.out.println(line);
} bufr.close();
} }

11. 通过缓冲区复制文本文件:

import java.io.*;

public class CopyTextByBuf {

	public static void main(String[] args) {

		BufferedReader bufr = null;
BufferedWriter bufw = null; try
{
bufr = new BufferedReader(new FileReader("bufr.txt"));
bufw = new BufferedWriter(new FileWriter("bufw.txt")); String line = null; while((line=bufr.readLine()) != null)
{
bufw.write(line);
bufw.newLine(); //因为readLine()返回值并不带有行终止符, 所以自己来
bufw.flush();
}
}
catch(IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch(IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(bufw!=null)
bufw.close();
}
catch(IOException e)
{
throw new RuntimeException("写入关闭失败");
}
} } }

12. 模拟BufferedReader的readLine()方法:

import java.io.FileReader;
import java.io.IOException; /*
* 模拟BufferedReader的readLine()方法, 写一个一次读取一行数据的方法.
*/ class MyBufferedReader
{
private FileReader r;
MyBufferedReader(FileReader r)
{
this.r = r;
}
public String myReadLine() throws IOException
{
//定义一个临时容器, 原BufferedReader封装的是字符数组看这里用StringBuilder
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=r.read()) != -1)
{
if(ch=='\r') //这个回车
continue;
if(ch=='\n') //这是换行
return sb.toString();
else
sb.append((char)ch);
}
return null;
}
public void myClose() throws IOException
{
r.close();
}
}

13.
*
装饰设计模式(之前讲过单例和模板模式):
  • 当想要对已有对象的功能进行功能增强时, 可以定义一个类, 将已有对象传入, 基于已有对象的功能提供加强功能. 自定义的该类称为* 装饰类.
  • 装饰类通常会通过构造方法接收被装饰的对象.

14.
*
装饰与继承的区别: 
答: 装饰模式比继承灵活, 避免了继承体系的臃肿. (继承需要好多子类, 而用装饰模式可以多态的形式装饰许多类. 提高扩展性.)
装饰类因为是增强已有对象, 具备的功能和已有对象是相同的, 只不过提供了更强的功能. 所以装饰类和被装饰类通常属于一个体系中. 

==============下面是字节流的========================
15. 比如说想要操作图片数据, 就要用字节流了. 

16. 字节流: InputStream, OutputStream

17. 复制一个图片:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class CopyPic { public static void main(String[] args) {
FileOutputStream fos = null;
FileInputStream fis = null; try
{
fos = new FileOutputStream("d:\\A.jpg");
fis = new FileInputStream("c:\\A.jpg"); byte[] buf = new byte[1024]; int len = 0; while((len=fis.read(buf)) != -1)
{
fos.write(buf, 0, len);
}
}
catch(IOException e)
{
throw new RuntimeException("复制文件失败");
}
finally
{
try
{
if(fos!=null)
fos.close();
}
catch(IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(fis!=null)
fis.close();
}
catch(IOException e)
{
throw new RuntimeException("写入关闭失败");
} } } }

18. 字节流也有对应的BufferedInputStream和BufferedOutputStream类.

19. * 读取键盘录入:

  • System.out: 对应的是标准输出设备, 默认屏幕.
  • System.in: 对应的是标准输入设备, 默认键盘.
例子:

/*
* 录入一行, 然后输出.
* 若是over, 则停止.
*/ import java.io.IOException;
import java.io.InputStream; public class ReadIn { public static void main(String[] args) throws IOException { InputStream in = System.in; //标准输入流 StringBuilder sb = new StringBuilder(); while(true)
{
int ch = in.read();
if(ch=='\r')
continue;
if(ch=='\n')
{
String s = sb.toString();
if("over".equals(s)) //判断是否是over
break;
System.out.println(s.toUpperCase());
sb.delete(0, sb.length());
}
else
sb.append((char)ch);
} } }

20. 转换流:

  • InputStreamReader和OutputStreamWriter: 字节流转成字符流.
  • 没有ReadInputStream和WriterOutputStream.

21. 改变标准输入输出设备. 

public static void setIn(InputStream in): 改为指定的输入流.

==============下面是File的========================

22. java.io.File: 用来将文件或者文件夹封装成对象.

23. File.separator: 目录分隔符.

24. 常用方法:

  • 创建 
  • boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false. 和输出流不一样棒,输出流对象一建立就创建文件,而且文件已经存在,会覆盖.
  • boolean mkdir() 创建此抽象路径名指定的目录。
  • 删除 
  • boolean delete() 删除此抽象路径名表示的文件或目录。
  • void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录. 当被操作时候,删除不了,所以等虚拟机终止时,删除.
  • 判断
  • boolean canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。
  • boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。
  • boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。
  • int compareTo(File pathname)   按字母顺序比较两个抽象路径名
  • boolean exists() 测试此抽象路径名表示的文件或目录是否存在
  • boolean isAbsolute() 测试此抽象路径名是否为绝对路径名
  • 判断类型时候。必须先判断是否存在
  • boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录
  • boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
  • 获取信息
  • String getName()
  • String getPath
  • String getParent()    此抽象路径名指定父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
  • String getAbsolutPath()
  • String getAbsolutFile() 绝对路径对象
  • long lastModified()
  • long length() 返回由此抽象路径名表示的文件的长度。

25. 递归输出文件列表:

import java.io.File;

public class FileDemo3 {

	public static void main(String[] args) {

		File dir = new File("F:\\itcast_video\\Java基础加强(5-7天)2010年Java高新技术");
showDir(dir); } public static void showDir(File dir)
{
System.out.println(dir); // 输出目录
File[] files = dir.listFiles();
for(int x=0; x<files.length; x++) // 输出文件
{
if(files[x].isDirectory())
showDir(files[x]);
else
System.out.println(files[x]);
}
} }

26. 删除带内容的目录: 在Windows中的原理是从内往外删除. 

==============下面是Properties的========================
27. java.util.Properties是hashtable的子类. 
  • 它里面存的键值对都是字符串.
  • 是集合和IO技术相结合的集合容器.
  • ? 可以用于键值对形式的配置文件.

28. 例子:

/*
演示,如何将流中的数据存储到集合中
想要将 info.txt 中的键值对数据存到集合中进行操作。 1、用一个流和info.txt文件关联
2、读取一行数据。将改行数据用"="进行切割。
3、等号左边作为键,右边作为值,存入到Properties集合中即可
*/
import java.io.*;
import java.util.*;
public class Demo{
public static void main(String args[])throws IOException{
loadDemo();
}
public static void loadDemo()throws IOException{
FileInputStream fis = new FileInputStream("info.txt");
Properties prop = new Properties();
prop.load(fis);
sop(prop);
FileOutputStream fos = new FileOutputStream("info.txt");
prop.store(fos,"haha");
prop.list(System.out);
fos.close();
fis.close();
}
//设置和获取元素
public static void method()throws IOException{
BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));
String line = null;
Properties prop = new Properties();
while((line=bufr.readLine())!=null){
String[] arr = line.split("=");
prop.setProperty(arr[0],arr[1]);
sop(prop);
}
}
public static void sop(Object obj){
System.out.println(obj.toString());
}
}

=====================其 他========================
29. 很多, 只需了解, 用的时候细查API文档即可: 
  • 打印流: PrintWriter 与 PrintStream: 可以直接操作输入流和文件.
  • 序列流: SequenceInputStream: 对多个流进行合并.
  • 操作对象: ObjectInputStream 与 ObjectOutputStream: 被操作的对象需要实现 Serializale (标记接口).

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

[黑马程序员] I/O的更多相关文章

  1. 黑马程序员——【Java高新技术】——代理

    ---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...

  2. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

  3. 黑马程序员+Winform基础(上)

    黑马程序员+Winform基础 ---------------<a href="http://edu.csdn.net"target="blank"> ...

  4. 黑马程序员—C语言的函数、数组、字符串

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...

  5. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  6. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  7. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  8. 黑马程序员:Java基础总结----枚举

    黑马程序员:Java基础总结 枚举   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 枚举 为什么要有枚举 问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别 ...

  9. 黑马程序员:Java基础总结----反射

    黑马程序员:Java基础总结 反射   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...

  10. 黑马程序员:Java基础总结----JavaBean 内省

    黑马程序员:Java基础总结 JavaBean 内省   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! JavaBean  内省 软件包 java.beans 包含与开 ...

随机推荐

  1. xcode生成的IOS安装文件的位置

    通过xcode生成可以在IOS系统下运行的文件的具体设置: 1.首先,需要有相应的程序,并且在mac下的xcode编译后,能够在模拟器中完美运行. 2.单击xcode,打开Xcode > Pre ...

  2. js Function 加不加new 详解

    以下来自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new The new operato ...

  3. MySQL新建用户,授权,删除用户,修改密码等命令

    首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的. 注:本操作是在WIN命令提示符下,phpMyAdmin同样适用.     用户:phplamp   用户数 ...

  4. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

  5. Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作

    Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...

  6. 05-UIKit(UITableViewController)

    目录: 一.UITableViewController(表视图控制器) 二.委托协议 三.tableview工作过程(三问一响应) 四.UITableViewCell 回到顶部 一.UITableVi ...

  7. ie6下常见的bug 调整页面兼容性

    ie6下常见的bug 我们布局页面,首先符合标准,如何写一个页面的标准性? 但是ie6等浏览器本身就比较特殊,bug比较多,兵法云,知己知彼百战百胜.我们需要了解ie6的一些常见bug,这样,更好的调 ...

  8. 利用Ihttpmodel实现网站缓存,解决Server.Transfer 直接输出HTML源代码的问题

    今天在用.NET利用IHttpModel实现网站静态缓存的时候,不知道最后为什么用 Server.Transfer(html)的时候结果输出的是HTML的源代码. 贴上源代码 using System ...

  9. QString与中文,QString与std::wstring的相互转换(使用fromStdWString和u8关键字)

    Qt版本:5.5.1 Qt的QString功能丰富,对非英语语言的支持也不是问题,但支持得不够直接.例如,像 ? 1 QString str("死亡使者赛维"); 这样直接用带中文 ...

  10. WCF技术剖析之十一:异步操作在WCF中的应用(下篇)

    原文:WCF技术剖析之十一:异步操作在WCF中的应用(下篇) 说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实 ...