总结的很粗糙,以后时间富裕了好好修改一下。

1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中,

所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类;

而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类。

【首先需要明白的是:流是干什么的???(为了永久性的保存数据)

  根据数据流向的不同分为输入流和输出流;

  根据处理数据类型的不同分为字符流和字节流;

【然后需要明白的是输入模式和输出模式是谁流向谁:

InputStream(字节输入流)和Reader(字符输入流)通俗的理解都是读(read)的。

OutputStream(字节输出流)和Writer(字符输出流)通俗的理解都是写(writer)的。

最后下面搞清楚各种流的类型的该怎么用,谁包含谁,理清思路。

2:InputStream类是字节输入流的抽象类,是所有字节输入流的父类,InputStream类具有层次结构如下图所示;

3:java中的字符是Unicode编码的,是双字节的。InputStream是用来处理字节的,在处理字符文本时很不方便。Java为字符文本的输入提供了专门的一套类Reader。Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。

4:输出流OutputStream类是字节输入流的抽象类,此抽象类表示输出字节流的所有类的超类。

5:Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。

6:File类是IO包中唯一代表磁盘文件本身的对象。通过File来创建,删除,重命名文件。File类对象的主要作用就是用来获取文本本身的一些信息。如文本的所在的目录,文件的长度,读写权限等等。(有的需要记忆,比如isFile(),isDirectory(),exits();有的了解即可。使用的时候查看API)

详细如下:
File类(File类的概述和构造方法)
A:File类的概述
  File更应该叫做一个路径
  文件路径或者文件夹路径
  路径分为绝对路径和相对路径
    绝对路径是一个固定的路径,从盘符开始
    相对路径相对于某个位置,在eclipse下是指当前项目下,在dos下
  查看API指的是当前路径
  文件和目录路径名的抽象表示形式
B:构造方法
  File(String pathname):根据一个路径得到File对象
  File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
  File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
 
File类(File类的创建功能)
  A:创建功能
    public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
    public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
    public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
(使用createNewFile()文件创建的时候不加.txt或者其他后缀也是文件,不是文件夹;使用mkdir()创建文件夹的时候,如果起的名字是比如aaa.txt也是文件夹不是文件;)
注意事项:
如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
 
File类(File类的重命名和删除功能)
  A:重命名和删除功能
    public boolean renameTo(File dest):把文件重命名为指定的文件路径
    public boolean delete():删除文件或者文件夹
  B:重命名注意事项
    如果路径名相同,就是改名。
    如果路径名不同,就是改名并剪切。
  C:删除注意事项:
    Java中的删除不走回收站。
    要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
 
File类(File类的判断功能)
  A:判断功能
    public boolean isDirectory():判断是否是目录
    public boolean isFile():判断是否是文件
    public boolean exists():判断是否存在
    public boolean canRead():判断是否可读
    public boolean canWrite():判断是否可写
    public boolean isHidden():判断是否隐藏
File类(File类的获取功能)
  A:获取功能
    public String getAbsolutePath():获取绝对路径
    public String getPath():获取路径
    public String getName():获取名称
    public long length():获取长度。字节数
    public long lastModified():获取最后一次的修改时间,毫秒值
    public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
    public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
 
File类(文件名称过滤器的概述及使用)
  A:文件名称过滤器的概述
    public String[] list(FilenameFilter filter)
    public File[] listFiles(FileFilter filter)
 package com.ningmeng;

 import java.io.File;

 public class Test {

     public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
File file=new File("aa.txt");//文件默认就创建在你创建的项目下面,刷新即可看到
System.out.println(file.exists());//判断文件是否存在
file.createNewFile();//创建文件,不是文件夹
System.out.println(file.exists());//再次判断是否存在
System.out.println(file.getName());//获取文件的名字
System.out.println(file.getAbsolutePath());//获取文件的绝对路径
System.out.println(file.getPath());//获取文件的相对路径
System.out.println(file.getParent());//获取文件的父路径
System.out.println(file.canRead());//文件是否可读
System.out.println(file.canWrite());//文件是否可写
System.out.println(file.length());//文件的长度
System.out.println(file.lastModified());//文件最后一次修改的时间
System.out.println(file.isDirectory());//判断文件是否是一个目录
System.out.println(file.isHidden());//文件是否隐藏
System.out.println(file.isFile());//判断文件是否存在
} }

  public String[] list():获取指定目录下的所有文件或者文件夹的名称数组

  public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

list()获取某个目录下所有的文件或者文件夹:

 package com.ningmeng;

 import java.io.File;

 public class FileTest {

     public static void main(String[] args){
File file=new File("D:/");//指定文件目录
String[] str=file.list();//获取指定目录下的所有文件或者文件夹的名称数组
for(String s : str){//加强for循环遍历输出
System.out.println(s);
} }
}
 package com.ningmeng;

 import java.io.File;

 public class FileTest {

     public static void main(String[] args){
File file=new File("D:/");//指定文件路径
File[] f=file.listFiles();//获取指定目录下的所有文件或者文件夹的File数组
for(File fi : f){//加强for循环遍历输出
System.out.println(fi);
} }
}

案例演示:

获取某种格式的文件比如获取某种后缀的图片,并输出文件名:

 package com.ningmeng;

 import java.io.File;

 public class FileTest {

     public static void main(String[] args){
File file=new File("C:\\Users\\biehongli\\Pictures\\xuniji");
String[] str=file.list(); for(String s : str){
if(s.endsWith(".jpg") || s.endsWith(".png")){//如果后缀是这种格式的就输出
System.out.println(s);
}
} }
}

下面演示获取文件夹下面子目录里面的文件获取(并没有完全获取子目录的子目录等等,仅仅获取了子一级目录):

 package com.ningmeng;

 import java.io.File;

 public class FileTest {

     public static void main(String[] args){
File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll"); File[] f=file.listFiles(); for(File fi : f){
if(fi.isDirectory()){//判断如果是一个目录
String[] s=fi.list();
for(String str : s){
if(str.endsWith(".jpg")){
System.out.println(str);
}
}
}
}
}
}

A:文件名称过滤器的概述

    public String[] list(FilenameFilter filter)
    public File[] listFiles(FileFilter filter)
 package com.ningmeng;

 import java.io.File;
import java.io.FilenameFilter; public class FileTest { public static void main(String[] args){
File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll"); String[] str=file.list(new FilenameFilter() {//过滤器,匿名内部类 @Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
//System.out.println(dir);//获取文件的路径
//System.out.println(name);//获取文件的名字
File f=new File(dir,name);
return f.isFile() && f.getName().endsWith(".jpg");
}
});
for(String s : str){
System.out.println(s);
} }
}

7:下面以一些字节输入输出流具体的案例操作(操作的时候认清自己使用的是字节流还是字符流):

注意:read()方法读取的是一个字节,为什么返回是int,而不是byte
字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111;那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上;24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型

FileInputStream的单个字节读取:

FileOutputStream的单个字节写入:

 package com.ningmeng;

 import java.io.FileInputStream;
import java.io.FileOutputStream; public class FileTest { public static void main(String[] args) throws Exception{
FileInputStream fis=new FileInputStream("aaa.txt");
FileOutputStream fos=new FileOutputStream("bbb.txt",true);
//FileOutputStream()后面加true指文件后面可追加 int a=fis.read();//read()一次读取一个字节
System.out.println(a);//读取的一个字节输出 fos.write(101);//write()一次写一个字节
fis.close();//一定记得关闭流,养成好习惯
fos.close();
}
}

FileInputStream和FileOutputStream进行拷贝文本或者图片或者歌曲:

 package com.ningmeng;

 import java.io.FileInputStream;
import java.io.FileOutputStream; public class FileTest { public static void main(String[] args) throws Exception{
FileInputStream fis=new FileInputStream("aaa.txt");
FileOutputStream fos=new FileOutputStream("bbb.txt");
//如果没有bbb.txt,会创建出一个 int b;
while((b=fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
}
}

FileInputStream和FileOutputStream定义小数组进行读写操作:

 package com.ningmeng;

 import java.io.FileInputStream;
import java.io.FileOutputStream; public class FileTest { public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt");
int len;
byte[] arr = new byte[1024 * 8];//自定义字节数组 while((len = fis.read(arr)) != -1) {
//fos.write(arr);
fos.write(arr, 0, len);//写出字节数组写出有效个字节个数
}
//IO流(定义小数组)
//write(byte[] b)
//write(byte[] b, int off, int len)写出有效的字节个数 fis.close();
fos.close();
}
}

IO流(BufferedInputStream和BufferOutputStream拷贝)

* A:缓冲思想
  * 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,
  * 这是加入了数组这样的缓冲区效果,java本身在设计的时候,
  * 也考虑到了这样的设计思想,所以提供了字节缓冲区流
* B.BufferedInputStream
  * BufferedInputStream内置了一个缓冲区(数组)
  * 从BufferedInputStream中读取一个字节时
  * BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
  * 程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
  * 直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个
* C.BufferedOutputStream
  * BufferedOutputStream也内置了一个缓冲区(数组)
  * 程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
  * 直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
 package com.ningmeng;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream; public class FileTest { public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt"); BufferedInputStream bis=new BufferedInputStream(fis);
//使用装饰模式,把fis装饰进去bis中。使用缓冲读取速度变快
BufferedOutputStream bos=new BufferedOutputStream(fos); int b;
while((b=bis.read())!=-1){
bos.write(b);
}
bis.close();
bos.close();
}
}

 面试题小数组的读写和带Buffered的读取哪个更快?

  * 定义小数组如果是8192个字节大小和Buffered比较的话
  * 定义小数组会略胜一筹,因为读和写操作的是同一个数组
  * 而Buffered操作的是两个数组
IO流(flush和close方法的区别)
flush()方法: 用来刷新缓冲区的,刷新后可以再次写出(字节缓冲流内置缓冲区,如果没有读取出来,可以使用flush()刷新来)
close()方法:用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
8:字符流FileReader和FileWriter
字符流是什么
  * 字符流是可以直接读写字符的IO流
  * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.    
IO流(什么情况下使用字符流)
* 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
* 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
* 读取的时候是按照字符的大小读取的,不会出现半个中文
* 写出的时候可以直接将字符串写出,不用转换为字节数组
 
IO流(字符流是否可以拷贝非纯文本的文件)
* 不可以拷贝非纯文本的文件
* 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去
* 如果是?,直接写出,这样写出之后的文件就乱了,看不了了
 package com.ningmeng;

 import java.io.FileReader;
import java.io.FileWriter; public class FileTest { public static void main(String[] args) throws Exception{
//FileReader类的read()方法可以按照字符大小读取
FileReader fr=new FileReader("aaa.txt");
int b;
while((b=fr.read())!=-1){
System.out.println((char)b);//int类型转为字符型
}
fr.close(); //FileWriter类的write()方法可以自动把字符转为字节写出
FileWriter fw = new FileWriter("aaa.txt",true);
fw.write("aaa");
fw.close(); //字符流的拷贝
FileReader fr2 = new FileReader("aaa.txt");
FileWriter fw2 = new FileWriter("bbb.txt"); int ch;
while((ch = fr2.read()) != -1) {
fw2.write(ch);
} fr2.close();
fw2.close();
}
}
 package com.ningmeng;

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter; public class FileTest { public static void main(String[] args) throws Exception{
BufferedReader br=new BufferedReader(new FileReader("aaa.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("bbb.txt"));
//BufferedReader和BufferedWriter的使用:
int b;
while((b=br.read())!=-1){
bw.write((char)b);
}
br.close();
bw.close();
}
}

 先写到这里吧,内容比较多,以后有时间再总结,也方便自己脑补                                         

Java中IO流,输入输出流概述与总结的更多相关文章

  1. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  2. java 中 IO 流分为几种?(未完成)

    java 中 IO 流分为几种?(未完成)

  3. JAVA中IO流总结

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

  4. IO流输入 输出流 字符字节流

    一.流 1.流的概念 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. ...

  5. JAVA中IO流详解

    IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...

  6. Java中IO流

    * IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流,输出流. * 流按操作类型分为两种: * 字节流 : ...

  7. java中io流浅析

    1.java.io包下File类:java程序中的此类的一个对象,就对应着硬盘中的一个文件或网络中的一个资源.File file1 = new File("d:\\io\\helloworl ...

  8. Java中IO流中的装饰设计模式(BufferReader的原理)

    本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...

  9. java中IO流小解

    下面这张图列出了java中一些处理流: java中根据操作对象的不同可以分为:字节流和字符流. 首先我们先表示一下什么叫节点流和处理流: 节点流:可以从或向一个特定的地方(节点)读写数据.如FileR ...

随机推荐

  1. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  2. (JS+CSS)实现图片放大效果

    代码很简单,在这里就不过多阐述,先上示例图: 实现过程: html部分代码很简单 <div id="outer"> <p>点击图片</p> &l ...

  3. System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。

    在NHibernate数据库查询中出现了这个错误,由于是数据库是mysql的,当定义的字段为char(36)的时候就会出现这个错误. [解决方法] 将char(36) 改成varchar(40)就行了 ...

  4. TortoiseGit 文件比对工具使用 Beyond Compare 和 DiffMerge

    TortoiseGit 内置的文件比对工具是 TortoiseMerge,用于文件比对和解决冲突合并,TortoiseGit 还支持外部的比对工具使用,比如 Beyond Compare 和 Diff ...

  5. 强强联合,Testin云测&云层天咨众测学院开课了!

    Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱?   2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...

  6. Javascript高性能编程-提高Dom访问速度

    在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度.下面是对如何优化的一些总结: 将需要多次操作的节点存储在一个 ...

  7. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  8. linux yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  9. osi(open system interconnection)模型的通俗理解

    OSI模型的理解: 以你和你女朋友以书信的方式进行通信为例. 1.物理层:运输工具,比如火车.汽车. 2.数据链路层:相当于货物核对单,表明里面有些什么东西,接受的时候确认一下是否正确(CRC检验). ...

  10. 一不小心写了个WEB服务器

    开场 Web服务器是啥玩意? 是那个托管了我的网站的机器么? No,虽然那个也是服务器,但是我们今天要说的Web服务器主要是指像IIS这样一类的,用于处理request并返回response的工具,没 ...