java
来源:互联网 发布:仿优酷网站源码php 编辑:程序博客网 时间:2024/06/06 01:29
java 的I/O操作,全称为Input/OutPut,即输入输出操作。我们在开发的过程中,对很多的数据都需要通过I/O操作进行输入或者输出。因此,掌握I/O操作,于开发工作而言是最不可或缺的。同时,关于这个知识点,里面包含了太多的实现类,不能一一介绍完毕。所以选取几个比较常用的进行讲解。其他的可以通过观看文档,结合这章内容进行分析和理解。话不多讲,就进入我们的第一个知识点:
File类
在整个I/O包中,唯一与文件本身有关的类就是File类,我们可以用它来进行创建或者删除文件等操作。通过它,我们可以通过代码来创建或者删除一个文件/文件夹。下面看例子:
public class Test1 { public static void main(String[] args){ //设置创建文件的路径,这里为我电脑中的桌面,文件名为test.txt String pathName = "C:\\Users\\dml\\Desktop\\test.txt"; //实例化文件操作 File file = new File(pathName); try { //创建出一个新的文件 file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
运行这段代码,控制台没有任何输出,但是在桌面上会出现一个test.txt文件,如图:
至于其他操作,这里不多做实例。贴上相应的方法:
文件或目录的属性canRead() canWrite() canExecute() 是否可读可写可执行isHidden() 是否隐藏文件exists() 表示的路径是否存在getAbsolutePath() 获得文件的完整路径getName() 获得文件名getParent() 获得父目录lastModified() 最后修改时间,毫秒值length() 文件字节量,对目录无效isDirectory() 是否文件夹isFile() 是否文件getTotalSpace() 空间总大小getFreeSpace() 可用空间 文件或目录操作createNewFile() 创建文件delete() 删除文件或“空目录”mkdir() 创建单层目录mkdirs() 创建多层目录renameTo() 改名、移动 【注意】 创建删除重命名方法返回 boolean,表示操作是否成功File.createTempFile(前缀, 后缀) 在系统临时目录创建临时文件
RandomAccessFile类
我们发现,上面的File类中,我们只是创建出一个文件。但是怎么操作文件内容呢,这里就可以使用RandomAccessFile类。继续看示例:
public class Test1 { public static void main(String[] args) throws IOException{ String pathName = "C:\\Users\\dml\\Desktop\\test.txt"; File file = new File(pathName); //要输出的内容 String outPutTest = "hello I/O"; //“rw”,为读写操作,意味可以通过randomAccessFile进行读或写操作 RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); //将hello I/O操作这些内容输出至test.txt文件中 randomAccessFile.writeBytes(outPutTest); }}
在保证桌面上存在test.txt文件的基础上,我们执行以下代码。然后打开test.txt文件,会发现hello I/O已经保存进去啦。接下来再看怎么从这个文件中将hello I/O输入到程序中,修改代码如下:
public class Test1 { public static void main(String[] args) throws IOException{ String pathName = "C:\\Users\\dml\\Desktop\\test.txt"; File file = new File(pathName); //“rw”,为读写操作,意味可以通过randomAccessFile进行读或写操作 RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); //创建一个byte[]数组存储输入的信息 byte[] inputTest = new byte[9]; //循环从文件中读取字节,保存到byte[]数组中 for (int i = 0; i < inputTest.length; i++) { inputTest[i] = randomAccessFile.readByte(); } //将bute[]数组转化为String类型 String inputInfo = new String(inputTest); //控制台打印 System.out.println(inputInfo); }}
运行程序,结果如下:
关于RandomAccessFile类的其他相关方法如下:
write(int b) int整数4个字节值中,只输出末尾的一个字节值 [1][2][3][4] --> [4]write(byte[] buf) 输出数组中全部字节值write(byte[] buf, int from, int length) 输出数组中从 from 开始的 length 个read() 读取一个字节值,再补三个 0 字节,转成int类型 [4] --> [1][2][3][4] 读取结束,再读取,返回 -1read(byte[] buf) 根据数组容量,读取一批字节值放入数组, 并返回这一批的字节数量 读取结束,再读取,返回 -1seek(int position) 定位下标到指定位置getFilePointer() 获得当前下标所在的位置writeInt(int i) 输出int的4个字节值writeDouble(double d) 输出double的8个字节值...writeUTF(String s) 先输出两个字节表示字符串的字节长度, 再输出字符串的这些字节值readInt() 读4个字节,转成 intreadDouble() 读8个字节,转成 double...readUTF() 先读两个字节值来确定字符串的字节长度,再读取这些字节值,转成 String *)读取结束,再读取,出现 EOFException EOF - End Of File
流Stream
我们在前面已经见识过怎么操作文件。但是我们也发现,用RandomAccessFile来输出数据显得很是复杂。为了解决这一问题,有人提出流的概念,把数据的读写抽象成在管道中流动,就像自来水一般。于是诞生了输入流和输出流两大类Stream,其中,又根据流的特性不同,分为字节流和字符流。下面集中介绍几个重要的流
InputStream/OutputStream
InputStream和OutputStream是字节符的抽象父类,如果要使用这两个类,则必须要先通过子类来实例化对象。如果是要操作一个文件,则可以使用FileInputStram/FileOutputStream来实例化。InputStream/OutputStream的相关方法如下:
OutputStream------------------------------ write(int b) write(byte[] buf) write(byte[] buf,int from, int length) flush() 刷出缓存数据InputStream------------------------------ read() read(byte[] buf) available() 剩余的可读取字节数量
实例说明(以向文件中写入字符串为例)
public class Test1 { public static void main(String[] args) throws IOException{ String pathName = "C:\\Users\\dml\\Desktop\\test.txt"; File file = new File(pathName); //利用多态性实例化outputStream,参数2位append,意指是否允许追加内容 //当设置为true时,每执行一次,都会向文件中写入一次内容 //否则只会覆盖上一次的输出 OutputStream outputStream = new FileOutputStream(file,true); //要输出的内容 String outPutInfo = "test"; //将要输出的内容转化为字节 byte[] outputInfoByte = outPutInfo.getBytes(); //向外输出 outputStream.write(outputInfoByte); //关闭流,谨记!必须关闭 outputStream.close(); }}
连续执行三次,出现
testtesttest
Reader/Writer
Reader/Writer是字符流的抽象父类,以字符为单位读写数据,要使用它,同样需要用子类去实例化该类。相关方法如下:
Writer------------------------------- write(int c) int 4个字节中后面两个字节是 char 字符, 只输出末尾两个字节的字符数据 write(char[] buf) write(char[] buf,int from,int length) write(String s)Reader------------------------------- read() 读取一个char字符,补两个 0 字节, 转成 int 类型 读取结束 ,再读取,返回 -1 read(char[] buf) 读取一批字符放入数组, 并返回这一批的字符数量 读取结束 ,再读取,返回 -1
示例如下(从文件中读取数据,和上面的字节流作为参照):
public class Test1 { public static void main(String[] args) throws IOException{ String pathName = "C:\\Users\\dml\\Desktop\\test.txt"; File file = new File(pathName); //利用多态性实例化readerInfo Reader readerInfo = new FileReader(file); //设置一个接收输入信息的字符数组,容量为1024; char[] readerInfochar = new char[1024]; //readerInfochar最终存储信息的字符长度 int len = 0; //输入的信息,当=-1时,表示全部输入 int temp = 0; while ((temp=readerInfo.read()) != -1) { //将输入的信息重新转化会char readerInfochar[len]=(char) temp; len++; } //关闭流,谨记!! readerInfo.close(); //将输入的内容转化成String String input = new String(readerInfochar,0,len); System.out.println(input); }}
运行程序,结果如下:
高级流
我们发现。尽管我们用了流去简化了数据操作的步骤。但是它也不能提供一些特定的数据处理功能,比如读写固定字节格式的数据等。于是在流的基础上再进行封装,得出了高级流的改变,它可以在操作基本流的同时,进行一些特定的数据处理。下面以DataInputStream / DataOutputStream为例进行简单的介绍:
DataInputStream / DataOutputStream
DataInputStream / DataOutputStream用于读写固定字节格式的数据(int ,double,String,Char)。它们继承自FileInputStream/FileOutputStream。同时实现了DataInput和DataOutput接口。它们的常用方法如下:
DataOutputStream ------------------------------ writeInt(int i) writeDouble(double d) writechars(String s) writeChar(int v) writeUTF(String s) DataInputStream ------------------------------ readInt() readDouble() readFloat() readChar() readUTF()
public class Test1 { public static void main(String[] args) throws IOException{ String pathName = "C:\\Users\\dml\\Desktop\\test.txt"; File file = new File(pathName); //实例化outputStream,构造方法需要内接一个基本流 DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(file)); //模拟的测试信息 String outInfo = "outputStream"; double test = 99.8; int num =3; //输出信息 outputStream.writeChars(outInfo); outputStream.writeChar('\n'); outputStream.writeDouble(test); outputStream.writeChar('\n'); outputStream.writeInt(num); outputStream.writeChar('\n'); //关闭流,谨记 outputStream.close(); }}
运行程序,再打开test.txt,就发现相关内容已经输出完毕了。注意的是,这里又可能会出现乱码问题,所以我们需要学习更多的知识:
InputStreamReader / OutputStreamWriter
InputStreamReader / OutputStreamWriter又叫做字符编码转化流,它的作用是将数据转化成特定的字符编码后再进行读写操作:
实例如下:
public class Test1 { public static void main(String[] args) throws IOException{ String pathName = "C:\\Users\\dml\\Desktop\\test.txt"; File file = new File(pathName); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file),"utf-8"); String outString = "以utf-8格式进行编码的文件"; outputStreamWriter.write(outString); outputStreamWriter.close(); }}
不添加注释,可以根据上面的事例进行推敲理解。
总结:关于I/O流,要是细分,怕是花上10个章节也未必能讲完,因为它的实现类是在是太多了。所以,在这里不做详细的介绍,只是针对一些比较常见的进行讲解,并附带相应的实例帮助理解。对于其他的流,实际的使用方法也差不多,唯一不同的是用的途径有所不同。比如打印流,内存操作流,管道流,缓存流,合并流,压缩流等等等等,这些用法各异的流,不需要完全掌握,但也需要有一些小小的理解。这样的话才能在以后的开发中慢慢熟悉,不至于遇到一个新流的时候就捉襟见袖的。所以,关于剩下的流,建议去看一下官方文档,不要求深入,只需粗略了解一些即可。
下一章:java的异常处理,敬请期待。
如有疑问,欢迎在下方评论指出,共同探讨。
- java
- JAVA
- JAVA
- JAVA
- java
- Java
- Java
- JAVA:
- java
- java
- java
- java
- Java
- java
- java
- java
- JAVA?
- java
- 遵守普遍接受的命名规范
- JAVA工具类——dom4j
- 编码练习——Java-7-集合类
- Git常用命令
- 20170501指针和数组
- java
- SpringBoot中Junit测试注入Bean失败的解决方法
- Android异步线程AsyncTask封装
- 个人笔记整理-java设计模式之状态模式
- 编码练习——Java-8-输入/输出
- 成员变量和局部变量的区别
- 08-图8 How Long Does It Take (25分)
- 编码练习——Java-数组-API-练习
- Yii2 启动跟踪记录