IO流,也称为数据流,用于处理设备之间的数据传输。
  JAVA对数据的操作就是通过流的方式,而流分为两种:字符流,字节流

字符流:

  可以内部制定码表,处理文字很方便,字符流里的基类是Reader,Writer
字节流:

  操作字节数据。和字符流差不多,基类是InputSteram,OutputStream,如果不使用缓冲区,不需要flush()方法,查看父类方法,使用子类建立对象。

  IO包中子类名称后缀就分明了字节流和字符流,前缀说明了功能,缓冲区的出现是为了提高流的效率,在创建缓冲区之前要先有流对象,只要用到缓冲区就要用到flush()刷新方法。关闭缓冲区就会关闭缓冲区中调用的流对象。

    bufferedWriter缓冲区提供跨平台换行符方法newLine();
    bufferedReader缓冲区提供一次读取一个文本行的方法readLine();不包含终止符,读到文件末尾返回null,加强了原有功能,如果想提高效率就使用缓冲区,Bufferedxxx。
装饰设计模式:
  当想要对已有的对象进行功能增强时,定义一个类将已有对象传入,基于已有功能,提供加强功能,那么这个自定义的类就称为装饰类,装饰模式比继承要灵活,避免继承体系臃肿,降低类与类的关系,装饰类和被装饰类通常是一个体系的。

  因为增强已有对象,具备的功能和已有的是相同的,只不过是加强功能,通常通过构造方法(接收被装饰的对象),基于传入对象的功能提供更强的功能方法。

流操作的基本规律:
  最痛苦的就是流对象有很多,不知道该用哪一个。

  通过三个明确来完成

    1,明确源和目的。
      源:输入流。InputStream Reader。
      目的:输出流。OutputStream Writer。
    2,操作的数据是否是纯文本。
      是:字符流。
      不是:字节流。

    3,当体系明确后,在明确要使用哪个具体的对象。
      通过设备来进行区分:
      源设备:内存,硬盘,键盘。
      目的设备:内存,硬盘,控制台。

  流操作的只有数据,而数据最明显的体现形式就是文件,而文件包含很多信息,属性,想操作文件的话,java就把文件封装成了对象File类,方便对文件或者文件夹的属性进行操作。

  properties是Hashtable的子类,具备Map集合的特点,存储的键值对都是字符串,是集合中和IO技术结合的容器,用于键值对形式的配置文件。

  字节流的两个顶层父类:

    1.InputStream   2.outputStream

  字符流的两个顶层父类:

    1.Reader    2.Writer

  这些体系的子类都是已父类名做为后缀,而前缀是该对象的功能。

  字符流:

  简单例子:将一个字符串写入到文件中

   //创建一个可以往文件中写入字符数据的字符流输出对象
  FileWriter fe = null;
try {
//在创键对象时必须要明确该文件的存储目的地
//如果目的地存在该文件,则会被覆盖
//如果构照文件中加入true,则可以对文件进行续写
fe=new FileWriter("F:/1.txt",true);
//调用write写入数据
fe.write("asjhgfajkshgfaksjdfg");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {//关闭流,关闭资源,在关闭前会调用flush();刷新缓冲区
  fe.close();
} catch (IOException e) {
  e.printStackTrace();
}
}
//将硬盘中的文件读取然后输入到控制台中:
//1.创建读取流对象
FileReader fr=null;
try{
//2.在读取的时候一定要 被明确被读取的文件,确保这个文件存在,不然会发生异常
fr=new FileReader("f:/1.txt");
int aa=0;
while((aa=fr.read())!=-1){
System.out.println((char)aa);
}
  . . . .. . . .
  //用数组读取文件:
  //1.创建读取流对象
FileReader fr=null;
try{
//2.在读取的时候一定要 被明确被读取的文件,确保这个文件存在,不然会发生异常
fr=new FileReader("f:/1.txt");
char [] ch=new char[1024];
int leng=0;
while((leng=fr.read(ch))!=-1){
System.out.println(new String(ch,0,leng));
}

  如果字符串中需要换行,可以在字符串中加入常量:(根据系统资源获取对应的换行符)
  private static final String LINE_SEPARATOR =System.getProperty("line.separator");
  IO异常:在用读写流对象调用colse()的时候一定要加判断判断对象不等于null否则会抛空指针异常

  字符流缓冲区对象:BuffredReader , BuffredWriter
  在字符流缓冲区中:
    newLine():写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。
    Newline():只有BuffredWriter对象具备。
    readLine():读取一个文本行,一次读取一行数据,遇到换行符就终止,返回读取到的字符串,如果读取到流的末尾就返回null。
    readKine():方法只有BuffredReader具备。

  使用方法:

 public static void main(String[] args) throws IOException {
//字符流关联文件
FileReader fr=new FileReader("f:/1.txt");
FileWriter fw=new FileWriter("f:/2.txt");
BufferedReader br=new BufferedReader(fr);
BufferedWriter bw=new BufferedWriter(fw);
char [] ch=new char[1024];
int leng=0;
//使用缓冲区读取数据,从缓冲区中读取数据
while((leng=br.read(ch))!=-1)
{
//使用缓冲区写入数据到内存中
bw.write(ch, 0, leng);
}
//关闭缓冲区,实际上就是关闭了流对象
br.close();
bw.close();
}
自定义缓冲区:
public class MybufferReader {
private Reader r;
//定义一个数组作为缓冲区
private char [] ch=new char[1024];
//定义一个指针用于操作数组中的元素,当操作到最后一个元素时指针归零
private int pos=0;
//定义一个计数器,用于记住缓冲区的数据个数,当缓冲区中数据减到零,就从源中继续获取数据到缓冲区中
private int count=0;
public MybufferReader(Reader r) {
this.r=r;
}
/*
该方法一次从缓冲区中取一个字符
  */
public int myReader() throws IOException
{
//从源中获取一批数据到缓冲区中,只有count为0时。
if(count==0)
{
count=r.read(ch);
pos=0;
}
//当源中的数据取完时候返回负一
if(count<0)
return -1; char ch1=ch[pos];//读取缓冲区中数据
pos++;//数组的指针+1
count--;//缓冲区中数据的个数-1
return ch1; }
public String myReaderLine() throws IOException
{
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=myReader())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
//将从缓冲区中读到的字符存储到转存行数据的缓冲区中
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void mycolse() throws IOException
{
r.close();
} }
装饰设计模式:
对一组对象的功能进行增强的时候,就可以使用该模式来解决问题。
例如:public class PersonDemo {
public static void main(String[] args) {
Person p=new Person();
p.chifan();
newperson p1=new newperson(p);
p1.chifan();
newperson2 p2=new newperson2();
p2.chifan();
}
}
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
//这个类的出现是为了增强Person的功能出现的
class newperson
{
private Person p;
//构造方法中传入Person对象
public newperson(Person p) {
this.p=p;
}
//增强chifan方法
public void chifan()
{
System.out.println("喝酒");
p.chifan();
System.out.println("吃甜点");
}
}
//这个类继承于Person
class newperson2 extends Person
{
public void chifan()
{
System.out.println("喝酒");
super.chifan();
System.out.println("吃甜点");
}
}
装饰设计模式和继承都能实现这一特点,特点:只为提高功能,进行的继承导致继承体系越来越臃肿,不够灵活,而装饰比继承灵活。
BufferedReader的子类LineNumberReader的基本使用。
例子: public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("ArrayListTest.java");
LineNumberReader lin=new LineNumberReader(fr);
String str=null;
//一次读取一行
while((str=lin.readLine())!=null)
{//输出行号和行内容
System.out.println(lin.getLineNumber()+":"+str);
}
}

IO流基础的更多相关文章

  1. Java 中级IO流基础及主要API编程

    1. IO流基础知识,流 是字节从源到目的地的运行的轨迹,次序是有意义的, 字节会按照次序进行传递, 比如Hello World 在下图中的传递的轨迹.该图形象的解释了IO中流的概念.流中全是字节.2 ...

  2. 乐字节Java之file、IO流基础知识和操作步骤

    嗨喽,小乐又来了,今天要给大家送上的技术文章是Java重点知识-IO流. 先来看看IO流的思维导图吧. 一. File 在Java中,Everything is Object!所以在文件中,也不例外! ...

  3. Java IO流基础总结

    前言 好久不用Java的IO流,把好多的基础知识都忘了,昨天在写一段代码,发现好多细节都忘了.那天在组织组内代码评审的时候,发现有人在乱用IO流相关的类,所以还是写篇文章,把这个知识点总结一下. IO ...

  4. IO流-基础

    //创建输出流对象 FileWriter fw = new FileWriter("d:\\a.txt"); /* * 创建输出流对象做了哪些事情: * A:调用系统资源创建了一个 ...

  5. IO流基础,创建File对象与方法是用

    1.io流主要用途读取本地文件或服务器文件,进行本地或者服务器开呗工作 构造函数   绝对路径够构造方法:    File f = new File("D:\\test\\a.txt&quo ...

  6. Java之IO流基础流对象

    输入流和输出流是相对于内存设备而言 即将外设中的数据读取到内存中就是输入    将内存中的数据写入到外设中就是输出   字符流的由来:     其实就是:字节流读取文字字节数据后,不直接操作而是先查指 ...

  7. IO流基础加强

    字节流对象:InputStream,OutputStream 缓冲字节流对象:BufferedInputStream , BufferedOutputStream 用法和字符流对象一样,但也有区别, ...

  8. java io 流基础

  9. Java中的IO流之输入流|乐字节

    亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入 ...

随机推荐

  1. .net开源工作流引擎ccflow

    关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款1 ...

  2. 《A First Course in Probability》-chaper5-连续型随机变量-随机变量函数的期望

    在关于离散型随机变量函数的期望的讨论中,我们很容易就得到了如下的等式: 那么推广到连续型随机变量,是否也存在类似的规律呢? 即对于连续型随机变量函数的期望,有: 这里给出一个局部的证明过程,完整的证明 ...

  3. 深入理解jvm之内存区域与内存溢出

    文章目录 1. Java内存区域与内存溢出异常 1.1. 运行时数据区域 1.1.1. 程序计数器 1.1.2. java虚拟机栈 1.1.3. 本地方法栈 1.1.4. Java堆(Java Hea ...

  4. hud1856 并查集

    Problem Description Mr Wang wants some boys to help him with a project. Because the project is rathe ...

  5. Quartz.Net任务调度框架

    Quartz.Net是一个开源的任务调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作. 相对于我们用的线程里面while(true)然后sleep来执行某个操作,应该算的上是高端,大气,上 ...

  6. mxGraph实现按住ctrl键盘拖动图形实现复制图形功能

    实现这个功能很easy,仅仅须要重写moveCells方法就能够了.以下是源文件里的代码: mxGraph.prototype.moveCells = function(cells, dx, dy, ...

  7. 搭建docker私有仓库 笔记

    抄送消息到企业微圈 avalon组件 twitterCopy/twitterCopy 说明 说明 说明 说明 说明 说明 该组件提供接口 开发者可以吧 有需要分享到微圈的的信息 发布到微圈中去. 应用 ...

  8. vim note(6)--vim的一个较全的介绍(转)

    vim的配置文件 ~/.vimrc       用户的默认配置文件 ~/.vim/plugin/   用户的默认脚本文件的存放文件夹 ~/.vim/ftplugin/ 用户的默认文件类型相关脚本文件的 ...

  9. 一个备份MySQL数据库的简单Shell脚本(转)

    Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行.我们也可以逐一敲入命令手动执行.如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后就可以随意反 ...

  10. c++拷贝构造函数(深拷贝,浅拷贝)详解

    一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a;   而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面 ...