Java教程

Java - 基础 - I/O编程

本文主要是介绍Java - 基础 - I/O编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java - 基础 - I/O编程

  • Java - 基础 - I/O编程
    • 一、File类
      • 1.1 常见方法
      • 1.2 使用实例
    • 二、I/O流介绍
      • 2.1 字节流
      • 2.2 字符流
      • 2.3 InputStream抽象类
      • 2.4 OutputStream抽象类
      • 2.5 FileInputStream
      • 2.6 FileOutputStream
    • 三、实例操作
      • 3.1文件读取
      • 3.2 文件复制

Java - 基础 - I/O编程

一、File类

File类是一个与平台无关的文件目录

  • File.separator表示分隔符
  • 文件IO处理过程有延迟,使用线程休眠等待

1.1 常见方法

  1. 构造方法
方法说明
File(String path)path可以是实路径也可以是文件名
File(String path, String name)path是路径名,name是文件名
File(File dir, String name)dir是路径对象,name是文件名
  1. Get方法
方法说明
String getName()获得文件的名称,不包括路径
String getPath()获得文件的路径,包含文件名
String getAbsolutePath()获得文件的绝对路径
String getParent()获得文件的上一级目录名,等同于getPath()减去getName()
File getParentFile()获得文件的上一级文件对象,等同于getPath()减去getName()

getPath()和getAbsolutePath()区别:

  1. 判断方法
方法说明
boolean exists()判断当前File对象所表示的文件是否存在
boolean canWrite( )判断当前文件是否可写
boolean canRead( )判断当前文件是否可读
boolean isFile( )判断当前文件是否是文件
boolean isDirectory( )判断当前文件是否是目录
  1. 文件操作
方法说明
long lastModified()获得文件最近一次修改的时间
long length( )获得文件的长度,以字节为单位
boolean delete( )删除当前文件,成功返回 true
boolean renameTo(File dest)将重新命名当前File对象所表示的文件。成功返回 true
  1. 目录操作
方法说明
boolean mkdir()创建File对象指定的目录,只能是路径
boolean mkdirs()创建File对象指定的目录,不仅仅是路径
String[] list()返回当前目录下的文件和目录,返回值是字符串数组
String[] list(FilenameFilter filter)返回当前目录下满足指定过滤器的文件和目录,参数是实现FilenameFilter接口对象,返回值是字符串数组
File[] listFiles()返回当前目录下的文件和目录,返回值是File数组
File[] listFiles(FilenameFilter filter)返回当前目录下满足指定过滤器的文件和目录,参数是实现FilenameFilter接口对象,返回值是File数组
File[] listFiles(FileFilter filter)返回当前目录下满足指定过滤器的文件和目录,参数是实现FileFilter接口对象,返回值是File数组

1.2 使用实例

//得出文件夹下的全部路径,传入一个文件名
private static void print(File file) {
	if(file.isDirectory()) {
		File result [] =file.listFiles();
		if(result !=null) {//增加文件无法访问的判断
			for(int x =0;x<result.length;x++) {
				print(result[x]);
			}
			
		}
	}
	System.out.println(file);
}
//如何使用mkdirs
File f = new File("C:\\a\\b\\c.txt");
if(!f.exist()){
    f.mkdirs();//创建路径
    f.createNewFile();//创建文件
}
//结果:创建C:\\a\\b\\c.txt

//如何使用mkdir()
File f = new File("C:\\a\\b");
if(!f.exist()){
    f.mkdir();//创建路径
}
//结果:创建C:\\a\\b

对目录操作有两个过滤器接口:FilenameFilterFileFilter。它们都只有一个抽象方法accept

FilenameFilter接口中的accept方法如下:

  • boolean accept(File dir, String name):测试指定dir目录中是否包含文件名为name的文件。

FileFilter接口中的accept方法如下:

  • boolean accept(File pathname):测试指定路径名是否应该包含在某个路径名列表中。

注意 路径中会用到路径分隔符,路径分隔符在不同平台上是有区别的,UNIX、Linux和macOS
中使用正斜杠“/”,而Windows下使用反斜杠“\”。Java是支持两种写法,但是反斜杠“\”属于特殊字符,前面需要加转义符。例如C:\Users\a.java在程序代码中应该使用C:\Users\a.java表示,或表示为C:/Users/a.java也可以。**

二、I/O流介绍

2.1 字节流

8位,文件是图片等类型,用字节流

  • InPutStream 读文件
  • OutPutStream 写文件
  1. InputStream
输入流说明
FileInputStream文件输入流
ByteArrayInputStream面对字节组的输入流
PipedInputStream管道输入流,用于两个线程之间的数据传递
FilterInputStream过滤输入流,它是一个装饰器拓展输入流
BufferedInputStream缓冲区输入流,是FilterInputStream子类
DataInputStream面向基本数据类型的输入流,是FilterInputStream子类
  1. OutPutStream
输入流说明
FileOutputStream文件输出流
ByteArrayOutputStream面对字节组的输出流
PipedOutputStream管道输出流,用于两个线程之间的数据传递
FilterOutputStream过滤输出流,它是一个装饰器拓展输入流
BufferedOutputStream缓冲区输出流,是FilterInputStream子类
DataOutputStream面向基本数据类型的输出流,是FilterInputStream子类

2.2 字符流

16位Unicode,纯文本使用字符流

  • Write 读文件
  • Reader 写文件
  1. Reader
输入流说明
FileReader文件输入流
CharArrayReader面对字节组的输入流
PipedReader管道输入流,用于两个线程之间的数据传递
FilterReader过滤输入流,它是一个装饰器拓展输入流
BufferedReader缓冲区输入流,是FileReader的子类
InputStreamReader将字节流转换为字符流,是FileReader的父类
  1. Writer
输入流说明
FileWriter文件输出流
CharArrayWriter面对字节组的输出流
PipedWriter管道输出流,用于两个线程之间的数据传递
FilterWriter过滤输出流,它是一个装饰器拓展输入流
BufferedWriter缓冲区输出流,是FileReader的子类
InputStreamWriter将字节流转换为字符流,是FileReader的父类

掌握字节流的API先要熟悉它的两个抽象类InputStream 和OutputStream,了解它们有哪些主要的方法。


2.3 InputStream抽象类

InputStream是字节输入流的根类,它定义了很多方法,影响着字节输入流的行为。下面详细介绍一
下。
InputStream主要方法如下:

  • int read():读取一个字节,返回0到255范围内的int字节值。如果已经到达流末尾,而且没有可
    用的字节,则返回值-1。
  • int read(byte b[] ):读取多个字节,数据放到字节数组b中,返回值为实际读取的字节的数量,如
    果已经到达流末尾,而且没有可用的字节,则返回值-1。
  • int read(byte b[ ], int off, int len):最多读取len个字节,数据放到以下标off开始字节数组b中,将
    读取的第一个字节存储在元素b[off]中,下一个存储在b[off+1]中,依次类推。返回值为实际读
    取的字节的数量,如果已经到达流末尾,而且没有可用的字节,则返回值-1。
  • void close():流操作完毕后必须关闭。
上述所有方法都会抛出IOException,使用时要注意

2.4 OutputStream抽象类

OutputStream是字节输出流的根类,它定义了很多方法,影响着字节输出流的行为。下面详细介绍一
下。

  • OutputStream主要方法如下:
    void write(int b):将b写入到输出流,b是int类型占有32位,写入过程是写入b 的8个低位,b的24
    个高位将被忽略。
  • void write(byte b[ ]):将b.length个字节从指定字节数组b写入到输出流。
  • void write(byte b[ ], int off, int len):把字节数组b中从下标off开始,长度为len的字节写入到输出
    流。
  • void flush():刷空输出流,并输出所有被缓存的字节。由于某些流支持缓存功能,该方法将把缓
    存中所有内容强制输出到流中。
  • void close( ):流操作完毕后必须关闭。
上述所有方法都声明抛出IOException,因此使用时要注意。

案例:文件复制

FileInputStream构造方法主要有:

  • FileInputStream(String name):创建FileInputStream对象,name是文件名。如果文件不存在则抛出FileNotFoundException异常。
  • FileInputStream(File file):通过File对象创建FileInputStream对象。如果文件不存在则抛出
    FileNotFoundException异常。

FileOutputStream构造方法主要有:

  • FileOutputStream(String name):通过指定name文件名创建FileOutputStream对象。如果name文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。
  • FileOutputStream(String name, boolean append):通过指定name文件名创建FileOutputStream对象,append参数如果为 true,则将字节写入文件末尾处,而不是写入文件开始处。如果name文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。
  • FileOutputStream(File file):通过File对象创建FileOutputStream对象。如果file文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。
  • FileOutputStream(File file, boolean append):通过File对象创建FileOutputStream对象,append参数如果为 true,则将字节写入文件末尾处,而不是写入文件开始处。如果file文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。

2.5 FileInputStream

  1. 构造方法
    这两种方法都可能引发FileNotFoundException异常
构造方法说明
FileInputStream(File file)通过文件对象创建一个文件输入流对象
FileInputStream(String path)通过文件绝对路径创建一个文件输入流对象
//使用该方法,可以先进行文件的检查和创建的操作
File f  = new File("C:\\A\\B\\C.txt");
InputStream in1 = new FileInputStream(f);

InputStream in2 = new FileInputStream("C:\\A\\B\\C.txt");

2.6 FileOutputStream

  1. 构造方法
    这两种方法都可能引发FileNotFoundException异常
构造方法说明
FileInputStream(File file)通过文件对象创建一个文件输入流对象
FileInputStream(String filePath)通过文件绝对路径创建一个文件输入流对象
FileOutputStream(String filePath, boolean append)append为true时,文件可以追加内容,从末尾写入
//使用该方法,可以先进行文件的检查和创建的操作
File f  = new File("C:\\A\\B\\C.txt");
OutputStream in1 = new FileOutputStream(f);

OutputStream in2 = new FileOutputStream("C:\\A\\B\\C.txt");


三、实例操作

3.1文件读取

String pathName = "d:/test.txt";
File f = new File(pathName);
InputStream in = new FileInputStream(f);
byte[] b = new byte[(int)f.length()]; 
in.read(b);	
System.out.println(new String (b,"UTF-8" ));

3.2 文件复制

下面介绍如果将./TestDir/build.txt文件内容复制到./TestDir/subDir/build.

  • 使用字节流操作
public class FileCopy {
	public static void main(String[] args) {
		try (FileInputStream in = new FileInputStream("./TestDir/build.txt");
			FileOutputStream out = new FileOutputStream("./TestDir/subDir/build.txt")) { ①

			// 准备一个缓冲区
			byte[] buffer = new byte[10]; ②
			// 首先读取一次
			int len = in.read(buffer); ③
			while (len != -1) { ④
				String copyStr = new String(buffer); ⑤
				// 打印复制的字符串
				System.out.println(copyStr);
				// 开始写入数据
				out.write(buffer, 0, len); ⑥
				// 再读取一次
				len = in.read(buffer); ⑦
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
		e.printStackTrace();
		}
	}
		
}

使用第一种方法,是每10个byte就写入一次,写入的次数远远多于缓存区设置为1024的时候,消耗的时间超过1024

  • 使用字节缓冲流操作
public class FileCopy{
	public static void main(String args[]){
		try(FileInputStream in =new FileInputStream("./TestDir/build.txt");
		FileOutputStream out =new FileOutputStream("./TestDir/subDir/build.txt")){

			byte [] buffer = new byte [1024];
			
			int len=in.read(buffer);

			while(len!=-1){
				out.write(buffer,0,len);
				len=in.read(buffer);
			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
这篇关于Java - 基础 - I/O编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!