Java中IO流,输入输出流概述与总结

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

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)
 1 package com.ningmeng;
2
3 import java.io.File;
4
5 public class Test {
6
7 public static void main(String[] args) throws Exception{
8 // TODO Auto-generated method stub
9 File file=new File("aa.txt");//文件默认就创建在你创建的项目下面,刷新即可看到
10 System.out.println(file.exists());//判断文件是否存在
11 file.createNewFile();//创建文件,不是文件夹
12 System.out.println(file.exists());//再次判断是否存在
13 System.out.println(file.getName());//获取文件的名字
14 System.out.println(file.getAbsolutePath());//获取文件的绝对路径
15 System.out.println(file.getPath());//获取文件的相对路径
16 System.out.println(file.getParent());//获取文件的父路径
17 System.out.println(file.canRead());//文件是否可读
18 System.out.println(file.canWrite());//文件是否可写
19 System.out.println(file.length());//文件的长度
20 System.out.println(file.lastModified());//文件最后一次修改的时间
21 System.out.println(file.isDirectory());//判断文件是否是一个目录
22 System.out.println(file.isHidden());//文件是否隐藏
23 System.out.println(file.isFile());//判断文件是否存在
24 }
25
26 }

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

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

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

 1 package com.ningmeng;
2
3 import java.io.File;
4
5 public class FileTest {
6
7 public static void main(String[] args){
8 File file=new File("D:/");//指定文件目录
9 String[] str=file.list();//获取指定目录下的所有文件或者文件夹的名称数组
10 for(String s : str){//加强for循环遍历输出
11 System.out.println(s);
12 }
13
14 }
15 }
 1 package com.ningmeng;
2
3 import java.io.File;
4
5 public class FileTest {
6
7 public static void main(String[] args){
8 File file=new File("D:/");//指定文件路径
9 File[] f=file.listFiles();//获取指定目录下的所有文件或者文件夹的File数组
10 for(File fi : f){//加强for循环遍历输出
11 System.out.println(fi);
12 }
13
14 }
15 }

案例演示:

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

 1 package com.ningmeng;
2
3 import java.io.File;
4
5 public class FileTest {
6
7 public static void main(String[] args){
8 File file=new File("C:\\Users\\biehongli\\Pictures\\xuniji");
9 String[] str=file.list();
10
11 for(String s : str){
12 if(s.endsWith(".jpg") || s.endsWith(".png")){//如果后缀是这种格式的就输出
13 System.out.println(s);
14 }
15 }
16
17
18 }
19 }

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

 1 package com.ningmeng;
2
3 import java.io.File;
4
5 public class FileTest {
6
7 public static void main(String[] args){
8 File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll");
9
10 File[] f=file.listFiles();
11
12 for(File fi : f){
13 if(fi.isDirectory()){//判断如果是一个目录
14 String[] s=fi.list();
15 for(String str : s){
16 if(str.endsWith(".jpg")){
17 System.out.println(str);
18 }
19 }
20 }
21 }
22 }
23 }

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

    public String[] list(FilenameFilter filter)
    public File[] listFiles(FileFilter filter)
 1 package com.ningmeng;
2
3 import java.io.File;
4 import java.io.FilenameFilter;
5
6 public class FileTest {
7
8 public static void main(String[] args){
9 File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll");
10
11 String[] str=file.list(new FilenameFilter() {//过滤器,匿名内部类
12
13 @Override
14 public boolean accept(File dir, String name) {
15 // TODO Auto-generated method stub
16 //System.out.println(dir);//获取文件的路径
17 //System.out.println(name);//获取文件的名字
18 File f=new File(dir,name);
19 return f.isFile() && f.getName().endsWith(".jpg");
20 }
21 });
22 for(String s : str){
23 System.out.println(s);
24 }
25
26 }
27 }

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

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

FileInputStream的单个字节读取:

FileOutputStream的单个字节写入:

 1 package com.ningmeng;
2
3 import java.io.FileInputStream;
4 import java.io.FileOutputStream;
5
6 public class FileTest {
7
8 public static void main(String[] args) throws Exception{
9 FileInputStream fis=new FileInputStream("aaa.txt");
10 FileOutputStream fos=new FileOutputStream("bbb.txt",true);
11 //FileOutputStream()后面加true指文件后面可追加
12
13 int a=fis.read();//read()一次读取一个字节
14 System.out.println(a);//读取的一个字节输出
15
16 fos.write(101);//write()一次写一个字节
17 fis.close();//一定记得关闭流,养成好习惯
18 fos.close();
19 }
20 }

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

 1 package com.ningmeng;
2
3 import java.io.FileInputStream;
4 import java.io.FileOutputStream;
5
6 public class FileTest {
7
8 public static void main(String[] args) throws Exception{
9 FileInputStream fis=new FileInputStream("aaa.txt");
10 FileOutputStream fos=new FileOutputStream("bbb.txt");
11 //如果没有bbb.txt,会创建出一个
12
13 int b;
14 while((b=fis.read())!=-1){
15 fos.write(b);
16 }
17 fis.close();
18 fos.close();
19 }
20 }

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

 1 package com.ningmeng;
2
3 import java.io.FileInputStream;
4 import java.io.FileOutputStream;
5
6 public class FileTest {
7
8 public static void main(String[] args) throws Exception{
9 FileInputStream fis = new FileInputStream("aaa.txt");
10 FileOutputStream fos = new FileOutputStream("bbb.txt");
11 int len;
12 byte[] arr = new byte[1024 * 8];//自定义字节数组
13
14 while((len = fis.read(arr)) != -1) {
15 //fos.write(arr);
16 fos.write(arr, 0, len);//写出字节数组写出有效个字节个数
17 }
18 //IO流(定义小数组)
19 //write(byte[] b)
20 //write(byte[] b, int off, int len)写出有效的字节个数
21
22 fis.close();
23 fos.close();
24 }
25 }

IO流(BufferedInputStream和BufferOutputStream拷贝)

* A:缓冲思想
  * 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,
  * 这是加入了数组这样的缓冲区效果,java本身在设计的时候,
  * 也考虑到了这样的设计思想,所以提供了字节缓冲区流
* B.BufferedInputStream
  * BufferedInputStream内置了一个缓冲区(数组)
  * 从BufferedInputStream中读取一个字节时
  * BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
  * 程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
  * 直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个
* C.BufferedOutputStream
  * BufferedOutputStream也内置了一个缓冲区(数组)
  * 程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
  * 直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
 1 package com.ningmeng;
2
3 import java.io.BufferedInputStream;
4 import java.io.BufferedOutputStream;
5 import java.io.FileInputStream;
6 import java.io.FileOutputStream;
7
8 public class FileTest {
9
10 public static void main(String[] args) throws Exception{
11 FileInputStream fis = new FileInputStream("aaa.txt");
12 FileOutputStream fos = new FileOutputStream("bbb.txt");
13
14 BufferedInputStream bis=new BufferedInputStream(fis);
15 //使用装饰模式,把fis装饰进去bis中。使用缓冲读取速度变快
16 BufferedOutputStream bos=new BufferedOutputStream(fos);
17
18 int b;
19 while((b=bis.read())!=-1){
20 bos.write(b);
21 }
22 bis.close();
23 bos.close();
24 }
25 }

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

  * 定义小数组如果是8192个字节大小和Buffered比较的话
  * 定义小数组会略胜一筹,因为读和写操作的是同一个数组
  * 而Buffered操作的是两个数组
IO流(flush和close方法的区别)
flush()方法: 用来刷新缓冲区的,刷新后可以再次写出(字节缓冲流内置缓冲区,如果没有读取出来,可以使用flush()刷新来)
close()方法:用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
8:字符流FileReader和FileWriter
字符流是什么
  * 字符流是可以直接读写字符的IO流
  * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.    
IO流(什么情况下使用字符流)
* 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
* 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
* 读取的时候是按照字符的大小读取的,不会出现半个中文
* 写出的时候可以直接将字符串写出,不用转换为字节数组
 
IO流(字符流是否可以拷贝非纯文本的文件)
* 不可以拷贝非纯文本的文件
* 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去
* 如果是?,直接写出,这样写出之后的文件就乱了,看不了了
 1 package com.ningmeng;
2
3 import java.io.FileReader;
4 import java.io.FileWriter;
5
6 public class FileTest {
7
8 public static void main(String[] args) throws Exception{
9 //FileReader类的read()方法可以按照字符大小读取
10 FileReader fr=new FileReader("aaa.txt");
11 int b;
12 while((b=fr.read())!=-1){
13 System.out.println((char)b);//int类型转为字符型
14 }
15 fr.close();
16
17 //FileWriter类的write()方法可以自动把字符转为字节写出
18 FileWriter fw = new FileWriter("aaa.txt",true);
19 fw.write("aaa");
20 fw.close();
21
22 //字符流的拷贝
23 FileReader fr2 = new FileReader("aaa.txt");
24 FileWriter fw2 = new FileWriter("bbb.txt");
25
26 int ch;
27 while((ch = fr2.read()) != -1) {
28 fw2.write(ch);
29 }
30
31 fr2.close();
32 fw2.close();
33 }
34 }
 1 package com.ningmeng;
2
3 import java.io.BufferedReader;
4 import java.io.BufferedWriter;
5 import java.io.FileReader;
6 import java.io.FileWriter;
7
8 public class FileTest {
9
10 public static void main(String[] args) throws Exception{
11 BufferedReader br=new BufferedReader(new FileReader("aaa.txt"));
12 BufferedWriter bw=new BufferedWriter(new FileWriter("bbb.txt"));
13 //BufferedReader和BufferedWriter的使用:
14 int b;
15 while((b=br.read())!=-1){
16 bw.write((char)b);
17 }
18 br.close();
19 bw.close();
20 }
21 }

java中的IO流(输入流与输出流)概述与总结的更多相关文章

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

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

  2. Java中的IO流之输出流|乐字节

    大家好,乐字节小乐又来了.上一篇给大家带来的是:Java中的IO流之输入流|乐字节,本文将继续讲述IO流之输出流.   一.输出流 1.抽象类:OutputStream 和 Writer Output ...

  3. java中的IO流

    Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...

  4. Java中的IO流大体介绍

    由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...

  5. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

  6. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  7. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

  8. JAVA 中的IO流

    Java中的IO流是用来处理设备与设备之前的数据传输,在java中以流的形式传输.流分为两类:字节流和字符流. 字节流:InputStream,OutPutSteam.(计算机内的数据都是以字节存储的 ...

  9. Java中的IO流(二)

    上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...

随机推荐

  1. 调用数据库--stone

    from Mysql_operate_class import mysql def saveMysqlData(sql, dbname="algorithm"): pym = my ...

  2. 解决Axure发布分享预览的3个方法

    公司的同事制作的一个产品原型,要发给我,我当时正在客户这里,电脑上并没有Axure,客户又催得急,感到一阵无奈.这次回来之后,经过一番摸索,发现还是有办法的.这里给大家分享一下Axure发布分享预览的 ...

  3. fms +fme 视频直播

    1.安装fms 按默认安装即可 2.安装fme 安装完成后启动fme FMS URL是发布到fms的地址默认就可以, 然后点击 Connect 连接成功后左下角会出现connected的提示, 然后点 ...

  4. DataStage 九、数据交换到MySQL以及乱码问题

    DataStage序列文章 DataStage 一.安装 DataStage 二.InfoSphere Information Server进程的启动和停止 DataStage 三.配置ODBC Da ...

  5. Guava学习笔记:Preconditions优雅的检验参数(java)

    http://www.cnblogs.com/peida/p/guava_preconditions.html 在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常 ...

  6. POJ 3686 The Windy's (最小费用流或最佳完全匹配)

    题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单.每个车间完成不同订单的时间是不同的.不会出现两个车间完成同一个订单的情况.给出每个订单在某个车间完成所用的时间.问订单完成的平均时间是多少 ...

  7. 转:解决windows下eclipse中android项目关联android library project失败问题

    近日,在做一个人人的第三方小项目.打算直接使用renren 的sdk 进行开发.因为renren的sdk是以android library project 形式发布的(关于这种project的内容可以 ...

  8. OpenGL中位图的操作(glReadPixels,glDrawPixels等)

    OpenGL中位图的操作 OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例). 1. BMP文件格式简单介绍 BMP文件是一种像素文件,它 ...

  9. Toad 实现 SQL 优化

    It is very easy for us to implement sql tuning by toad.  We need to do is just give complex sql stat ...

  10. LeetCode141:Linked List Cycle

    题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without usin ...