1. 文件的写入
package my; import java.io.*; public class TestWrite { public static void main(String[] args) throws IOException { byte[] data = {0, 2, 4, 6, 8, 10, 12, 14}; // 写入文件 File file = new File("example.123"); // 指定保存的路径 OutputStream outputStream = new FileOutputStream(file); // 创建文件 outputStream.write(data, 0, 8); // 8个字节 data[0] - data[7] outputStream.close(); System.out.println("exit."); } }
可以发现多了个123文件, 可以用UltraEdit这个工具打开,切换到十六进制查看
这几个数就是刚刚写入的
2. 文件的读取
package my; import java.io.*; public class TestRead { public static void main(String[] args) throws IOException { // 用于接收数据的缓存区, 需要足够大 byte[] buffer = new byte[1000]; // 这里可以使用绝对路径或者相对路径来定义文件 File file = new File("example.123"); // 从文件中读取数据,加载到缓存区 InputStream inputStream = new FileInputStream(file); //buffer表示缓存区, 0表示从第一个字节开始读取, 1000表示一共读取1000个字节 // 返回值res表示读取了多少个字节 int res = inputStream.read(buffer, 0, 1000); inputStream.close(); System.out.printf("读取了%d个字节\n", res); System.out.println("exit.."); } }
与文件的写入基本步骤差不多, 只不过这次是用一个buffer缓冲区来接收读取的文件里的字节数
3. 文本的写入
如何将一个字符串写入到文件, 我们需要先把字符串转换为字节数据, 文件的写入只能接收字节数据,我们要把string类型转换为byte[]类型
package my; import java.io.*; import java.nio.charset.StandardCharsets; public class WriteFile { public static void main(String[] args) throws IOException { String s = "你好世界"; byte[] buffer = s.getBytes(StandardCharsets.UTF_8); File file = new File("test.txt"); OutputStream outputStream = new FileOutputStream(file); outputStream.write(buffer); outputStream.close(); System.out.println("Exit.."); } }
与前边的字节读入基本无异, 就是把string类型转了一下byte类型,以UTF-8的格式转
4. 文本的读取
文本的读取就是和文本的写入反过来, 文本读取先读取到字符数据,然后再把字符数据转换为String类型即可
package my; import java.io.*; import java.nio.charset.StandardCharsets; public class TextRead { public static void main(String[] args) throws IOException { byte[] buffer = new byte[1000]; // 定义文本路径 File file = new File("test.txt"); // 从文本中读取并加载到缓冲区 InputStream inputStream = new FileInputStream(file); int res = inputStream.read(buffer, 0, 1000); /** * 这里吧读取的byte字节类型转换为字符串类型 */ String s = new String(buffer, StandardCharsets.UTF_8); System.out.println(s); } }
5. 二进制编码
对于基本类型,比如int, double ,float如何存入文件
对于Java, 他有一个ByteBuffer ,一个基于字节得二进制编码器, 可以对这些类型进行编码
package my; import java.nio.ByteBuffer; public class OtherType { public static void main(String[] args) { // 创建一个100个字节得二进制编码器 ByteBuffer bf = ByteBuffer.allocate(100); // allicate 既是申请的意思,表示静态申请空间 // 把 一个整数和小数放进去 bf.putInt(1234); bf.putDouble(56.78); // 查看实际占用了多少字节,实际是一个指针, 指向第一个空闲的字节,所以可以用来表示总字节个数 int size = bf.position(); // 利用array方法来获取它内部得数据 byte[] data = bf.array(); // 获取内部数据的容量 int capacity = bf.capacity(); System.out.printf("实际占用的字节数为 %d \n", size); System.out.printf("总共的字节的容量 %d \n", capacity); for (int i = 0; i < size; i++) { System.out.printf("%02x ",data[i]); } } }
当然写进去的都是乱码
用编码工具即可看到二进制结果
6. 二进制解码
编码: Encode
解码: Decode
将字节数据byte[]再恢复为原始数据int, double
解码过程还是用ByteBuffer来实现
package my; import java.io.*; import java.nio.ByteBuffer; public class OtherRead { public static void main(String[] args) throws IOException { // 读取二进制文件中的字符 File file = new File("number.txt"); InputStream inputStream = new FileInputStream(file); byte[] buffer = new byte[100]; int res = inputStream.read(buffer, 0, 100); // 二进制解码, 这里利用wrap ByteBuffer bf = ByteBuffer.wrap(buffer, 0, res); bf.position(0); // 这一步, 有点意思, 就是把指针移动到最前边的位置, 来从头读取 int a = bf.getInt(); float b = bf.getFloat(); System.out.printf("a = %d, b = %f\n",a,b); System.out.println("exit.."); } }
二进制编码的时候我们用的allocate来申请空间, 这里区分wrap
allocate() 是再内存中,自己创建了 byte[]空间
wrap()则是利用外部读取进来的现成的byte[]空间,而不用自己创建
另外我们可以利用 getInt(). getFloat(), getDouble()等这些函数来提取相应的字符数目来解码
getInt()会依次读取4个字节来组成int类型数, getFloat() 也是读取四个字节, 而getDouble() 则是读取8个字节