Java文件读写
一、文件读写的类
-
这个比较多,可以在网上搜一下,那个很全,但太多了,眼花缭乱。
-
我这儿放一张别人的:

- 这是比较实用的:

二、流
- 流:数据从一端“流向”另一端,是有方向的。
- 流分为:输入流,输出流。
- 在Java文件读写里:
- 字符流:单位:Unicode, 1 Unicode = 2 Byte
- 字节流:单位:Byte, 1 Byte = 8 bit
- 写入文件:Write类(输出字符流) 和 OutputStream类(输出字节流)
- 读取文件:Reader类(输入字符流) 和 InputStream类(输入字节流)
- 为什么这个输入,输出,看着这么别扭?请看缓冲区的概念。
三、缓冲区
- 又叫缓存。
- CPU:高速
- 磁盘:低速存储设备
- 写入操作:CPU与磁盘交互。限制:受制于低速存储设备。
- 缓冲区作用:每次写入操作把数据存到高速缓冲区,当达到一定的阈值,再一次性写入磁盘。
- 衍生:Java中的Buffer,基本上有这个单词的类,都比较高效,线程也安全。
四、Java文件读写一般要和Java的异常一起用
五、代码示例
- 写入文件——覆盖(BufferedWriter 和 BufferedOutputStream)
package Huffman;
import java.io.*;
public class Main {
public static void main(String[] args) {
/**
* Java Space 是eclipse的工作空间
* Java 0~100 是创建的项目
* src 是项目下的文件,主要装源文件(.java文件)
* Huffman 是src 下创建的一个包
*/
final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
/**
* BufferedWriter 和 BufferedOutputStream 都是写入文件的类
* BufferedWriter 针对字符
* BufferedOutputStream 针对字节
*/
try {
BufferedWriter out = new BufferedWriter(new FileWriter(filepath1));
out.write("I love you !");
out.close();
System.out.println("操作成功!");
}catch(IOException e) {
e.printStackTrace(); // 显示错误信息,和位置
}
try {
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filepath1));
out.write("I love you too !".getBytes());
out.close();
System.out.println("操作成功!");
}catch(IOException e) {
e.printStackTrace();
}
}
}
- 写入文件——追加(BufferedWriter)
- BufferedOutputStream也差不多,都是这种方法。
package Huffman;
import java.io.*;
public class Main {
public static void main(String[] args) {
/**
* Java Space 是eclipse的工作空间
* Java 0~100 是创建的项目
* src 是项目下的文件,主要装源文件(.java文件)
* Huffman 是src 下创建的一个包
*/
final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
/**
* 追加内容
* 只需把 new FileWriter(filepath1) 改为 new FileWriter(filepath1, true)
*/
try {
BufferedWriter out = new BufferedWriter(new FileWriter(filepath1, true));
out.write("I love you !");
out.close();
System.out.println("操作成功!");
}catch(IOException e) {
e.printStackTrace(); // 显示错误信息,和位置
}
}
}
- 读取文件——整个文件,不是一行一行(BufferedReader)
package Huffman;
import java.io.*;
public class Main {
public static void main(String[] args) {
/**
* Java Space 是eclipse的工作空间
* Java 0~100 是创建的项目
* src 是项目下的文件,主要装源文件(.java文件)
* Huffman 是src 下创建的一个包
*/
final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
try {
BufferedReader in = new BufferedReader(new FileReader(filepath1));
/**
* readLine() 是当读到换行标记'\n','\r'时,跟着换行,同时返回这一行字符串
* ready() 是用于检验缓冲区是否准备好被读取
*/
while(in.ready()) {
System.out.println(in.readLine());
}
} catch(IOException e) {
e.printStackTrace();
}
}
}

- 读取文件——一行一行(BufferedReader)
try {
BufferedReader in = new BufferedReader(new FileReader(filepath1));
String s = null;
s = in.readLine();
System.out.println(s);
in.close();
} catch(IOException e) {
e.printStackTrace();
}
- 读取文件——(BufferedInputStream)
package Huffman;
import java.io.*;
public class Main {
public static void main(String[] args) {
/**
* Java Space 是eclipse的工作空间
* Java 0~100 是创建的项目
* src 是项目下的文件,主要装源文件(.java文件)
* Huffman 是src 下创建的一个包
*/
final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
/**
* BufferedInputStream 字节流
* 用它来读取字符流
*/
try {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(filepath1));
int bit = 0;
byte[] buffer = new byte[1024];
while((bit=in.read(buffer)) != -1) {
String s = new String(buffer, 0, bit); // bit offset length
System.out.println(s);
}
in.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
- 读取文件——字节流(BufferedInputStream)
五、为什么?
- 为什么要有个:new FileReader(filepath1)
BufferedReader in = new BufferedReader(new FileReader(filepath1));
- 原因: BufferedReader是高级流,不能直接对文件进行操作,只有低级流才能直接与文件相连,所以需要嵌套一个低级流。
五、Files类读写文件
package Huffman;
import java.io.*;
import java.nio.file.*;
public class Main {
public static void main(String[] args) {
/**
* Java Space 是eclipse的工作空间
* Java 0~100 是创建的项目
* src 是项目下的文件,主要装源文件(.java文件)
* Huffman 是src 下创建的一个包
*/
Path filepath1 = Paths.get("D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt");
// 不存在就创建
if(!Files.exists(filepath1)) {
try {
Files.createFile(filepath1);
}catch(IOException e) {
e.printStackTrace();
}
}
// 读取文件
try {
String lines = Files.readString(filepath1);
System.out.println(lines);
} catch (IOException e) {
e.printStackTrace();
}
// 写入文件
try {
// 每次写入都完全覆盖 Files.write(filepath1, "I love you !".getBytes());
// 每次写入是追加 Files.write(filepath1, "I love you !\n".getBytes(), StandardOpenOption.APPEND);
// 写入文件的内容有中文 Files.write(filepath1, "我爱你 !".getBytes("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}

4811

被折叠的 条评论
为什么被折叠?



