Java学习日记:输入/输出

在变量、数组和对象中存储的数据是暂时存在的,程序结束后这些数据就会被清除。为了能够长期保存这些数据,需要将其储存在磁盘文件中,这样就可以在不同的程序中反复使用。Java中的I/O技术可以将数据保存在文本文件、二进制文件或者ZIP压缩文件中,达到永久保存数据的目的。

输入流和输出流

流是有序的数据序列,依据操作类型,分为输入流和输出流。I/O流提供了一条通道程序,可以使用通道把源中的字节序列送到目的地,这个源和目的地不仅仅可以使磁盘文件,也可以是键盘、鼠标、内存、显示器窗口等等。
Java学习日记:输入/输出_第1张图片
Java学习日记:输入/输出_第2张图片

InputStream(字节输入流)和Reader(字符输入流)都是抽象输入流类,是所有输入流类的父类。

File类

file中文意思是文件,在Java中代表了磁盘文件本身的对象。File类属于java.io包,定义了一些与平台无关的方法来操作文件,可通过调用File类中的方法,实现文件的创建、删除、重命名等操作。File类的对象主要用于获取文件本身的信息,文件所在目录、文件长度、文件读写权限等。

(1)文件创建及删除

/*
 * @author Jiacy
 * @date 2020-2-15
 * @version 1.0
 * 判断D盘的myword文件夹是否存在word.txt文件,如果存在则删除,不存在则创建文件
 */
package exercise15;

import java.io.File;

public class FileTest {

	public static void main(String[] args) {
		File file = new File("word.txt");          //创建文件对象
		if(file.exists()) {                        //如果文件存在
			file.delete();                         //删除该文件
			System.out.println("文件已删除");
		}else {                                    //文件不存在
			try {                                  //try语句捕捉可能存在的异常
				file.createNewFile();              //创建该文件
				System.out.println("文件已创建");
			}catch(Exception e) {
				e.printStackTrace();
			}
			}
		}

	}

运行结果

文件已创建

(2)获取文件信息
常用的获取文件信息方法有以下几种:
getName():获取文件名称
canRead():判断文件是否可读
canWrite():判断文件是否可被写入
exits():判断文件是否存在
length():获取文件长度(以字节为单位)
getAbsolutePath():获取文件绝对路径
getParent():获取文件的父路径
isFile():判断文件是否存在
isDirectory():判断文件是否为一个目录
isHidden():判断文件是否为隐藏文件
lastModified():获取文件最后修改时间

/*
 * @author Jiacy
 * @date 2020-2-15
 * @version 1.0
 * 获取当前文件夹下word.txt文件的名称、文件长度
 * 判断该文件是否为隐藏文件
 */
package exercise15;

import java.io.File;

public class FileTest1 {

	public static void main(String[] args) {
		File file = new File("word.txt");      //创建文件对象
		if(file.exists()) {                    //如果文件存在
			String name = file.getName();      //获取文件名称
			long length = file.length();       //获取文件长度
			boolean hidden = file.isHidden();  //判断文件是否隐藏
			system.out.println("文件名称:" + name);
			System.out.println("文件长度:" + length);
			System.out.println("是否为隐藏文件?" + hidden);
			
		}else {
			System.out.println("文件不存在!");
		}

	}

}

文件输入/输出流

FileInputStream类与FileOutputStream类,用来操作磁盘文件。

/*
 * @author Jiacy
 * @date 2020-2-15
 * @version 1.0
 * 使用FileOutputStream向文件word.txt写入信息,
 * 通过FileInputStream将文件中的数据读取到控制台。
 */
package exercise15;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileTest2 {

	public static void main(String[] args) {
		File file = new File("word.txt");      //创建文件对象
		try {
			//创建FileOutputStream对象
			FileOutputStream out = new FileOutputStream(file); 
			//创建byte型数组
			byte by[] = "我叫Jiacy,我热爱Java!".getBytes();
			out.write(by);                     //将数组内容写入文件
			out.close();                       //关闭流
		}catch(Exception e) {                  //处理异常信息
			e.printStackTrace();
		}
		try {
			//创建FileInputStream对象
			FileInputStream in = new FileInputStream(file);
			byte byt[] = new byte[1024];       //创建byte数组
			int len = in.read(byt);            //从文件中读取信息
			//输出文件中的信息
			System.out.println("文件中信息:" + new String(byt,0,len));
			in.close();                         //关闭流
		}catch(Exception e) {                  //处理异常信息
			e.printStackTrace();
		}
	}

}

运行结果:

文件中信息:我叫Jiacy,我热爱Java!

☆为了节约系统资源,在打开输入输出流并使用之后,应显式的将其关闭。

数据输入/输出流

数据输入/输出流允许应用程序以与机器无关的方式从底层输入流读取基本Java数据类型,也就是说在读取数据时,不需再关心这个数值应当是哪种字节。

DataOutputStream类提供了3中写入字符串的方法。
1)writeBytes(String s):将字符串中的每一个字符的低字节内容写入目标设备;
2)writeChars(String s):将字符串中每个字符的两个字节内容都写入目标设备;
3)writeUTF(String s):将字符串按照UTF编码后的字节长度介入目标设备,然后写入每个字节的UTF编码。

DataInputStream类只提供了readUTF()方法返回字符串,是因为要先确定字符串的长度,才能准确地读出字符串。

/*
 * @author Jiacy
 * @date 2020-2-15
 * @version 1.0
 * 通过DataOutputStream类的writeUTF()、writeChars()、writeBytes()方法向文件中写入数据;
 * 通过DataInputStream类的readUTF()将写入的数据输出至控制台
 */

package exercise15;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class DataTest {

	public static void main(String[] args) {
		try {
			//创建FileOutputStream文件对象
			FileOutputStream file = new FileOutputStream("word.txt");
			//创建DataOutputStream数据对象
			DataOutputStream data = new DataOutputStream(file);
			//data.writeBytes("用writeBytes()方法写入数据:");
			//data.writeChars("用writeChars()方法写入数据:");
			data.writeUTF("用writeUFT()方法写入数据:");
			data.close();                              //关闭流
			//创建FileInputStream文件对象
			FileInputStream fileinput = new FileInputStream("word.txt");
			//创建DataInputStream数据对象
			DataInputStream datainput = new DataInputStream(fileinput);
			System.out.print(datainput.readUTF());     //输出文件数据
			
		}catch(Exception e) {
			e.printStackTrace();                       //异常处理
		}

	}

}

运行结果:

writeUFT()方法写入数据:

用writeBytes()方法和writeChars()时的运行结果:

java.io.EOFException
	at java.base/java.io.DataInputStream.readFully(DataInputStream.java:202)
	at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:614)
	at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
	at exercise15.DataTest.main(DataTest.java:32)

由于回读只能读取UFT编码后的字符串,所以在运行到回读时系统会捕获到异常并输出。

一步两步三步四步,总会走到一万步。 2020.2.15

你可能感兴趣的:(java)