Java I/O(输入输出)操作

Java I/O:
–一个File类的对象,表示了磁盘上的文件或目录。
–File类提供了与平台无关的方法来对磁盘上的文件或者目录进行操作。
–File类直接处理文件或者文件系统。
–fILE类没有指定信息怎样从文件读取或文件存储。
–File类描述了文件本身的属性
–File对象用来获取或者处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。
–File类还可以浏览子目录层次结构。

—————
java.io包中的File类提供了与平台无关的方法来描述目录和文件对象的属性功能。其中包含大量的方法可用来获取路径,目录和文件的相关信息,并对他们进行创建,删除,改名等管理工作。因为不同的系统平台,对文件路径的描述不尽相同。为做到平台无关,在Java语言中,使用了抽象路径的概念。Java自动进行不同平台的文件路径描述与抽象文件路径 之间的转换。

—-File类的直接父类是Object类。
——————————————————————
下面的构造方法可以用来生成File对象:

File(String   directoryPath)
File(String  directoryPath,String filename)
File(File  dirObj,String  filename)
这里,directoryPath是文件的路径名,filename是文件名,dirObj是一个指定目录的File对象。

————-
示例1package com.io;
import java.io.File;
import java.io.IOException;
public class FileTest1
{
     public static void main(String[] args) throws Exception
     {
           //  路径都使用斜杠/   所有系统都可以使用,使用反斜杠的话要使用两个
           File  file=new  File("D:/test.txt");
           //System.out.println(file.createNewFile());//打印出true,说明文件创建成功,
           //最好的方式是使用如下的方式,separator是一个常量
           File  file1=new File("D:"+File.separator+"abc.txt");
           System.out.println(file1.createNewFile());
           //需要注意的是,File只能创建文件,并不能往其增加内容。

     }

}

——————————————————

package com.io;
import java.io.File;
import java.io.IOException;
public class FileTest1
{
     public static void main(String[] args) throws Exception
     {
           /*
            * 在指定文件夹里创建文件
            */
           File  file =new File("D:/abc");
           File  file2=new  File(file,"hello.txt");
           file2.createNewFile();
     }
}

————————————
Java怎样判断到底是文件还是目录呢?
File类提供了 isFile()和isDirectory()两个方法,任选其一都可判断。

——————————————————————
创建文件夹:mkdir() mkdirs()

import java.io.File;
import java.io.IOException;
public class FileTest1
{
     public static void main(String[] args) throws Exception
     {
           /*
            * 在指定文件夹里创建文件
            */
           //File  file =new File("D:/abc/zou");
           //file.mkdir();//创建目录zou,前提示abc已经存在
           //如果想一次创建呢?使用mkdirs()
           File  file1=new File("D:/zzz/zz/z");
           System.out.println(file1.mkdirs());
           //判断是否是目录:
           System.out.println(file1.isDirectory());

     }
}

目录管理:
–目录操作的主要方法为:
-public boolean mkdir() 根据抽象路径名创建目录
-public String[] list() 返回抽象路径名表示路径中的文件名和目录名。

文件管理:
-在进行文件操作时,常需要知道一个关于文件的信息。Java的File类提供了方法来操纵文件和获得一个文件的信息。另外,File类还可以对目录和文件进行删除,属相修改等管理工作。

——————————————————
遍历目录:

import java.io.File;
import java.io.IOException;
public class FileTest1
{
     public static void main(String[] args) throws Exception
     {
           /*
            * 遍历指定目录里的文件或者目录。仅仅获得当前目录的子目录或者文件。也就是不会获取到再下层
            */

           File  file=new  File("D:/Users/Administrator");
           String[]  names=file.list();//得到指定目录下的文件和目录名
           //遍历打印出names,也就是文件和目录名。
           for(String  name : names)
           {
                System.out.println(name);
           }
     }
}

打印结果:
.android
.appletviewer
.eclipse
.fbt
.genymotion-eclipse.log
.gitconfig
.oracle_jre_usage
.org.eclipse.epp.usagedata.recording.userId
.ssh
.VirtualBox
————————————

File类定义了很多获取File对象标准属性的方法。例如getName()返回文件名,getParent()返回父目录名,exists()在文件存在的情况下返回true,反之返回false。 然而File类是不对称的,意思是虽然存在允许验证一个简单文件属性的很多方法,但是没有相应的方法来改变这些属性。

————————
File类中的常用方法:
String getName()
String getPath()
String getAbsolutePath()
String getParent()
boolean renameTo(File newFile)
long length()
boolean delete()
boolean mkdir()
String[] list()


–目录是一个包含其他文件和路径列表的File类。
–当你创建一个File对象且它是目录时,isDirectory()方法返回true.这种情况下,可以调用该对象的list()方法来提取该目录内部其他文件和目录的列表。

——————————
使用FilenameFilter。
–希望能够限制由list()方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件。为达到这样的目的,必须使用list()的第二种形式(方法重载)

–String[] list(FilenameFilter FFObj)
–该形式中,FFObj是一个实现FilenameFilter接口的类的对象。


————————————————————

import java.io.File;
import java.io.IOException;
public class FileTest1
{
     public static void main(String[] args) throws Exception
     {
           /*
            * 返回特定文件后缀的文件
            */
           File  file=new  File("D:/abc");
           //创建字符串数组,File数组也可以.获取文件名
           String[]  names=file.list();
           //遍历获取的文件名
           for(String  name:names)
           {
                //用endWith()方法判断后缀
                if(name.endsWith(".java"))
                {
                     System.out.println(name);
                }
           }

     }
}

——————————————
–FilenameFilter仅定义了一个方法accept()。该方法被列表中的每个文件调用一次,它的通常的形式如下:
boolean accept(File directory,String filename)

—当被directory指定的目录的文件(也就是说,那些与filename参数匹配的文件)包含在列表中时,accept()方法返回true,当这些文件没有包含在列表中时,accept()方法返回 false.

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
public class FileTest1
{
     public static void main(String[] args) throws Exception
     {
           /*使用匿名内部类
            * 返回特定文件后缀的文件
            */
           File  file=new  File("D:/abc");
           String names[] = file.list(new  FilenameFilter()
           {

                @Override
                public boolean accept(File dir, String name)
                {
                     if(name.endsWith(".java"))
                     {
                           return true;
                     }
                     return false;
                }
           });

           for(String   name:names)
           {
                System.out.println(name);
           }

     }
}

——————————————————————
listFiles()方法
—File[] listFiles()
—File[] listFiles(FilenameFilter n FFObj)
—File[] listFiles(FileFilter FObj)

上述三种形式以File对象数组的形式返回文件列表,而不是用字符串形式返回。第一种形式返回所有的文件,第二种相识返回指定FilenameFilter接口的文件。处理返回一个File对象数组,这连个listFiles()方法就像list()方法一样工作。

——————————————————

流类:
—Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与他们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或者相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部的。

————————————————
在java.io包中提供了60多个类(流)
–从功能上分为两大类:输入流和输出流。
–从流结构上可分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或者称面向字符)

—字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个子类实现(也就是我们不会new出来InputStream 和OutputStream实例)。字符流是java1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer(也是抽象的,不能直接new出来实例)。

————————————
Java2定义了两种类型的流:字节流和字符流。字节流(byte stream)为处理字节的输入提供了方便的方法。例如使用字节流读取二进制数据。
字符流(character stream)为字符的输入和输出提供了仿版。他们采用了统一的编码标准,因而可以国际化。当然,在某些场合,字符流比字节流更加有效。

————————
字节流类(Byte Stream):字节流类用于向字节流读写8位二进制的字节。一般的,字节流类主要用于读写诸如图像或声音等的二进制数据。

字符流类(Character Streams) 字符流类用于向字符流读写16位的二进制字符。
这里写图片描述

读数据的逻辑为:
open a stream
while more information
read information
close the stream
——————
写数据的逻辑为:
open a stream
while more information
write information
close the stream
————————————————
流的另一种重要分类方式:
节点流:从特定的地方读取的流类,例如:磁盘或一块内存区域。
过滤流:使用节点流作为输入输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

注意:!!与目标交互的流一定是节点流。过滤流是不能直接与目标进行连接的。
——————————————
字节流类为处理字节式输入/输出提供了丰富的环境。一个字节流可以和其他任何类型的对象并用,包括二进制数据。这样的多功能性使得字节流对很多类型的程序都很重要

–字节流类以InputStream和OutputStream为顶层类,他们都是抽象类(abstract)
————————————————
抽象类InputStream和OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),他们分别对数据的字节进行读写。两种方法都在InputStream和OutputStream中被定义为抽象方法。他们被派生的类重写。

–每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。

–要使用流类,必须导入java.io包。

————————————————————
三个基本的读方法:
abstract int read() :读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。

int read(byte[] b) 将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。

int read(byte[] b, int off,int len) 将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off执行在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。

思考:为什么只有第一个read方法是抽象的,而其余两个read方法都是具体的呢?

因为第二个read方法依靠第三个方法来实现,而第三个方法又依靠第一个read方法来实现,所有说只有第一个read方法是与具体的I/O设备相关的,他需要InputStream的子类来实现。

————————————
//输入流典型用法:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamTest1
{
     //从硬盘读取文件
     public static void main(String[] args) throws IOException
     {
           /*读数据的逻辑
           open  a  stream
           while  more  information
           read  information
           close  the  stream
           */
           //is流对应test.txt文件
           InputStream   is=new  FileInputStream("D:/test.txt");
           //因为要将内容读到字节数组里,所以应该先创建一个字节数组
           byte[]  buffer=new byte[200];//最多装200个字节
           int  length=0;//实际读取的字节数
           //应用while循环,因此一次最多读取200,剩余的必须在第二次,第三次....读取
           //读到buffer里面,从0开始读,每次读200,真正总共读的赋给length。length!=-1表示还未读到末尾。非常固定的一种写法。
           while((length=is.read(buffer, 0, 200)) !=-1)
           {
                //读到的是字节,要将其转换成字符才能在命令行显示出来
                //从buffer里读,从0开始读,读取length长
                String  str=new  String(buffer,0,length);
                System.out.println(str);
           }
           is.close();//关闭流,也就是关闭资源


     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值