目录
FileOutputStream FileInputStream
输入流的话 就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,
输出流则正好相反,是将数据从内存中的数据写入到各种输出设备(比如文件、显示器、磁盘等)。
哈哈,是不是和你想的不一样那?不是问题记住就行了,加油&&
适用于所有的场景,也是最原始的读写操作
输出流 输入流(覆盖/追加)
- import java.io.*;
- import java.nio.charset.StandardCharsets;
-
- public static void FileReadWrite() {
- String path = "F:\\a.txt";
- //新建一个文件对象
- File file = new File(path);
- //文件读取
- try {
- //创建输入流((以内存为参照物)从文件输入到内存中叫输入流,相反为输出流),用于读取文件
- //如果你这里有疑惑看总结
- InputStream inputStream = new FileInputStream(file);
- //定义一个字节数组
- byte[] b = new byte[1024];
- //将文件读入b,如果读完后b数组没有满,则b的剩余位置用空格填充
- inputStream.read(b);
- //新建字符串对象,并指定编码方式
- String res = new String(b, StandardCharsets.UTF_8);
- //.trim()方法用于去除多余的空格
- System.out.println(res.trim());
-
- inputStream.close();
- } catch (FileNotFoundException e) {
- throw new RuntimeException(e);
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
-
-
- String path2 = "F://b.txt";
- File file2 = new File(path2);
- //写入
- //输出流(从内存输入到文件中)
- OutputStream out = null;
- try {
- //新建输出流对象
- //注意这里的FileOutputStream的弟2个参数为true时表示追加,反之为覆盖
- out = new FileOutputStream(file2, true);
- //写入文件的字符串
- String inputString = "测试一下爱";
- //以字节的方式写入
- out.write(inputString.getBytes());
- out.flush();
- out.close();
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- //记得最终的释放
- finally {
- if (out != null) {
- try {
- out.close();
- }
- catch (Exception e)
- {
- System.out.println(e.getMessage());
- }
- }
- }
1 inputstream类和outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。
2 inputstream类和outputstream类是输入输出字节用的类
3 里面的各个方法都有可能会产生异常,记得try,catch包裹,或者使用断言
inputstream
- public abstract int read( ):
- 读取一个byte的数据,返回值是高位补0的int类型值。
-
- public int read(byte b[ ]):
- 读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实上是调用下一个方法实现的
-
- public int read(byte b[ ], int off, int len):
- 从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
-
- public int available( ):
- 返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
-
- public long skip(long n):
- 忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
-
- public int close( ) :
- 我们在使用完后,必须对我们打开的流进行关闭.
OutputStream
- public void write(byte b[ ]):
- 将参数b中的字节写到输出流。
-
- public void write(byte b[ ], int off, int len) :
- 将参数b的从偏移量off开始的len个字节写到输出流。
-
- public abstract void write(int b) :
- 先将int转换为byte类型,把低字节写入到输出流中。
-
- public void flush() :
- 将数据缓冲区中数据全部输出,并清空缓冲区。
-
- public void close() :
- 关闭输出流并释放与流相关的系统资源。
- public static void FileOutput_InputStream()
- {
- String Path="F://a.txt";
- //输出流
- try {
- FileInputStream input=new FileInputStream(Path);
- byte[] c_s=new byte[1024];
- try{
- if(input.read(c_s)==-1)
- {
- System.out.println("文件读取完毕");
- }
- input.close();
- }
- catch (Exception e)
- {
- System.out.println(e.getMessage());
- }
- String res = new String(c_s, StandardCharsets.UTF_8);
- System.out.println(res.trim());
- } catch (FileNotFoundException e) {
- throw new RuntimeException(e);
- }
-
- //输入流
- FileOutputStream fos=null;
- try {
- //依然两种方法
- fos = new FileOutputStream(Path,true);
- String inputString="测试FileOutputStream";
- try {
- fos.write(inputString.getBytes());
- System.out.println("写入完成");
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- } catch (FileNotFoundException e) {
- throw new RuntimeException(e);
- }
- finally {
- if (fos != null) {
- try {
- fos.close();
- }
- catch (IOException e) {
- System.out.println(e.getMessage());
- }
- }
- }
- }
适用于文本文件的读写呀,速度也很快
输出流 输入流(覆盖/追加)
- import java.io.FileWriter;
- import java.io.FileReader;
- public static void FZ_FileReadWrite() {
- //以字符的方式写入
- FileWriter fw = null;
- String Path = "F://a.txt";
- try {
-
- //同上面的字节写入一样,加true为追加
- fw = new FileWriter(Path,true);
- String inputString = "写入要";
- fw.write(inputString);
-
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- finally {
- if (fw != null) {
- try {
- fw.close();
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- }
- }
-
- //文件读出
- FileReader fd=null;
- try {
- fd=new FileReader(Path);
- char[] reader=new char[1024];
- try {
- //返回值为非空格字符个数
- int length=fd.read(reader);
- System.out.println("实际字有:"+length);
- //新建拼接字符串
- StringBuilder stringBuilder=new StringBuilder();
- //将非空格字符拼接
- for (int i = 0; i < length;i++) {
- stringBuilder.append(reader[i]);
- }
- System.out.println(stringBuilder.toString());
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- } catch (FileNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
这是最常用的,性能也不错的读写方式呀!
- public static void Buffer_()
- {
- String path="F:\\JAVA EE Preject\\untitled2\\KotlinPratice\\src\\helloworld.kt";
- //可以看出是越封装越深入
- try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(path)))){
- String printString;
- //每次读一行
- while ((printString=bufferedReader.readLine())!=null)
- {
- //每次输出一行
- System.out.println(printString);
- }
- }
- catch (Exception e) {
- System.out.println("搓搓");
- }
- }
- public static void copyFile()
- {
- String path1="F:\\JAVA EE Preject\\untitled2\\KotlinPratice\\src\\helloworld.kt";
- String path="F:\\JAVA EE Preject\\untitled2\\KotlinPratice\\src\\helloworld.txt";
- try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(path1)));
- BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(path))))) {
- String line;
- while ((line = bufferedReader.readLine()) != null)
- {
- bufferedWriter.write(line+"\r\n");
- }
- }
- catch (Exception e)
- {
- System.out.println("踩踩踩");
- }
- }
文件大小 | 读写方式 | 耗时 |
---|---|---|
30M | 普通文件流 | 50-60 ms |
缓存流 | 32-35 ms | |
随机文件方式 | 40-50 ms | |
内存映射文件 | 50-60 ms | |
461M | 普通文件流 | 1300-2300 ms |
缓存流 | 1700-2000 ms | |
随机文件方式 | 1300-3000 ms | |
内存映射文件 | 890-1000 ms | |
1.47G | 普通文件流 | 11s |
缓存流 | 9s | |
随机文件方式 | 10s | |
内存映射文件 | 3s(首次较慢) |