java高级API-输入和输出处理

本文详细介绍了Java的IO流体系,包括字节流、字符流、序列化和反序列化,以及File类的使用。字节流分为输入流InputStream和输出流OutputStream,字符流包括Reader和Writer。File类提供了文件和目录的操作,如创建、删除、读取属性等。文章还展示了如何进行文件的读写操作,并讨论了序列化和反序列化在对象持久化中的作用。
摘要由CSDN通过智能技术生成

IO流总览

在这里插入图片描述
在这里插入图片描述

IO流的分类

字节流

(1).字节流基类
1).InputStream

InputStream:字节输入流基类,抽象类是表示字节输入流的所有类的超类。

常用方法:

// 从输入流中读取数据的下一个字节
abstract int read()
// 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中
int read(byte[] b)
// 将输入流中最多 len 个数据字节读入 byte 数组
int read(byte[] b, int off, int len)


// 跳过和丢弃此输入流中数据的 n个字节
long skip(long n)

// 关闭此输入流并释放与该流关联的所有系统资源
void close()

2).OutputStream

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

常用方法:

// 将 b.length 个字节从指定的 byte 数组写入此输出流
void write(byte[] b)
// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
void write(byte[] b, int off, int len)
// 将指定的字节写入此输出流
abstract void write(int b)
// 关闭此输出流并释放与此流有关的所有系统资源
void close()
// 刷新此输出流并强制写出所有缓冲的输出字节
void flush()

(2).字节文件操作流
1).FileInputStream

FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。

构造方法:
// 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定
FileInputStream(File file)
// 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径name指定
FileInputStream(String name)

常用方法:覆盖和重写了父类的的常用方法。

    // 读取f盘下该文件f://hell/test.txt
    //构造方法1
    InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));
    int i = 0;
    //一次读取一个字节
    while ((i = inputStream.read()) != -1) {

        // System.out.print(i + " ");// 65 66 67 68
        //为什么会输出65 66 67 68?因为字符在底层存储的时候就是存储的数值。即字符对应的ASCII码。
        System.out.print((char) i + " ");// A B C D
    }
    //关闭IO流
    inputStream.close();

    // 读取f盘下该文件f://hell/test.txt
    //构造方法2
    InputStream inputStream2 = new FileInputStream("f://hello/test.txt");
    // 字节数组
    byte[] b = new byte[2];
    int i2 = 0;
    //  一次读取一个字节数组
    while ((i2 = inputStream2.read(b)) != -1) {

        System.out.print(new String(b, 0, i2) + " ");// AB CD
    }
    //关闭IO流
    inputStream2.close();

注: 一次读取一个字节数组,提高了操作效率,IO流使用完毕一定要关闭。

2).FileOutputStream

FileOutputStream:字节文件输出流是用于将数据写入到File,从程序中写入到其他位置。

构造方法:
// 创建一个向指定File对象表示的文件中写入数据的文件输出流
FileOutputStream(File file)
// 创建一个向指定File对象表示的文件中写入数据的文件输出流
FileOutputStream(File file, boolean append)
// 创建一个向具有指定名称的文件中写入数据的输出文件流
FileOutputStream(String name)
// 创建一个向具有指定name的文件中写入数据的输出文件流
FileOutputStream(String name, boolean append)

常用方法:覆盖和重写了父类的的常用方法。

    OutputStream outputStream = new FileOutputStream(new File("test.txt"));
    // 写出数据
    outputStream.write("ABCD".getBytes());
    // 关闭IO流
    outputStream.close();

    // 内容追加写入
    OutputStream outputStream2 = new FileOutputStream("test.txt", true);
    // 输出换行符
    outputStream2.write("\r\n".getBytes());
    // 输出追加内容
    outputStream2.write("hello".getBytes());
    // 关闭IO流
    outputStream2.close();

字符流

(1).字符流基类
1).Reader

Reader:读取字符流的抽象类.

常用方法:

// 读取单个字符
int read()
// 将字符读入数组
int read(char[] cbuf)
// 将字符读入数组的某一部分
abstract int read(char[] cbuf, int off, int len)
// 跳过字符
long skip(long n)

// 关闭该流并释放与之关联的所有资源
abstract void close()

2).Writer

Writer:写入字符流的抽象类.

常用方法:

// 写入字符数组
 void write(char[] cbuf)
// 写入字符数组的某一部分
abstract void write(char[] cbuf, int off, int len)
// 写入单个字符
void write(int c)
// 写入字符串
void write(String str)
// 写入字符串的某一部分
void write(String str, int off, int len)

// 将指定字符添加到此 writer
Writer append(char c)
// 将指定字符序列添加到此 writer
Writer append(CharSequence csq)
// 将指定字符序列的子序列添加到此 writer.Appendable
Writer append(CharSequence csq, int start, int end)

// 关闭此流,但要先刷新它
abstract void close()
// 刷新该流的缓冲
abstract void flush()

(2).字符转换流
1).InputStreamReader

InputStreamReader:字节流转字符流,它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

构造方法:

// 创建一个使用默认字符集的 InputStreamReader
InputStreamReader(InputStream in)
// 创建使用给定字符集的 InputStreamReader
InputStreamReader(InputStream in, Charset cs)
// 创建使用给定字符集解码器的 InputStreamReader
InputStreamReader(InputStream in, CharsetDecoder dec)
// 创建使用指定字符集的 InputStreamReader
InputStreamReader(InputStream in, String charsetName)

特有方法:

//返回此流使用的字符编码的名称 
String getEncoding() 

    //使用默认编码        
    InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"));
    int len;
    while ((len = reader.read()) != -1) {
        System.out.print((char) len);//爱生活,爱Android

    }
    reader.close();

     //指定编码 
    InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"),"utf-8");
    int len;
    while ((len = reader.read()) != -1) {
        System.out.print((char) len);//????????Android
    }
    reader.close();

注:Eclipse默认使用GBK编码,test.txt文件所以是GBK编码,当指定utf-8编码时所以会乱码。

2).OutputStreamWriter

OutputStreamWriter:字节流转字符流。

构造方法:

// 创建使用默认字符编码的 OutputStreamWriter
OutputStreamWriter(OutputStream out)
// 创建使用给定字符集的 OutputStreamWriter
OutputStreamWriter(OutputStream out, Charset cs)
// 创建使用给定字符集编码器的 OutputStreamWriter
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
// 创建使用指定字符集的 OutputStreamWriter
OutputStreamWriter(OutputStream out, String charsetName)

特有方法:

//返回此流使用的字符编码的名称 
String getEncoding() 

(3).字符缓冲流(高效流)
1).BufferedReader

BufferedReader:字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

构造方法:

// 创建一个使用默认大小输入缓冲区的缓冲字符输入流
BufferedReader(Reader in)
// 创建一个使用指定大小输入缓冲区的缓冲字符输入流
BufferedReader(Reader in, int sz)

特有方法:

// 读取一个文本行
String readLine()

    //生成字符缓冲流对象
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
    String str;
    //一次性读取一行
    while ((str = reader.readLine()) != null) {
        System.out.println(str);// 爱生活,爱Android
    }

    //关闭流
    reader.close();

2).BufferedWriter

BufferedWriter:字符缓冲流,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

构造方法:

// 创建一个使用默认大小输出缓冲区的缓冲字符输出流
BufferedWriter(Writer out)
// 创建一个使用给定大小输出缓冲区的新缓冲字符输出流
BufferedWriter(Writer out, int sz)

特有方法:

// 写入一个行分隔符
void newLine() 

(4).FileReader、FileWriter

FileReader:InputStreamReader类的直接子类,用来读取字符文件的便捷类,使用默认字符编码。
FileWriter:OutputStreamWriter类的直接子类,用来写入字符文件的便捷类,使用默认字符编码。

序列化

将保存在内存中的对象数据转化为二进制数据流进行传输,任何对象都可以序列化

实现方法:实现java.io.Serializable接口

作用:把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。对于这种通用的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java的序列化的概念。在Java的OutputStream类下面的子类ObjectOutput-Stream类就有对应的WriteObject(Object object) 其中要求对应的object实现了java的序列化的接口。

在使用tomcat开发JavaEE相关项目的时候,我们关闭tomcat后,相应的session中的对象就存储在了硬盘上,如果我们想要在tomcat重启的时候能够从tomcat上面读取对应session中的内容,那么保存在session中的内容就必须实现相关的序列化操作,还有jdbc加载驱动用的就是反序列化,将字符串变为对象。

//序列化类:java.ioObjectOutputStream
 
//讲对象变为指定的二进制数据
 
class Book implements Serializable{
 
	private String title;
 
	private double price;
 
	public Book(String tit,double pri){
 
		this.title=tit;
 
		this.price=pri;
 
	}
 
	public String toString() {
 
		return "书名:"+this.title+",价格:"+this.price;
 
	}
 
}
 
public class Demo10 {
 
	public static void main(String[] args) throws Exception {
 
//序列化到指定的文本
 
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("e:"+File.separator+"demoA.txt")));
 
		oos.writeObject(new Book("java开发", 45.2));
 
		oos.close();
 
	}
 
}/

反序列化

将二进制数据换回原对象

构造:

ObjectInputStream(InputStream in)

方法:

 Object readObject() 从 ObjectInputStream 读取对象 

 
class Book implements Serializable{
 
	private String title;
 
	private double price;
 
	public Book(String tit,double pri){
 
		this.title=tit;
 
		this.price=pri;
 
	}
 
	public String toString() {
 
		return "书名:"+this.title+",价格:"+this.price;
 
	}
 
}
 
public class Demo11 {
 
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
 
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("e:"+File.separator+"demoA.txt")));
 
		Object obj=ois.readObject();
 
		Book book=(Book) obj;
 
		System.out.println(book);
 
		ois.close();
 
	}
 
}

File类

File 是“文件”和“目录路径名”的抽象表示形式。
File 直接继承于Object,实现了Serializable接口和Comparable接口。实现Serializable接口,意味着File对象支持序列化操作。而实现Comparable接口,意味着File对象之间可以比较大小;File能直接被存储在有序集合(如TreeSet、TreeMap中)。

File类的构造方法

File​(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。 
File​(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 
File​(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。 
File​(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。  

File常用方法列表

boolean canExecute​() 测试应用程序是否可以执行此抽象路径名表示的文件。 
boolean canRead​() 测试应用程序是否可以读取由此抽象路径名表示的文件。 
boolean canWrite​() 测试应用程序是否可以修改由此抽象路径名表示的文件。 
int compareTo​(File pathname) 比较两个抽象的路径名字典。 
boolean createNewFile​() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 
static File createTempFile​(String prefix, String suffix) 在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。 
static File createTempFile​(String prefix, String suffix, File directory) 在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 
boolean delete​() 删除由此抽象路径名表示的文件或目录。 
void deleteOnExit​() 请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。 
boolean equals​(Object obj) 测试此抽象路径名与给定对象的相等性。 
boolean exists​() 测试此抽象路径名表示的文件或目录是否存在。 
File getAbsoluteFile​() 返回此抽象路径名的绝对形式。 
String getAbsolutePath​() 返回此抽象路径名的绝对路径名字符串。 
File getCanonicalFile​() 返回此抽象路径名的规范形式。 
String getCanonicalPath​() 返回此抽象路径名的规范路径名字符串。 
long getFreeSpace​() 通过此抽象路径名返回分区 named中未分配字节的数量。 
String getName​() 返回由此抽象路径名表示的文件或目录的名称。 
String getParent​() 返回此抽象路径名的父目录的路径名字符串,如果此路径名未命名为父目录,则返回 null 。 
File getParentFile​() 返回此抽象路径名的父目录的抽象路径名,如果此路径名不指定父目录,则返回 null 。 
String getPath​() 将此抽象路径名转换为路径名字符串。 
long getTotalSpace​() 通过此抽象路径名返回分区 named的大小。 
long getUsableSpace​() 通过此抽象路径名返回分区 named上此虚拟机可用的字节数。 
int hashCode​() 计算此抽象路径名的哈希码。 
boolean isAbsolute​() 测试这个抽象路径名是否是绝对的。 
boolean isDirectory​() 测试此抽象路径名表示的文件是否为目录。 
boolean isFile​() 测试此抽象路径名表示的文件是否为普通文件。 
boolean isHidden​() 测试此抽象路径名命名的文件是否为隐藏文件。 
long lastModified​() 返回此抽象路径名表示的文件上次修改的时间。 
long length​() 返回由此抽象路径名表示的文件的长度。 
String[] list​() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 
String[] list​(FilenameFilter filter) 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 
File[] listFiles​() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 
File[] listFiles​(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 
File[] listFiles​(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 
static File[] listRoots​() 列出可用的文件系统根。 
boolean mkdir​() 创建由此抽象路径名命名的目录。 
boolean mkdirs​() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 
boolean renameTo​(File dest) 重命名由此抽象路径名表示的文件。 
boolean setExecutable​(boolean executable) 为此抽象路径名设置所有者的执行权限的便利方法。 
boolean setExecutable​(boolean executable, boolean ownerOnly) 设置该抽象路径名的所有者或每个人的执行权限。 
boolean setLastModified​(long time) 设置由此抽象路径名命名的文件或目录的最后修改时间。 
boolean setReadable​(boolean readable) 一种方便的方法来设置所有者对此抽象路径名的读取权限。 
boolean setReadable​(boolean readable, boolean ownerOnly) 设置此抽象路径名的所有者或每个人的读取权限。 
boolean setReadOnly​() 标记由此抽象路径名命名的文件或目录,以便只允许读取操作。 
boolean setWritable​(boolean writable) 一种方便的方法来设置所有者对此抽象路径名的写入权限。 
boolean setWritable​(boolean writable, boolean ownerOnly) 设置此抽象路径名的所有者或每个人的写入权限。 
Path toPath​() 返回从此抽象路径构造的一个java.nio.file.Path对象。 
String toString​() 返回此抽象路径名的路径名字符串。 
URI toURI​() 构造一个表示此抽象路径名的 file: URI。 
URL toURL​() 已过时。 此方法不会自动转义URL中非法的字符。 建议在新的代码转换的抽象路径到URL通过先转换成URI,经由toURI方法,然后经由转换URI为URL URI.toURL方法。  

File具体示例

import java.io.*;
 
/*
File类常见方法:
1,创建。
    boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
                        和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
 
    boolean mkdir():创建文件夹。
    boolean mkdirs():创建多级文件夹。
2,删除。
    boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
    void deleteOnExit();在程序退出时删除指定文件。
 
 
3,判断。
    boolean exists() :文件是否存在.
    isFile():
    isDirectory();
    isHidden();
    isAbsolute();
 
4,获取信息。
    getName():
    getPath():
    getParent():
 
    getAbsolutePath()
    long lastModified()
    long length()
 
*/
 
 
class FileDemo
{
    public static void main(String[] args) throws IOException
    {
        method_5();
    }
 
    public static void method_5()
    {
        File f1 = new File("c:\\Test.java");
        File f2 = new File("d:\\hahah.java");
 
        sop("rename:"+f2.renameTo(f1));
 
    }
 
    public static void method_4()
    {
        File f = new File("file.txt");
 
        sop("path:"+f.getPath());
        sop("abspath:"+f.getAbsolutePath());
        //该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
        //如果相对路径中有上一层目录那么该目录就是返回结果。
        sop("parent:"+f.getParent());                      
 
 
    }
     
    public static void method_3()throws IOException
    {
        File f = new File("d:\\java1223\\day20\\file2.txt");
        //f.createNewFile();
 
        //f.mkdir();
 
        //记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
        //通过exists判断。
        sop("dir:"+f.isDirectory());
        sop("file:"+f.isFile());
 
        sop(f.isAbsolute());
    }
 
 
    public static void method_2()
    {
        File f = new File("file.txt");
 
        //sop("exists:"+f.exists());
 
        //sop("execute:"+f.canExecute());
 
        //创建文件夹
        File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
 
        sop("mkdir:"+dir.mkdirs());
    }
     
 
    public static void method_1()throws IOException
    {
        File f = new File("file.txt");
        sop("create:"+f.createNewFile());
        //sop("delete:"+f.delete());
         
    }
 
 
    //创建File对象
    public static void consMethod()
    {
        //将a.txt封装成file对象。可以将已有的和为出现的文件或者文件夹封装成对象。
        File f1 = new File("a.txt");
 
        File f2 = new File("c:\\abc","b.txt");
 
        File d = new File("c:\\abc");
        File f3 = new File(d,"c.txt");
 
        sop("f1:"+f1);
        sop("f2:"+f2);
        sop("f3:"+f3);
 
        File f4 = new File("c:"+File.separator+"abc"+File.separator+"zzz"+File.separator+"a.txt");
 
 
    }
 
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}
/*
递归列出指定目录下的文件或者文件夹
*/

/*
列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。
 
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
 
递归要注意:
1,限定条件。
 
2,要注意递归的次数。尽量避免内存溢出。
 
 
*/
 
import java.io.*;
 
class FileDemo3
{
    public static void main(String[] args)
    {
        File dir = new File("E:\\Book");
        showDir(dir,0);
         
    }
    public static String getLevel(int level)
    {
        StringBuilder sb = new StringBuilder();
        sb.append("|--");
        for(int x=0; x<level; x++)
        {
            //sb.append("|--");
            sb.insert(0,"|  ");
 
        }
        return sb.toString();
    }
    public static void showDir(File dir,int level)
    {
         
        System.out.println(getLevel(level)+dir.getName());
 
        level++;
        File[] files = dir.listFiles();
        for(int x=0; x<files.length; x++)
        {
            if(files[x].isDirectory())
                showDir(files[x],level);
            else
                System.out.println(getLevel(level)+files[x]);
        }
    }
 
 
 
     
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值