InputStream和Reader是所有输入流的抽象基类,虽然本身并不能创建实例来完成输入,但他们的方法是所有输入流都可以使用的方法
InputStream里包含三个方法:
Reader里包含如下三个方法:
import java.io.*;public class FileInputStreamTest
{public static void main(String[] args) throws IOException{// 创建字节输入流var fis = new FileInputStream("FileInputStreamTest.java");// 创建一个长度为1024的数组var bbuf = new byte[16];// 用于保存实际读取的字节数var hasRead = 0;// 使用循环来完成重复取得过程while ((hasRead = ad(bbuf)) > 0){// 取出字节,将字节数组转换成字符串输入!System.out.print(new String(bbuf, 0, hasRead));}// 程序里打开的文件IO资源不属于内存里的资源,垃圾回收无法回收该资源,必须显示关闭IO资源// 关闭文件输入流,放在finally块里更安全fis.close();}
}
执行结果:
import java.io.*;public class FileInputStreamTest
{public static void main(String[] args) throws IOException{// 创建字节输入流var fis = new FileInputStream("FileInputStreamTest.java");// 创建一个长度为1024的“竹筒”var bbuf = new byte[16];// 用于保存实际?寥〉淖纸谑?var hasRead = 0;// 使用循环来重复“取水”过程while ((hasRead = ad(bbuf)) > 0){// 取出“竹?病敝兴危ㄗ纸冢纸谑樽怀勺址淙耄?System.out.print(new String(bbuf, 0, hasRead));}// ?乇瘴募淙肓鳎旁趂inally块里更安全fis.close();}
}
在执行结果中看到乱码的原因是文件保存的时候采用GBK的编码方式,每个中文字符占两个字节,如果read()方法读取时候,整好读了这两个字节的第一个字节就结束了,那等于读了半个中文字符,就会导致乱码,把数组长度放大即可解决这个问题
import java.io.*;public class FileReaderTest
{public static void main(String[] args){try (// 创建字符输入流var fr = new FileReader("FileReaderTest.java")){// 创建一个长度为32的“竹筒”var cbuf = new char[32];// 用于保存实际读取的字符数var hasRead = 0;// 使用循环来重复“取水”过程while ((hasRead = fr.read(cbuf)) > 0){// 取出“竹筒”中水滴(字符),将字符数组转换成字符串输入!System.out.print(new String(cbuf, 0, hasRead));}}catch (IOException ex){ex.printStackTrace();}}
}
Java7之后改了了所有IO资源类,都实现了AutoCloseable接口,因此都可以通过自动关闭资源的try语句来关闭这些IO流
此外,InputStream和Reader还支持移动记录指针:
OutputStream和Writer两个流都提供了如下三个方法:
字符流以字符作为操作单位,所以Writer可以用字符串来代替字符数组,即以String对象作为参数,它还有两个独有的方法:
import java.io.*;public class FileOutputStreamTest
{public static void main(String[] args){try (// 创建字节输入流var fis = new FileInputStream("FileOutputStreamTest.java");// 创建字节输出流var fos = new FileOutputStream(")){var bbuf = new byte[32];var hasRead = 0;// 循环从输入流中取出数据while ((hasRead = ad(bbuf)) > 0){// 每读取一次,即写入文件输出流,读了多少,就写多少。fos.write(bbuf, 0, hasRead);}}catch (IOException ioe){ioe.printStackTrace();}}
}
import java.io.*;public class FileWriterTest
{public static void main(String[] args){try (var fw = new FileWriter(")){fw.write("锦瑟 - 李商隐rn");fw.write("锦瑟无端五十弦,一弦一柱思华年。rn");fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。rn");fw.write("沧海月明珠有泪,蓝田日暖玉生烟。rn");fw.write("此情可待成追忆,只是当时已惘然。rn");}catch (IOException ioe){ioe.printStackTrace();}}
}
使用Java的IO流执行输出时,不能忘记关闭输出流,关闭输出流可以保证流的物理资源被回收的同时还可以将输出流缓冲区中的数据flush到物理节点里
本文发布于:2024-02-01 23:54:31,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170680838239980.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |