Java输入输出处理

简介: Java输入输出处理

一、File类

1.File类的构造方法

方法名 说明
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的File实例
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的File实例

案例分析:

package com.file;
import java.io.File;
public class Test1 {
    public static void main(String[] args) {
        File f1=new File("F://Test//java.txt");
        System.out.println(f1);  //F:\Test\java.txt

        File f2=new File("F://Test","java.txt");
        System.out.println(f2);  //F:\Test\java.txt

        File f3=new File("F://Test");
        File f4=new File(f3,"java.txt");
        System.out.println(f4);  //F:\Test\java.txt
    }
}

2.File类的创建

方法名 说明
public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
public boolean mkdir() 创建由此抽象路径名命名的目录
public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录

案例分析:

package com.file;
import java.io.File;
import java.io.IOException;
public class Test2 {
    public static void main(String[] args) throws IOException {
        //在F盘的Test目录下创建一个test.txt文件
        File f1=new File("F://Test//test.txt");
        System.out.println(f1.createNewFile());  //true
        //在F盘的Test目录下创建一个Spring目录
        File f2=new File("F://Test//Spring");
        System.out.println(f2.mkdir());  //true
        //在F盘的Test目录下创建多个目录
        File f3=new File("F://Test//MyBatis//SpringMVC");
        System.out.println(f3.mkdirs());   //true
    }
}

3.File类判断和获取

方法名 说明
public boolean isDirectory() 测试此抽象路径名表示的File是否为目录
public boolean isFile() 测试此抽象路径名表示的File是否为文件
public boolean exists() 测试此抽象路径名表示的File是否存在
public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串
public String getPath() 将此抽象路径名转换为路径名字符串
public String getName() 返回由此抽象路径名表示的文件或目录的名称
public String[] list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
public File[]listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组

案例分析:

package com.file;

import java.io.File;

public class Test3 {
    public static void main(String[] args) {
        File f=new File("F:\\Test\\java.txt");
        System.out.println(f.isDirectory());  //false
        System.out.println(f.isFile());  //true
        System.out.println(f.exists());   //true

        System.out.println(f.getAbsoluteFile());   //F:\Test\java.txt
        System.out.println(f.getPath());    //F:\Test\java.txt
        System.out.println(f.getName());   //java.txt

        File f1=new File("F:\\Test");
        String[] list = f1.list();
        for (String s : list) {
            System.out.println(s); 
 /*
a
b
java.txt
MyBatis
Spring
test.txt
TestOne
小飞侠
小马哥*/
        }

        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file);
/*
F:\Test\a
F:\Test\b
F:\Test\java.txt
F:\Test\MyBatis
F:\Test\Spring
F:\Test\test.txt
F:\Test\TestOne
F:\Test\小飞侠
F:\Test\小马哥            
 */
        }
    }
}

4.File类的删除

方法名 说明
public boolean delete() 删除由此抽象路径名表示的文件或目录
  • 绝对路径和相对路径的区别

    • 绝对路径: 完整的路径名,不需要任何其他信息就可以定位它所表示的文件。

      • 例如: E:\\study\\text.txt
    • 相对路径: 使用取自其他路径名的信息进行解释。

      • 例: study\\text.txt

案例分析:

package com.file;

import java.io.File;
import java.io.IOException;

public class Test4 {
    public static void main(String[] args) throws IOException {
        //在当前模块下创建one.txt文件
        File f1=new File("E:\\JavaSE\\Test\\File\\one.txt");  //true
        System.out.println(f1.createNewFile());
        //删除当前模块下创建one.txt文件
        System.out.println(f1.delete());   ////true
        //在当前模块下创建one目录
        File f2=new File("E:\\JavaSE\\Test\\File\\one");
        System.out.println(f2.mkdir());   ////true
        //删除当前模块下创建one目录
        System.out.println(f2.delete());   ////true
    }
}

二、IO流

1.io流的概述和分类

  • IO:输入/输出(Input/Output)

    • 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
  • IO流就是用来处理设备间数据传输问题的

    • 常见的应用:文件复制;文件上传;文件下载
  • IO流分类:

    • 按照数据的流向

      • 输入流:读数据
      • 输出流:写数据
  • 按照数据类型来分

    • 字节流

      • 字节输入流;字节输出流
    • 字符流

      • 字符输入流;字符输出流
  • 一般来说,IO流的分类是按照数据类型来分的

2.字节流

1.字节流写数据

  • 字节流抽象基类

    • lnputStream: 这个抽象类是表示字节输入流的所有类的超类
    • OutputStream: 这个抽象类是表示字节输出流的所有类的超类
    • 子类名特点: 子类名称都是以其父类名作为子类名的后缀
  • FileOutputStream: 文件输出流用于将数据写入File

    • FileOutputStream(Stringname): 创建文件输出流以指定的名称写入文件

案例分析:

package com.outPutstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test1 {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");
        //将字节写入此文件输出流
        f.write(97);   //a
        //释放资源
        f.close();
    }
}

2.字节流写数据的三种方式

方法名 说明
void write(int b) 将指定的字节写入此文件输出流,一次写一个字节数据
void write(byte[] b) 将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据
void write(byte[] b, int off, int len) 将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据

案例分析:

package com.outPutstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test2 {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");
        //将字节写入此文件输出流
       /* f.write(97);
        f.write(98);
        f.write(99);
        f.write(100); */  //abcd


        //将指定的字节数组写入此文件输出流
        byte[] bytes={97,98,99,100};
        //f.write(bytes); //abcd

        f.write(bytes,1,2);   //bc
        

        //释放资源
        f.close();
    }
}

3.换行和追加

  • 字节流写数据实现换行
  • 写完数据后,加换行符

    • windows:\n
    • linux:\n
    • mac:\r
  • 字节流写数据实现追加写入

    • public FileOutputStream(Stringname,boolean append)
    • 创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头

案例分析:

package com.outPutstream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test3 {
    public static void main(String[] args) throws IOException {
        FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt",true);
        for (int i = 0; i <5 ; i++) {
            f.write("hello".getBytes());
            f.write("\r\n".getBytes());
        }
        f.close();
    }
}
//执行三次的结果
/*
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
 */

4.字节流读数据(一次只能读一个字节)

  • FilelnputStream:从文件系统中的文件获取输入字节

    • FilelnputStream(String name):通过打开与实际文件的连接来创建一个FilelnputStream,该文件由文件系统中的路径名name命名
  • 使用字节输入流读数据的步骤:

    • 创建字节输入流对象
    • 调用字节输入流对象的读数据方法
    • 释放资源

案例分析:

package com.FileInputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test1 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream f = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");
        //读取数据
        /*int by = f.read();
        System.out.println(by);  //97
        System.out.println((char)by);  //a
        */
        //一次只能读取一个字节
        int by = f.read();
        while (by != -1){
            System.out.print((char) by);  //abc
            by=f.read();
        }
        //释放资源
        f.close();
    }
}

5.字节流复制文本文件

案例:

package com.FileInputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test2 {
    public static void main(String[] args) throws IOException {
        FileInputStream f1 = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");
        FileOutputStream f2 = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");
        int by = f1.read();
        while (by !=-1){
            f2.write((char)by);
            by=f1.read();
        }

    }
}

6.字节流读数据(一次读一个字节数组)(复制图片操作一样)

案例:

package com.FileInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test3 {
    public static void main(String[] args) throws IOException {
        FileInputStream f1 = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");
        byte[] bytes=new byte[1024];
        int by;
        by = f1.read(bytes);
        while (by !=-1){
            System.out.println(new String(bytes,0,by));
            by=f1.read(bytes);
        }

    }
}
/*
Java
JavaWeb
Python
Spring
Mybatis

 */

7.字节缓冲流

案例:

package com.BufferStream;

import java.io.*;

public class Test1 {
    public static void main(String[] args) throws IOException {
       BufferedOutputStream b1 = new BufferedOutputStream(new FileOutputStream("E:\\JavaSE\\Test\\File\\buffer.txt"));
        b1.write("Hello".getBytes());
        b1.write("\r\t".getBytes());
        b1.write("World".getBytes());
        b1.close();

        BufferedInputStream b2 = new BufferedInputStream(new FileInputStream("E:\\JavaSE\\Test\\File\\buffer.txt"));
        int by = b2.read();
        while (by !=-1){
            System.out.print((char)by);
            by=b2.read();
        }
        b2.close();
    }
}

3.字符流

1.字符串中编码解码问题

  • 编码:

    • bytegetBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
    • bytel]getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  • 解码

    • String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
    • String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

案例分析:

package com.zifu;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Test1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        /*String s1="小马哥";
        byte[] bytes = s1.getBytes();
        System.out.println(Arrays.toString(bytes));  //[-27, -80, -113, -23, -87, -84, -27, -109, -91]

        //String s=new String(bytes);  //小马哥
        String s=new String(bytes,"UTF-8");  //小马哥
        System.out.println(s);*/

        String s2="小飞侠";
        byte[] bytes =s2.getBytes("GBK");
        System.out.println(Arrays.toString(bytes));  //[-48, -95, -73, -55, -49, -64]

        String s=new String(bytes,"GBK");
        System.out.println(s);  //小飞侠

    }
}

2.字符流中编码解码问题

  • InputStreamReader:是从字节流到字符流的桥梁

    • 它读取字节,并使用指定的编码将其解码为字符
    • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
  • OutputStreamlriter:是从字符流到字节流的桥梁

    • 是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
    • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

案例分析:

package com.zifu;

import java.io.*;

public class Test2 {
    public static void main(String[] args) throws Exception {
        OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("E:\\JavaSE\\Test\\File\\java.txt"),"GBK");
        o.write("小飞侠");
        o.close();
        InputStreamReader i = new InputStreamReader(new FileInputStream("E:\\JavaSE\\Test\\File\\java.txt"),"GBK");
        int by = i.read();
        while (by !=-1){
            System.out.print((char)by);  //小飞侠
            by=i.read();
        }
    }
}

3.字符流写数据的5种方式

方法名 说明
void write(int c) 写一个字符
void write(char[]cbuf) 写入一个字符数组
void write(char[]cbuf, int off, int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分

案例分析:

package com.zifu;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Test3 {
    public static void main(String[] args) throws Exception {
        OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("E:\\JavaSE\\Test\\File\\java.txt"));
        //写一个字符
        o.write("97");  //97
        o.write("a");  //a
        //刷新流
        o.flush();
        //写一个字符数组
        char[] chars={'a','b','c','d','e'};  //abcde
        //o.write(chars);

        //写一个字符数组的一部分
        o.write(chars,0,chars.length);  //abcde
        o.write(chars,1,3);  //bcd

        //写一个字符串
        //o.write("xyz");  //xyz

        //写一个字符串的一部分
       o.write("asdfghj",1,5);  //sdfgh
        o.close();
    }
}

4.字符流读数据的2中方式

方法名 说明
int read() 一次读一个字符数据
int read(char[] cbuf) 一次读一个字符数组数据

案例分析:

package com.zifu;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test4 {
    public static void main(String[] args) throws IOException {
        InputStreamReader i = new InputStreamReader(new FileInputStream("E:\\JavaSE\\Test\\File\\java.txt"));
        //一次读一个字符数据
        int by = i.read();
        while (by !=-1){
            System.out.print((char)by);  //aabcdebcdsdfgh
            by=i.read();
        }
        //一次读一个字符数组
        char[] chars=new char[1024];
        int c = i.read(chars);
        while (c!=-1){
            System.out.println(new String(chars,0,c));
            c=i.read(chars);
/*
aab
cde
bcds
dfgh            
 */
        }
        
    }
}

5.字符缓冲流

  • 字符缓冲流:

    • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲 区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
    • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途
  • 构造方法:

    • BufferedWriter(Writer out)
    • BufferedReader(Reader in)

案例分析:

package com.zifu;

import java.io.*;

public class Test5 {
    public static void main(String[] args) throws IOException {
        /*BufferedWriter w = new BufferedWriter(new FileWriter("E:\\JavaSE\\Test\\File\\java.txt"));
        w.write("Hello");
        w.write("\r\n");
        w.write("World");*/
        BufferedReader r = new BufferedReader(new FileReader("E:\\JavaSE\\Test\\File\\java.txt"));
        int by = r.read();
        while (by!=-1){
            System.out.print((char)by);
/*
Hello
World                                           
 */
            by=r.read();
        }
        //w.close();
        r.close();
    }
}

6.字符缓冲流特有功能

  • BufferedWriter:

    • void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
  • BufferedReader:

    • public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null

案例分析:

package com.zifu;

import java.io.*;

public class Test6 {
    public static void main(String[] args) throws IOException {
        BufferedWriter w = new BufferedWriter(new FileWriter("E:\\JavaSE\\Test\\File\\java.txt"));
        for (int i = 0; i <5 ; i++) {
            w.write("Java"+i);
/*
Java0
Java1
Java2
Java3
Java4
 */
            //换行
            w.newLine();
            w.flush();
        }
        w.close();

        BufferedReader r = new BufferedReader(new FileReader("E:\\JavaSE\\Test\\File\\java.txt"));
        /*String s = r.readLine();
        while (s!=null){
            System.out.println(s);
            s=r.readLine();
    }*/
        String s;
        while ((s=r.readLine())!=null){
            System.out.println(s);

        }
    }
}
/*
Java0
Java1
Java2
Java3
Java4
 */
相关文章
|
6月前
|
Java
Java输入输出
Java输入输出
42 0
|
6月前
|
Java API
Java中文件与输入输出
Java中文件与输入输出
|
6月前
|
存储 Java
Java输入输出
Java输入输出
|
Java 测试技术 Apache
Java IO 与 NIO:高效的输入输出操作探究
输入输出(IO)是任何编程语言中的核心概念,而在Java中,IO操作更是应用程序成功运行的基石。随着计算机系统变得越来越复杂,对IO的要求也日益增加。在本文中,我们将探讨Java IO和非阻塞IO(NIO)的重要性以及如何在Java中实现高效的输入输出操作。
|
5月前
|
存储 监控 Java
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
|
6月前
|
存储 Java
Java的`java.io`包包含多种输入输出类
【5月更文挑战第2天】Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
307 1
|
6月前
|
Java Linux C语言
Java中值得注意的『运算符、逻辑控制、输入输出』
Java中值得注意的『运算符、逻辑控制、输入输出』
|
6月前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
64 5
|
6月前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。
53 1
|
6月前
|
Java Linux C语言
【详识JAVA语言】输入输出
【详识JAVA语言】输入输出
46 1
下一篇
无影云桌面