Java-IO流篇

1. java.io.File类

File类代表系统文件(文件和目录),磁盘上的文件和目录在Java程序中是用File类的实例来表示。

常用的构造方法:File (String pathname);File(File parent, String child) ;File(String parent,String child)

以pathname为路径创建File对象,如果pathname是相对路径,则是相对于Java的

系统属性user.dir中的路径(即当前字节码运行的目录)。

File类的一个常用属性:public static final String separator

存储了当前系统的路径分隔符。在Unix中该字段值为“/”,在Windows中为“\\”.

作用:实现了跨平台性,用这个表示分隔符就不用担心,不同系统的表示方式。

2.File类的常用方法

File的读写运属性:

boolean   canExecute() ;//测试应用程序是否能够执行该File文件。

boolean   canRead(); //是否可读取。

boolean   canWrite(); //是否可以修改

判断:

boolean   equals(Object obj); //测试此抽象路径名是否与给定对象相等

boolean    exists(); //测试此文件或目录是否已存在

boolean    isDirectory() ;//判断是否是一个目录

boolean    isFile (); //判断是否是一个文件

boolean    isHidden(); //判断是否是一个隐藏文件

获取:

long     length(); //返回文件的长度,以字节为单位

long     lastModified(); //返回文件最后一次被修改的时间

File      getAbsoluteFile() ;//返回此的抽象路径名的绝对路径名形式。

String  getAbsolutePath(); //返回此抽象路径名的绝对路径名字符串

String  getName() ;//得到该文件名或该抽象路径的最后一个目录的名称。

String  getParent();// 返回父目录的路径字符串,如果此路径没有指定父目录,则返回null

String  getPath(); //将此抽象路径名转换为一个路径名字符串。

对文件的操作:

boolean  createNewFile(); //当不存在时,创建一个新的空文件

boolean  delete(); //删除此文件,如果是目录,必须是空才能删除,且删除的是最底的目录

boolean  mkdir() ;//创建此抽象路径名指定的目录

boolean  mkdirs(); //创建此目录,包括所有必需但不存在的父目录。

boolean  renameTo( File  dest);// 重新命名此文件

浏览目录中的文件和子目录

String [] list() ;//返回此目录的文件名和目录名的数组

File[] listFiles();//返回此目录中的文件和目录的File实例数组。

File[] listFiles(FilenameFilter filter) ;//返回此目录中满足指定过滤器的文件和目录

java.io.FilenameFilter接口:实现该接口的类实例可以用于过滤文件名。

3. File创建的步骤

1.文件或目录。

2.文件—a.先判断,f.exists(); b.创建 ,f.createNewFile(); //只能在已存在的路径下创建该文件。

目录—a.先判断,f.exists(); b.创建—    f.mkdir();//路径上仅最后一个目录是不存在时

|—  f.mkdirs();//路径上后面有多个目录不存在时

 4.Java I/O 原理

数据流(Stream) 是指数据通信的通道。

Java程序对数据的输入,输出操作是以“流”的方式进行的。JDK中提供了各式的“流”类来获取不同种类的数据

5.流的分类

5.1 流的方向:

  • 输入流:程序可以从中读取数据的流
  • 输出流:程序可以向其中写入数据的流

5.1 数据传输单位

  • 字节流:以字节为单位传输数据的流。
  • 字符流:以字符为单位传输数据的流。

5.3 功能

  • 节点流:用于直接操作目标设备的流
  • 处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更为强大,灵活的读写功能。

6.流的种类

所有的流类都位于java.io包中,都分别继承自以下四种抽象流类

输入流  ------  InputStream(字节流)    ------  Reader(字符流)

输出流  ------  OutputStream(字节流)  ------  Writer(字符流)

 7.InputStream 抽象类

继承InputStream的流都是用于向程序中输入数据的,且数据的单位是一个字节。

InputStream  |---- FileInputStream (节点流)            |----  SequenceInputStream (处理流)

|---- PipedInputstream                      |----  ObjectInputStream

|---- StringBufferInputStream            |----   FilterInputStream   |---- DataInputStream

|---- ByteArrayInputStream                                                     |---- BufferdInputStream

7.1 InputStream 的基本方法(都有 throws IOException)

  • abstract int  read() ;//从输入流中读取数据的下一个字节的整型表示(asii码值),遇到末尾是返回-1
  • int  read(byte [] b) ;//从输入流中读取b.length个字节的数据存入b中,返回实际读取到的字节总数。
  • int  read(byte [] b,int off,int len); //读取len个字节的数据,从off写入。
  • void close (); //关闭此输入流,并释放与此流相关联的所有系统资源
  • long skip(long n); // 跳过和丢弃此输入流中数据的n个字节,返回丢弃的字节数
  • int   available (); //返回此输入流下一个方法可以(不受阻塞)读取(或跳过)的估计字节数,碰到末尾返回0

8.OutputStream  抽象类

继承OutputStream的流是程序用于向外输出数据的,且数据单位为一个字节

OutputStream  |---- FileOutputStream (节点流)          |---- ObjectOutputStream (处理流)

|---- PipedOutputStream                    |---- FilterOutputStream |---- DataOutputStream

|---- ByteArrayOutputStream                                                 |----  BufferedOutputStream

8.1 OutputStream  基本方法 (都有 throws IOException)

  • abstract  void write (int b) ;//将指定的字节(对应asii码)写入此输出流
  • void write (byte []b) ;//将b.length个字节写入此输出流。
  • void write (byte []b,int off,int len) ;//从off开始,写入len个字节
  • void flush() ;//刷新此输出流并强制写出所有缓冲的输出字节。
  • void close(); //关闭此流,并释放相关资源

9. Reader 抽象类

继承Reader 的流都是向程序输入数据,数据单位为一个字符(16位)

Reader |---- PipedReader (节点流)         |---- BufferedReader  |---- LineNumberReader (处理流)

|---- StringReader(节点流)         |---- FilterReader  |---- PushbackReader  (处理流)

|---- CharArrayReader(节点流)   |---- InputStreamReader (处理流)|---- FileReader(节点流)

9.1 Reader 的基本方法

  • int  read();//读取单个字符,以整型数值返回,达到末尾返回-1
  • int  read( char[] c);// 读入char数组中,返回实际读取的字符数。
  • int  read(char [] c,int off,int len);//读取len个字符,并从off开始写入
  • void close();//关闭流,并释放相关资源
  • long skip(long n);//跳过n个字符

10. Writer 抽象类

继承Writer的流是程序用于向外输出数据的,且数据单位为一个字符(16位)。

Writer |---- PipedWriter(节点流)    |----  BufferedWriter (处理流)

|---- CharArrayWriter         |----  PrintWriter  (处理流)

|---- StringWriter               |----  OutputStreamWriter(处理流) |---- FileWriter(节点流)

10.1 Writer 的基本方法

  • void writer (int c) ;//写入单个字符
  • void  writer (char [] c);//写入字符数组
  • void  writer (char [] c,int off, int len);//写入len个字符
  • void  writer (String str);//写入字符串
  • void  writer (String str,int off,int len);//写入字符串的某一部分
  • void  flush();//强制将缓冲的数据写到目的地
  • void close();//关闭此流,但要先刷新它

11. 节点流类型

注意:

标准输入输出流

默认输入设备是键盘,输出设备是显示器。

System.in的类型是InputStream.

System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类

 12. 文件流

文件流主要用于操作文件

JDK提供了4种:

  • FileInputStream继承自InputStream
  • FileOutputStream继承自OutputStream
  • FileReader继承自Reader的InputStreamReader
  • FileWriter继承自Writer的OutputStreamWriter

 13.转换流

在IO包中,有字节流和字符流,但是还存在转换流:字节流-字符流。

转换流用于字节流和字符流之间转换

JDK提供了两种转换流

InputStreamReader: 是Reader的子类,将输入的字节流变为字符流,即将一个字节流的

输入对象变成字符流的输入对象。

OutputStreamWriter:是Writer的子类,将输出的字符流变成字节流,即将一个字符流的

输出对象变为字节流的输出对象。

14. 内存流

内存流主要用于操作内存

ByteArrayInputStream 和 ByteArrayOutputStream

输入和输出可以从文件中来,也可以设置在内存之上。

ByteArrayInputStream主要完成将内容从内存读入程序之中,ByteArrayOutputStream

主要是将数据写入内存中。

15.缓冲流

缓冲流是建立在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,还增加了一些新方法

JDK提供四种缓冲流:

BufferedInputStream 可以对任何的InputStream 流进行包装。

 BufferedOutputStream 可以对任何的OutputStream流进行包装。

BufferedReader 可以对任何的Reader流进行包装:新增了readLine()方法用于一次读取一行字符串(‘\r‘或‘\n‘为一行结束)

BufferedWriter 可以对任何的Writer流进行包装:新增了newLine()方法涌入写入一个行分隔符。

注意: 对于缓冲输出流,最好在关闭此流前用flush() 方法将缓存区的数据刷新。

关闭处理流,会自动关闭所包装的所有底层流

16.数据流

DataInputStream ,DataOutputStream 属于处理流。提供了可以存取与机器无关的Java基本数据类型的方法

构造方法:参数为一字节型的节点流

DataInputStream (InputStream in);

DataOutputStream (OutputStream out);

17.打印流

PrintStream 和PrintWriter 都属于输出流,分别针对字节和字符。

两者:都提供了一系列重载的print和println方法输出各种类型的数据

两者:的输出操作不会抛出异常,System.out.就是PrintStream的一个实例

18.对象流

JDK提供的ObjectOutputStream和ObjectInputStream 类是用于存储和读取基本数据类型或对象的处理流

  • 用ObjectOutputStream类保存基本数据类型或对象的机制叫序列化
  • 用ObjectInputStream类读取基本数据类型或对象的机制叫反序列化

注意:能被序列化象所对应的类必须实现java.io.Serializable这个标识性接口

19.管道流(Piped) 

PipedInputStream(PipedReader) ,PipedOutputStream(PipedWriter) 适合于线程之间的通信

使用管道流类,可以实现各个程序模块之间的松耦合通信,而不用对模块内部进行修改。达到“强内聚,弱耦合”的特点。

20.RandomAccessFile 类

主要功能是完成随机读取功能,可以读取指定位置的内容

文件的打开模式:
?“r” 以只读方式打开。调用结果对象的任何write 方法都将导致抛出IOException。
?“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
?“rws” 打开以便读取和写入,对于“rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
?"rwd" 打开以便读取和写入,对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

21.编码问题解决方法

法一:java.lang.string

//法一: xx编码-->new String(byte[]b,Charset xx)-->Stirng.getBytes(Charset yy)-->yy编码
    public static void method_1() throws Exception
    {
         FileInputStream fis=new FileInputStream ("F:\\test\\test.txt");
         File f=new File("F:\\test\\copy-test2.txt");
         if(!f.exists())
             f.createNewFile();
         FileOutputStream fos=new FileOutputStream(f);

         byte [] b=new byte[10];
         int len=0;
         while((len=fis.read(b))!=-1)
        {
             //思路:GB2312 到UTF-8,必须通过一个中间编码介质,这里是String
             //将字节数组转换为string (其编码与操作系统一样是GBK)
             //再将String转成其他编码的字节数组
                  String s=new String(b,0,len,"GB2312");
                  b=s.getBytes("UTF-8");
          //fos.write(b,0,len);注意:这里是错误的,因为转码后的字节数组的长度变了,不是原来长度的字节数组
                  fos.write(b);
         }
         if(fos!=null)
           fos.close();
         if(fis!=null)
             fis.close();
    }

法二:java.io.InputStreamReader/OutputStreamWriter:桥转换

//法二(推荐):【IO流】xx编码-->inputstreamreader(file,"xx")--->outputStreamWriter(file,"yy")-->yy编码
    public static void method_2()throws Exception
    {
         FileInputStream fis=new FileInputStream ("F:\\test\\test.txt");
         File f=new File("F:\\test\\copy-test.txt");
         if(!f.exists())
             f.createNewFile();
         FileOutputStream fos=new FileOutputStream(f);
         //io流转接
         InputStreamReader isr=new InputStreamReader(fis,"GB2312");
         OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
         //读取:
         char [] cs=new char[1024];
         int len=0;
         while((len=isr.read(cs))!=-1)
        {
             osw.write(cs,0,len);
         }
         //关闭流
        osw.flush();
        osw.close();
        isr.close();
    }

方法三:java.nio.Charset

 总结:

思路:1.明确源头,目的地是什么,内存,硬盘文件。

键盘(System.in属于inputstream),控制台(System.out.属于printstrem,outputstream)

2.流向,是输入,还是输出。

3.操作的数据类型,是字符还是字节

4.有哪些适合的包装流(处理流)适合题目要求,是缓冲流,数据流,内存流,转换流。

时间: 2024-07-28 18:18:00

Java-IO流篇的相关文章

《二》Java IO 流的分类介绍

一.根据流向分为输入流和输出流: 注意输入流和输出流是相对于程序而言的. 输出:把程序(内存)中的内容输出到磁盘.光盘等存储设备中        输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序(内存)中 综合起来:   二.根据传输数据单位分为字节流和字符流 上面的也是 Java IO流中的四大基流.这四大基流都是抽象类,其他流都是继承于这四大基流的.   三.根据功能分为节点流和包装流 节点流:可以从或向一个特定的地方(节点)读写数据.如FileReader. 处理流:是对一个已存在的

java io流 分析

java io流 在java应用或者android应用中很常见,并且使用频率很高的一个模块.当时每次需要用到这个模块的时候总是有提笔忘字的感觉,不知道该用哪个流或者该用谁包装谁. 所以我就花了一点时间把这个块的结构梳理了一下.一是能让自己理清一下思路.二是以后如果还有提笔忘字的时候,看这篇文章就好了. 首先java io流分两大系统InputStream 和Reader,前者及其子类主要用于读取字节流,后者及其子类主要用于读取字符流.下面是InputSteram系的继承树 首先可以看InputS

java IO流详解(一)

从本篇博文开始,详细讲解JAVA IO流的基本操作,力求每一个例子都给大家一个DEMO,在最终完成的时候,我会贴出最终的源码,方便大家交流学习. 上一篇博文中转载了大神的博文和图片,非常好! 文章链接如下:Java IO流 下面一个个的用实例进行讲解每个IO流的基本用法. 1 File文件 public static void main(String[] args) throws IOException { File file = new File("."); myPrint(file

Java基础17:Java IO流总结

Java基础17:Java IO流总结 IO流概述 在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得更加容易. 输入和输出 术语"输入"和"输出"有时候会有一点让人疑惑.一个应用程序的输入往往是另外一个应用程序的输出?那么OutputStream流到底是一个输出到目的地的流呢,还是一个产生输出的流?InputStre

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

装饰器模式及JAVA IO流例子★★★☆☆

一.什么是装饰模式 通过关联机制给类增加行为,其行为的扩展由修饰对象来决定: 二.补充说明 与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象: 或者说,继承是对类进行扩展,装饰模式是对对象进行扩展: 三.角色 抽象构件 具体构件 抽象装饰类 具体装饰类 说明:具体构件.抽象装饰类.具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件: 四.例子 例子说明: 画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画:

java io流(字节流)复制文件

java io流(字节流) 复制文件 //复制文件 //使用字节流 //复制文本文件用字符流,复制其它格式文件用字节流 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ //字符流方式 //FileReader fz = new FileReader("E:/1.txt"); //FileWriter zt = new FileWriter(&qu

【Android】数据存储-java IO流文件存储

1.数据持久化:将在内存中的瞬时数据保存在存储设备中.瞬时数据:设备关机数据丢失.持久化技术提供一种机制可以让数据在瞬时状态和持久状态之间转换. 2.Android中简单的三种存储方式:文件存储.SharedPreference 存储以及数据库存储. 1.文件存储 :不对数据作任何处理,将数据原封不动地存储到文件中,适合存储一些简单的文本数据和二进制数据. a.将数据存储到文件中 Context类提供了一个openFileOutput()方法,可以用于将数据存储到文件中.这个方法接收两个参数,第

Java IO流学习总结

Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表. 字节流和字符流的区

Java IO流学习总结(转)

原文地址:http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.   IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符