文件读写
Java中通过流来读写文件,流是指一连串流动的字符,是以先进先出方式发送信息的通道。
输入/输出流与数据源:
Java流的分类:
输入输出流是相对于计算机内存来说的。
1、字节流与字符流的区别
字符流的底层就是字节流。而字符流主要是读取文本文件内容的,可以一个字符一个字符的读取,也可以一行一行的读取文本文件内容,而字节流读取单位为byte。byte作为计算机存储最基本单位,可以用字节流来读取很多其他格式的文件,比如图片视频等等。基于B/S和C/S的文件传输都可以采用字节流的形式。在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。
字节流就是按照字节来进行传输,字符流是按照字符来传输.最基本的是字节流,字符流可以说是对字节流的一个包装流,比如你知道了一个字符是8个字节,那么你让字节流一次传输8个字节,那不就相当于一次传输一个字符,也就是字符流了。
使用字节流不关闭执行:
package com.zy.demo2;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class StreamTest {
// 通过字节流 写文件
public static void ByteWrite() {
File file = new File("d:\\test.txt");
try {
OutputStream outputStream = new FileOutputStream(file);
String textString = "Hello World!!!";
byte[] data = textString.getBytes();
outputStream.write(data);
//outputStream.close();
} catch (IOException e) {
System.out.println("字节流写入文件出错。");
e.printStackTrace();
}
}
public static void main(String[] args) {
StreamTest.ByteWrite();
}
}
结果:
程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而 在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。
在开发中是使用字节流好还是字符流好呢?
回答:使用字节流更好。所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。
2、使用FileInputStream读取文本文件
package com.zy.demo2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class d {
/**
* 文件读取(一行一行读)
*/
public static void readFile(){
File file=new File("D:/test.txt");
try {
InputStreamReader read = new InputStreamReader(new FileInputStream(file), "utf8");
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
//循环输出每一行内容
while ((lineTxt = bufferedReader.readLine()) != null) {
System.out.println(lineTxt);
}
read.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
d.readFile();
}
}
结果:
3、File类
File 类的常用方法如下:
方法名称 | 说明 |
---|---|
boolean exists( ) | 判断文件或目录是否存在 |
boolean isFile( ) | 判断是否是文件 |
boolean isDirectory( ) | 判断是否是目录 |
String getPath( ) | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath( ) | 返回此对象表示的文件的绝对路径名 |
String getName( ) | 返回此对象表示的文件或目录的名称 |
boolean delete( ) | 删除此对象指定的文件或目录 |
boolean createNewFile( ) | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节, 如果文件不存在,则返回 0L |