io学习
来源:互联网 发布:vb登录界面模板下载 编辑:程序博客网 时间:2024/06/05 18:50
IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
通过数据流、序列化和文件系统提供系统输入和输出。
Java IO中的四各类:InputStream、OutputStream、Reader、Writer
看到下面的类一头雾水
BufferedInputStream
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
BufferedOutputStream
该类实现缓冲的输出流。
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
ByteArrayInputStream
ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
ByteArrayOutputStream
此类实现了一个输出流,其中的数据被写入一个 byte 数组。
CharArrayReader
此类实现一个可用作字符输入流的字符缓冲区。
CharArrayWriter
此类实现一个可用作 Writer 的字符缓冲区。
Console
此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。
DataInputStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
DataOutputStream
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。
File
文件和目录路径名的抽象表示形式。
FileDescriptor
文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。
FileInputStream
FileInputStream 从文件系统中的某个文件中获得输入字节。
FileOutputStream
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
FilePermission
此类表示对文件和目录的访问。
FileReader
用来读取字符文件的便捷类。
FileWriter
用来写入字符文件的便捷类。
FilterInputStream
FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
FilterOutputStream
此类是过滤输出流的所有类的超类。
FilterReader
用于读取已过滤的字符流的抽象类。
FilterWriter
用于写入已过滤的字符流的抽象类。
InputStream
此抽象类是表示字节输入流的所有类的超类。
InputStreamReader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
/*
* 字节流写入文件,将hello world! 写入到文件f:/test1.txt,以字节流的形式
*/
String hello=new String("Hello World!");byte[] byteArray=hello.getBytes();File file=new File("f:/test1.txt");OutputStream os=new FileOutputStream(file);os.write(byteArray); //要关闭 os.close();
/*小例子2
*字节流的形式读文件
*/
File file=new File("f:/test1.txt");byte[] bytefie=new byte[(int)file.length()];InputStream ip=new FileInputStream(file);//才发现最重要的是这句int size=ip.read(bytefie);//这行代码是以字节流的形式读取某文件 .read()这个方法,如果读取已到达文件末尾,则返回 -1。System.out.println(size+":"+new String(bytefie));ip.close();
/*
*字符流写文件
*/
String hello=new String("hello world!");File file=new File("f:/test2.txt");Writer os=new FileWriter(file);os.write(hello);os.close();
/**字符流读文件
*/
Reader re=new FileReader(file);char[] aaa=new char[(int)file.length()];re.read(aaa);System.out.println(new String(aaa));re.close();
/*RandomAccessFile类的使用
1 RandomAccessFile raf =newRandomAccessFile(file,"rw");//rw,读写,r只读2 //打开文件时,文件指针在开头,pointer = 0;3 raf.write(byte);//write方法只会写一个字节,同时直接指针指向下一个位置4 int b = raf.read();//每次读一个字节,java中每个字符占用两个字节,使用右移8位的方式分次写入5 raf.seek(指针位置);//移动指针6 raf.close();//文件读写完一定要关闭,否则可能会有意想不到的后果
*在test1文件末尾追加“爱谁谁!“
RandomAccessFile不属于InputStream和OutputStream类系的,类似于指针,可以指定操作文件的什么位置
.seek( )移动到什么位置,.getFilePointer()获取当前位置
对文件的操作权限
*r 代表以只读方式打开指定文件
* rw 以读写方式打开指定文件
* rws 读写方式打开,并对内容或元数据都同步写入底层存储设备
* rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备
*/
RandomAccessFile file = new RandomAccessFile( "f:/test1.txt", "rw");file.seek(file.length()); Long beg=file.getFilePointer();file.write("just do it".getBytes()); Long end=file.getFilePointer(); System.out.println(beg+":"+end); file.close();
打开文件查看:
/*小例子2
*将”Action should not be lazy”插到just do it前面
*/
//位置 long points=0;RandomAccessFile file=new RandomAccessFile("f:/test1.txt", "rw");int data=file.read(); //获取要插入的位置 while(data!=-1){ if(data=='j'){ points= file.getFilePointer()-1; } data = file.read();}//创建临时的文件夹File tmp=File.createTempFile("tmp", null);//退出时删除 tmp.deleteOnExit();FileOutputStream otmp=new FileOutputStream(tmp);FileInputStream itmp=new FileInputStream(tmp);file.seek(points);byte[] h=new byte[1024*2];//用于保存临时读取的字节数 int hasRead=0; //将插入点的后面的内容写入临时文件 while((hasRead=file.read(h))>0){ otmp.write(h, 0, hasRead); } file.seek(points); //写文件 file.write("Action should not be lazy,".getBytes()); //最后追加临时文件中的内容 while((hasRead=itmp.read(h))>0){ file.write(h,0,hasRead); }
结果: /*小例子BufferedInputStream
* 使用缓冲流读文件
*
*/
File file=new File("f:/test1.txt");byte[] aa=new byte[(int)file.length()];InputStream ip=new BufferedInputStream(new FileInputStream(file),2*1024);int size=ip.read(aa);System.out.println(new String(aa));ip.close();
一些知识参考http://www.cnblogs.com/longqingyang/p/5564839.html
文件编码:
我们不想用serialization机制来保存,为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键
字transient.transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的
时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。 声明的元素不
会进行JVM默认的序列化,也可以自己完成这个元素的序列化网络中传输时,并不是所有的元素都是有必要传输
的,尤其是要考虑节约网络流量的时候在有些情况下,可以帮助我们提高性能(ArrayList在数组没有放满的时候,
只把有效元素序列化)
四、IO操作过程中异常处理
- Io学习
- io 学习
- IO学习
- IO学习
- IO学习
- io学习
- java io学习
- IO流的学习
- Java学习:IO(1)
- Java IO学习笔记
- Java IO学习笔记
- Java IO 流学习
- c# io 学习
- Java IO学习
- java io 学习
- java io 学习
- java IO基础学习
- 学习笔记--IO流
- float浮动的消除
- 【问题&解决】fonts/fontawesome-webfont.woff2 404 (Not Found)
- React Ntive集成Code push Windows踩坑集锦(Android)
- 确认IPV6是否开启
- poj 1235 Machine Schedule 最小点覆盖
- io学习
- mysql指定配置文件启动
- linux基本shell命令
- helloworld背后发生了什么?(CSAPP笔记2)
- fdisk -l可以查看有那些U盘设备。mount命令可以看设备挂到了哪个目录
- C++primer学习笔记-----4.4赋值运算符
- commons pool2对象池的使用
- python3 print & DataFrame 170424
- hadoop MapReduce例子