文件操作

  • 1. File类
  • 2. Java的IO流
  • (1)流的分类
  • (2)输入流和输出流的工作机制
  • 3. 输入流(InputStream 和 Reader)
  • 4. 输出流(OutputStream 和 Writer)


1. File类

File代表的是与平台无关的文件和目录,File能够新建、删除、重命名文件和目录。
但是如果需要访问文件内容本身,则需要输入、输出流。

TIPS:
windows下路径分隔符:\,因为\表示转义符
java支持用/作为平台无关的路径分隔符

File类常用方法参考这里

File类方法实例程序:

public class FileTest {
	public static void main(String[] args) throws IOException {
		//创建File对象
		File file =  new File(".");
		//获取文件名
		System.out.println(file.getName());
		//获取父路径
		System.out.println(file.getParent());
		//获取绝对路径
		System.out.println(file.getAbsoluteFile());
		//获取上一级路径
		System.out.println(file.getAbsoluteFile().getParent());
		//创建临时文件
		File tempFile = File.createTempFile("aaa", ".txt",file);
		//JVM退出时删除该文件
		tempFile.deleteOnExit();
		//创建新文件
		File newFile = new File(System.currentTimeMillis()+"");
		//判断newFile文件是否存在
		System.out.println(newFile.exists());
		//以指定newFile对象创建文件
		newFile.createNewFile();
		System.out.println(newFile.exists());
		//以指定newFile对象创建目录
		System.out.println(newFile.mkdir());
		//使用list方法列出当前路径下所有的文件和路径
		String[] fileList = file.list();
		for (String fileName : fileList) {
			System.out.print(fileName+"  ");
		}
		System.out.println();
		//listRoot静态方法列出所有的磁盘根目录
		File[] roots = file.listRoots();
		for (File root : roots) {
			System.out.print(root+"  ");
		}
	}
}

输出如下:

.
null
C:\Users\Administrator\Workspaces\MyEclipse 2017 CI\File\.
C:\Users\Administrator\Workspaces\MyEclipse 2017 CI\File
false
true
false
.classpath  .project  .settings  1539013363207  aaa8487166334884126973.txt  bin  src  
C:\  D:\  E:\  F:\  G:\  H:\  I:\

2. Java的IO流

java 自定义文件输出路径 java输入文件路径_OutputStream

(1)流的分类

抽象基类

输入流

输出流

 

字节流

InputStream

OutputStream

操作数据单元是8位的字节

字符流

Reader

Writer

操作数据单元是16位的字符

  • 节点流:程序和输入输出节点直接连接
  • 处理流:包装节点流
(2)输入流和输出流的工作机制
  • 输入流使用隐式的记录指针表示当前正准备从什么位置开始读取,读取后,记录指针自动向后移动。(这里就涉及到输入流只能读取一次的问题)
  • 输出流同样使用隐式指针标识当前准备放入的位置,输出后,记录指针同样自动向后移动。

3. 输入流(InputStream 和 Reader)

InputStream中包含如下三个方法:

方法

说明

返回值

int read()

读取单个字节

所读取的单个字节(int类型)

int read(byte[] b)

读取b.length个字节的数据,放在b中

读取的字节数(返回-1表示读到了输入流的结束点

int read(byte[] b,int off,int len)

读取len个字节的数据,放在b中off开始的位置

读取的字节数

Reader中包含三个类似的方法,区别只是字节和字符:

  • int read()
  • int read(char[] cbuf)
  • int read(char[] cbuf,int off,int len)

实例:使用FileInputStream读取文件H:/test.txt:

try (FileInputStream fis =  new FileInputStream("H:/test.txt"))
{
	byte[] bbuf = new byte[1024];
	int hasRead=0;
	while ((hasRead=fis.read(bbuf))>0) {
		System.out.print(new String(bbuf,0,hasRead));
	}
} catch (IOException e) {
	e.printStackTrace();
}

实例:使用FileReader读取文件H:/test.txt:

try (FileReader fr =  new FileReader("H:/test.txt"))
{
	char[] cbuf = new char[32];
	int hasRead=0;
	while ((hasRead=fr.read(cbuf))>0) {
		System.out.print(new String(cbuf,0,hasRead));
	}
} catch (IOException e) {
	e.printStackTrace();
}

Tips:

  1. Java 7 之后可通过自动关闭资源的try语句关闭IO流,使用方法是把流的定义放在try后的()中;
  2. 移动记录指针的方法:
    void mark(int readAheadLimit)
    boolean markSupported()
    void reset()
    long skip(long n)

4. 输出流(OutputStream 和 Writer)

OutputStream中包含如下三个方法:

方法

说明

void write(int c)

将指定的字节输出到输出流

void write(byte[] b)

将字节数组中的数据输出到输出流

void write(byte[] b,int off,int len)

将字节数组中从off开始,长度为len的字节输出到输出流

Writer中包含三个类似的方法,区别只是字节和字符。
Writer中还包含另外两个以字符串为参数的方法:

方法

说明

void write(String str)

将字符串输出到输出流

void write(String str, int off, int len)

将字符串中从off开始,长度为len的字符输出到输出流

实例:使用FileInputStream输入,并使用FileOutputStream输出,实现复制文件的功能。

try (FileInputStream fis = new FileInputStream("H:/test.txt");
	FileOutputStream fos = new FileOutputStream("H:/new-test.txt"))
{
	byte[] bbuf = new byte[32];
	int hasRead = 0;
	while ((hasRead = fis.read(bbuf))>0) {
		fos.write(bbuf, 0, hasRead);
	}
} catch (IOException e) {
	e.printStackTrace();
}

实例:使用Writer直接输出字符串内容。

try (FileWriter fw = new FileWriter("H:/out-test.txt"))
{
	fw.write("长城\r\n");
	fw.write("    ——诗一首\r\n");
	fw.write("啊\r\n");
	fw.write("长城啊\r\n");
	fw.write("你可真他喵的长\r\n");
} catch (IOException e) {
	e.printStackTrace();
}