IO流

1:IO流

是Input与Output的简称 也叫输入与输出;其中Output是写,Input是读;

IO技术就是用于处理设备上数据,用于设备间数据的传输;

2:IO流的体系:

字节流:

两个抽象基类:字节输入流InputStream 读     字节输出流 OutputStream 写

字符流:

两个抽象基类:字符输入流 Reader  字符输出流 Writer

由这四个体系派生出来的子类在名称定义上都有规律:是抽象基类就不可以new;

 

3:命名规范及特点:  

所有的子类后缀名都是体系父类名。而前缀名就是这个子类对象的功能。

 

4:IO流的分类:

字节流和字符流;

 

5: 创建操作:

       

        FileReader fr=new FileReader();

        FileWriter fw=new FileWriter("Demo.txt")//创建一个文件

        write()方法是将字符串数据写入到内部缓冲区中;

        flush()是刷新缓冲区数据,在程序中可以执行多次;注:缓冲区满后也会自动刷新,

        close()表示流资源已经关闭,而且程序里的close只能执行一次;

        winddows里面的换行是”\r\t“;  例如:"abc\r\tdef" 打印出就是 (1)abc   (2)def

        read() 一次只能读取一个字符;返回-1就表示已经读到结尾;

        read(char[] )将读到的字符存储到指定字符数组中;

 

6:    flush()与close()的区别?

flush只是负责刷新,刷新完成后还可以继续使用,而且在程序中可以使用多次;

close()先刷新,然后将流关闭,close执行后流就关闭了,它在程序中只能用一次;

7:异常的处理:

使用try()  catch() finally()    

直接使用throws IOException(不建议使用,应该自己去处理异常,也就是使用try)

 

8:复制文件的两种方式:

复制的第一种方式

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

 

public class CopyTextTest {

 static void main(String[] args) throws IOException {

/*

 * 需求:对一个文本文件进行复制。

 * 复制的原理:其实就是对源数据进行读取,并将读取的到数据写入到的目的文件中。

 * 原来就是连读带写。

 * 说明要用到输入流和输出流。

 * 

 */

//1,通过读取流和要复制的文件进行关联。明确 源!

FileReader fr = new FileReader("IO流.txt");

//2,明确目的,通过输出流明确目的文件。 

FileWriter fw = new FileWriter("copy_1.txt");

//3,进行读写操作,要一边读,一边写。一次就操作一个字符。

int ch = 0;  //定义变量

while((ch=fr.read())!=-1){

fw.write(ch);

}

fw.close();

fr.close();  //读的固定代码,强记

}

 

}

9:复制文件的两种方式:

复制的第二种方式使用数组  和抛出异常的处理规范代码

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

 

public class CopyTextByArrayTest {

        /*

 * 复制方式二:通过数组的形式。

 */

FileReader fr = null;  

FileWriter fw = null;

try{

fr = new FileReader("IO流.txt");

fw = new FileWriter("copyt_2.txt");

//定义一个1024倍数长度的字符数组作为缓冲。

char[] buf = new char[1024];

int len = 0;

while((len=fr.read(buf))!=-1){

fw.write(buf,0,len);

}

}catch(IOException e){

}finally{

if(fw!=null){

try {

fw.close();

} catch (IOException e2) {

}

}

if(fr!=null){

try {

fr.close();

} catch (IOException e2) {

}

}

}

}

 

}

10:read(char[] );控制台打印出文件中的内容 (数组方式(方式一))

 

package cn.itcast.io.p1.charstream.read;

 

import java.io.FileReader;

import java.io.IOException;

 

public class FileReaderDemo2 {

 

public static void main(String[] args) throws IOException {

 

FileReader fr = new FileReader("demo.txt");

 

/*

 * 使用 带数组参数的read方法。 read(char[]): 将读取到的字符存储到指定的字符数组中。

 */

 

// 先定义一个字符数组。该数组的长度最好是1024的整数倍。

char[] buf = new char[1024];

 

// 调用读取方法,将字符存储到数组中。

        int len = 0;

while((len=fr.read(buf))!=-1){

System.out.println(new String(buf,0,len));  注意:缓冲区变成字符串用toString  String s=sb.toString

}

 

fr.close();

}

 

}

 

11.read()方式二

 

package cn.itcast;

 

import java.io.FileReader;

import java.io.IOException;

 

public class Demo15 {

public static void main(String[] args)throws IOException {

FileReader fr=new FileReader("test.txt");

int a=0;

while((a=fr.read())!=-1)

{

//System.out.println(a);//这打印的是对应的编码

            System.out.println((char)a);//这个打印的是文件的内容 也就是原样输出

                }

}

}

12:备注:

这里面有很对代码复用性以及在以后的格式都是这样,所以要必须理解记忆

private static final String LINE_SEPARATOR = System.getProperty("line.separator");                 

//相当于newLine或"\r\n" 都是换行的意思;

IO流第二部分

 

1:OutputStreamWriter与InputStreamReader

OutputStreamWriter是字符流通向字节流的桥梁;

InputStreamReader是字节流通向字符流的桥梁;

 

2:小细节

其实转换流已经出现了编码转换,而之所以产生两个子类FileReader和FileWriter是因为将本地默认编码表封装;

便于操作文本文件,而出现的便捷类;

记住如果字节流发生了变化,不再操作文本或者编码不再是编码表,就不可以使用FileReader和FileWriter,这时

只能使用转换流InputStreamReader和OutputStreamWriter;

 

3:键盘录入(按照毕老师的话就是背也要记住它):

BufferedReader bufr=new BufferedReader(new InputStreadReader(System.in));

4: 流的基本操作规律:

    目的是为了在开发中可以明确具体使用哪个流对象更合适;

    明确一:数据源或者目的(汇);

                源:对应的体系是InputStream  Reader;

                目的:对应的体系是 OutputStream  Writer;

    

    明确二:操作数据是否是纯文本文件;

                源:是纯文本文件   对应体系是:Reader;

                目的:也是纯文本文件  对应的体系是:Writer;

                如果不是文本文件直接用字节流操作;

    

    明确三:数据具体所在设备,因为不同设备对应不同的对象;

                源设备:硬盘            键盘            网络         内存

                             File开头           System.in          Socker           数组  ByteArray  CharArray   String

                

                目的设备:  硬盘             显示器         网络         内存

                             File开头           System.Out          Socker           数组  ByteArray  CharArray   String


    明确四:是否需要额外功能

                (1):需要提高效率:BufferedReader BufferedWriter;

                (2):需要桥梁编码转换:InPutStreamReader  OutPutStreamWriter

                (3):需要在输出时保证数据的原样表示形式吗?PrintStream PrintWriter 的print方法。

                (4):需要对输入流合并吗?SequenceInputStream。

                (5):需要将对象序列化和反序列化吗?ObjectOutputStream ObjectInputStream

                (6):需要操作基本类型数据吗?DataInputStream  DataOutputStream。

 

5:常见对象:

File file=new File("D:\\day\\.........");  //将("D:\\day\\.........")封装成对象;

注:Separator(静态方法 使用时直接类名打点调用,是系统默认的分隔符和“\\”“/”一样,不过它有跨平台性);

 

6:File类常见方法一(获取方法)

    File file = new File("d:\\0.mp3"); //举例说明方法怎么用

    long total = file.getTotalSpace();//举例说明方法怎么用

  1:  Long Length (获取文件字节数);

  2:  Long Freespace (获取磁盘可用剩余空间);  

  3:  Long time(获取创建时间);  //获取时间需要转换毫秒数;(颜色相同代码实现转化毫秒数)

  4 :   Long LastModified (获取最后一次修改时间); 

       System.out.println("time="+time);

       Date date = new Date(time);

       DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.LONG);

       String str_time = dateFormat.format(date);

       System.out.println(str_time);

 

      File file = new File("d:\\0.mp3"); //举例说明方法怎么用

      String name= file.getname();          //举例说明方法怎么用

 

    5 :Strng  getname (获取文件名);

    6: String getPath (后去完整路径);

    7: String  getParent(获取父类或磁盘名称)

    8: String  getabsolutePath (获取绝对路径)

  

      File类常见方法二(创建方法)

      File file = new File("d:\\0.mp3"); //举例说明方法怎么用

      boolean b = file.exists();          //举例说明方法怎么用

   1:boolean  createNewFile ( 创建文件  如果文件不存在则创建,若存在不创建 返回值是False);

   2:boolean  delete (删除文件   java删除文件不走回收站);

   3:boolean  exists (判断文件是否存在);

   4:boolean  isFile (判断是否是文件   首先要先用exists判断文件是否存在);

   5:boolean  isDirectory (判断是否是目录   首先要先用exists判断文件是否存在);

   6:boolean  mkdir(创建文件夹  只能创建一级目录 例:d:\\kk);

   7:boolean  mkdir(创建多级目录   例:d:\\kk\\ss\\aa\\cc); 

    8: ListRoots 列出电脑磁盘目录;

    9:ListFiles  列出磁盘下所有文件;

 

7 :递归 :

就是将函数自身直接或者间接的调用函数自身;对于一个功能重复使用,每次使用这个功能通常都需要上次功能运算的内容进行参与;注意问题:必须要加入条件,否则会出现栈内存溢出 StackoverflowError。注意递归次数必要过多,会栈内存溢出;

8:常用类:

1:Properties 是Hashtable子类;

        特点:持久的属性集;该集合可以和流技术结合;键值对应的都是字符串;不需要泛型;

          方法:Load  :将流关联的特定格式数据加载进集合;

                  Setproperty:修改文件内容;

                  Store:将集合中的元素存储到文件中;

 

2:打印流: PrintStream与PrintStream可以直接操作输入流和文件

     PrintStream(永远不会抛出IOException异常)

        方法:writer:显示的是最低八位,也就是讲一个整数的四个字节中最低一个字节写入到目的地;

                  print :表现形式不变,但是字节变了,打印方法可以将数据原来表示形式原样打印到目的地中;

       PrintStream 加上true有一个自动刷新;       

 

3:序列流:SequenceInputStream 对多个流进行合并 通常用来合并的都是碎片。

 

4:操作对象:ObjectInputStream与ObjectOutputStream

                        Serializable标记接口用于给类定义SerializablesionUID用的;与每个序列化类相关联;

                    静态数据是不会被序列化;

                    transient瞬态:当对非静态的数据不希望对其进行序列化的时候就用瞬态修饰;

5:操作基本数据类型:DataInputStream与DataOutputStream 

                    writerInt :保证基本数据类型的字节数不变,将整数字节都写入;

                    readInt:  自动读取四个字节并将其转换成整数返回;

 

6:操作字节数组:ByteArrayInputStream与ByteArrayOutputStream

                    用于操作数组流对象该流对象是对应设备为内存的流对象;这个流不需要关闭,因为没有使用系统资源

 

7:操作字符数组:CharArrayReader与CharArrayWrite

                    

8:操作字符串: StringReader 与StringWriter

 

9:管道流:PipedInputStream和PipedOutputStream

                 (1):输入与输出可以直接进行连接,通过结合线程使用;

                 (2):需要与多线程结合,单线程容易死锁;

 

10:其他类:RandomAccessFile 

                (1): 随机访问该对象中封装了操作文件的字节流和字符流缓冲区;通过指针方式对数组中数据进行操作;

                      因为指针可以由Seek方法任意指定位置,所以可以实现对数组数据随机访问;

                (2): 只能对文件进行读写;

                (3): 即可以读,又可以写;

                关联文件不存在则创建,如果存在不覆盖;

                随机读写文件时数据要有规律,随机读写就是将文件数据存储数据存储到数组中;通过操作角标方法

                getFilepointer和Seek对数组元素进行操作;

 

 

IO流体系:

 

字符流:

Reader

|--BufferedReader:

|--LineNumberReader

|--CharArrayReader

|--StringReader

|--InputStreamReaer

|--FileReader

 

 

Writer

|--BufferedWriter

|--CharArrayWriter

|--StringWriter

|--OutputStreamWriter

|--FileWriter

|--PrintWriter

 

 

 

字节流:

InputStream

|--FileInputStream:

|--FilterInputStream

|--BufferedInputStream

|--DataInputStream

|--ByteArrayInputStream

|--ObjectInputStream

|--SequenceInputStream

|--PipedInputStream

 

 

OutputStream

|--FileOutputStream

|--FilterOutputStream

|--BufferedOutputStream

|--DataOutputStream

|--ByteArrayOutputStream

|--ObjectOutputStream

|--PipedOutputStream

|--PrintStream

 

RandomAccessFile: seek();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值