Java新手学习之IO流的简单使用
作者:码小春
前言
在我们平时使用图形化界面的时候,会发现来建立一个文件夹或者一个文档的时候很简单,只需要在桌面单击鼠标右键就可以了。但是,在我们写项目的时候想要把一些东西存到文件夹里面怎么办呐?
不可能程序运行到需要文件夹的时候我再来到桌面或者哪里来手动建立一个文件或者文档吧?不要怀疑自己这样操作是肯定不行的,那有的人就会想了那我们怎么办呐?这不博主就来帮大家的忙了嘛,在java中有个东西叫做IO流就可以很好的解决这个问题。什么是IO流呐?接下来就由我来带领大家了解什么是IO流!
IO流
1、基本概念
IO:Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中。
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
2、IO流分类
图示:
3、File
在学习IO流之前我们要先明白如何利用程序创建一个文件夹或者一个文本文档,这样我们才能在往文件里面写东西的时候知道怎么写应该写到什么地方去。
3.1File基本概念
File是文件和目录路径名的抽象表示,文件和目录是可以通过File封装成对象的对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
3.2创建文本
File中创建文本的方方法常用的就一个:
代码创建一个Test.txt的文本:
import java.io.File; public class CreateDir { public static void main(String[] args) { File f1 = new File("E:\\Test.txt"); // 现在创建目录 f1.createNewFile(); } }
3.3创建目录
File中有两个方法来创建文件夹:
mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
mkdirs()方法创建一个文件夹和它的所有父文件夹。
代码创建一个 "/tmp/user/java/bin"文件夹:
import java.io.File; public class CreateDir { public static void main(String[] args) { String dirname = "/tmp/user/java/bin"; File d = new File(dirname); // 现在创建目录 d.mkdirs(); } }
3.4判断、读取和删除
File类中的一些常用方法给大家写在下面了
判断:
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
读取:
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
public File[] listFiles() | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 |
删除:
public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
判断、读取和删除的使用方法和前面的创建都差不太多就不一一进行代码展示了。一般只需要知道有这些方法就行,实在记不住可以在API上进行查找。
4、字节流
4.1字节流的抽象基类
这是字节流所有类的超类:
InputStream:这个抽象类是表示字节输入流的所有类的超类
OutputStream:这个抽象类是表示字节输出流的所有类的超类
子类名特点:子类名称都是以其父类名作为子类名的后缀
4.2字节流写数据
4.2.1常用字节流写数据的类:
void write(int b) | 将指定的字节写入此文件输出流 一次写一个字节数据 |
void write(byte[] b) | 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据 |
代码:
import java.io.*; public class CreateDir { public static void main(String[] args) { FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt"); //FileOutputStvoid write(int b):将指定的字节写入此文件输出流 fos.write(97); fos.write(98); fos.write(99); fos.write(100); fos.write(101); fos.close; } }
4.2.2换行和追加
(1)在字节流中如何实现换行呐?在不同的操作系统中换行是不一样的:
windows:\r\n
linux:\n
mac:\r
(2)字节流写数据如何实现追加写入
public FileOutputStream(String name,boolean append)
创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头
4.3字节流读数据
读取数据使用read方法:每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1。
代码如下:
public class FileInputStreamDemo01 { public static void main(String[] args) throws IOException { //创建字节输入流对象 //FileInputStream(String name) FileInputStream fis = new FileInputStream("myByteStream\\fos.txt"); int by; /* fis.read():读数据 by=fis.read():把读取到的数据赋值给by by != -1:判断读取到的数据是否是-1 */ //一个一个的读 while ((by=fis.read())!=-1) { System.out.print((char)by); } //一个指定的数组长度来读 byte[] bys = new byte[1024]; //1024及其整数倍 int len; while ((len=fis.read(bys))!=-1) { System.out.print(new String(bys,0,len)); } //释放资源 fis.close(); } }
5、字符流
5.1由来
字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码)。
字节流读取中文字符时,可能不会显示完整的字符,那是因为一个中文字符占用多个字节存储。
而字符流 = 字节流 + 编码表
5.2字符流写数据
字符流写数据常用的方法
void write(int c) | 写一个字符 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
刷新和关闭方法:
flush() | 刷新流,之后还可以继续写数据 |
close() | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
示例代码:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt")); //void write(int c):写一个字符 osw.write(97); //void writ(char[] cbuf):写入一个字符数组 char[] chs = {'a', 'b', 'c', 'd', 'e'}; osw.write(chs); //void write(char[] cbuf, int off, int len):写入字符数组的一部分 osw.write(chs, 0, chs.length); osw.write(chs, 1, 3); //void write(String str):写一个字符串 osw.write("abcde"); //void write(String str, int off, int len):写一个字符串的一部分 osw.write("abcde", 0, "abcde".length()); osw.write("abcde", 1, 3); //释放资源 osw.close();
5.3字符流读数据
读数据的两种方法
int read()一次读一个字符数据int read(char[] cbuf)一次读一个字符数组数据
代码示例:
InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\ConversionStreamDemo.java")); //int read():一次读一个字符数据 int ch; while ((ch=isr.read())!=-1) { System.out.print((char)ch); } //int read(char[] cbuf):一次读一个字符数组数据 char[] chs = new char[1024]; int len; while ((len = isr.read(chs)) != -1) { System.out.print(new String(chs, 0, len)); }
6、IO流小结
字节流:
字符流:
如果我们需要追求效率我们可以选择字符流和字节流都具有的Buffered开头的类使用方法和字节流字符流的使用方法相同。在我们使用了流之后我们需要关闭流,如果不关闭占用的资源就会很多太多了就会影响我们的运行速度。
7、特殊操作流
特殊操作流一般使用的时候比较少就只给大家列出来知道有这个流是拿来干嘛的,如果在使用中需要用到特殊操作流的话我们可以去查API查看具体的使用方法。
7.1标准输入输出流
- public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
- public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标
7.2字节打印流
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
- 可以改变输出语句的目的地
public static void setOut(PrintStream out):重新分配“标准”输出流
7.3对象序列化流和对象反序列化流
7.3.1对象序列化流
对象序列化介绍
- 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
- 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
- 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
- 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
对象序列化流: ObjectOutputStream
- 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
7.3.1对象反序列化流
对象反序列化流: ObjectInputStream
- ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象
7.4Properties集合
当我们需要将集合和IO流结合使用的时候我们就需要使用到Properties集合。
7.4.1介绍
是一个Map体系的集合类
Properties可以保存到流中或从流中加载
属性列表中的每个键及其对应的值都是一个字符串
由介绍我们知道这个集合的底层是个Map集合所有和Map集合存储使用是差不多的。
7.4.2Properties作为Map集合的特有方法
Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |
String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |
Set<String> stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |
7.4.3Properties和IO流相结合的方法
void load(InputStream inStream) | 从输入字节流读取属性列表(键和元素对) |
void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
void store(OutputStream out, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流 |
void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
8、总结
以上就是我给大家总结的关于IO流的一些常用知识,如果有没有总结到的或者总结的不好的请多多包含或者给博主指出来,博主继续努力学习改进自己的不足。
到此这篇关于Java新手学习之IO流简单使用的文章就介绍到这了,更多相关Java IO流的简单使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!