Java输入/输出
来源:互联网 发布:spss如何转换数据 编辑:程序博客网 时间:2024/06/06 17:24
1.Java语言定义了许多类专门负责各种方式的输入/输出,这些类都被放在java.io包中。其中,所有输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;而所有输出流都是抽象类OutputStream(字节输入流)或Writer(字符输出流)的子类。
2.输入流:
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。InputStream类的具体层次结构如图所示:
InputStream类常用的方法:该类中所有的方法遇到错误时都会引发IOException异常
方法说明read( )从输入流中读取数据的下一个字节,返回0~255范围内的int字节值,如果因为已经到达流末尾而没有可用的字节,则返回值-1read(byet [ ] b)从输入流中读入一定长度的字节,并以整数的形式返回字节数mark(int readlimit)在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数reset( )将输入指针返回到当前所做的标记处skip(long n)跳过输入流上的n个字节并返回实际跳过的字节数markSupported( )如果当前流支持mark( )/reset( )操作就返回trueclose( )关闭此输入流并释放与该流关联的所有系统资源
3.输出流
OutputStream类是字节输入流的抽象类,此抽象类表示输出字节流的所有类的超类。OutputStream类的具体层次结构:
OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException
方法说明write(int b)将指定的字节写入此输出流write(byte [ ] b)将b.length个字节从指定的byte数组写入此输出流write(byte [ ]b,int off,int len)将指定byte数组中从偏移量off开始的len个字节写入此输出流flush( )彻底完成输出并清空缓存区close( )关闭输出流
4.文件输入/输出流
程序运行期间,大部分数据都是在内存中进行操作,当程序结束或关闭时,这些数据将消失。如果需要将数据永久保存,可使用文件输入/输出流与指定文件建立连接,将需要的数据永久保存到文件中。
FileInputStream类与FileOutputStream类都是用来操作磁盘文件的。如果用户的文件读取需求比较简单,则可以使用FileInputStream类,该类继承自InputStream类。FileOutputStream类与FileInputStream类对应,提供了基本的文件写入能力。FileOutputStream类是OutputStream类的子类。
常用的构造方法:
方法说明FileOutputStream(String name)该方法使用给定的文件名name创建一个FileInputStream对象FileOutputStream(File file)该方法使用File对象创建FileInputStream对象,允许在把文件连接输入流之前对文件作进一步分析*FileOutputStream类有与FileInputStream类相同参数的构造方法,创建一个FileOutputStream对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件。
读数据的两种方式:
a、public int read():一次读取一个字节
b、public int read(byte [ ] b):一次读取一个字节数组
模板:
byte bys = new byte[1024];
int len = 0;
while((len = fis.read(bys))!=-1){
System.out.println(new String(byte,0,len)); //从0开始读取实际长度
}
/** * */package org.zst.FileInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/** * @author:zsyht * @date:2017-11-28下午8:44:54 */public class Demo {public static void main(String[] args) throws IOException {//创建文件对象File file = new File("D:/mywork","work.txt");FileOutputStream fos = new FileOutputStream(file);//创建byte数组byte [] bys ="林宥嘉《成全》".getBytes();//将数组中的信息写入文件中fos.write(bys);FileInputStream fis = new FileInputStream(file);byte [] bys2 = new byte[1024];//从文件中读取信息int len =fis.read(bys2);//将文件中的信息输出System.out.println("文件中的信息是:"+new String(bys2,0,len));//关闭流fos.close();fis.close();}}
5.FileReader和FileWriter
使用FileInputStream类向文件中写入数据与使用FileInputStream类从文件中将内容读出来,存在一点不足,即这两个类都只提供了对字节或字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象,此时采用字符流FileReader和FileWriter类即可避免此类现象。FileReader流顺序地读取文件,只要不关闭流,每次调用read()方法就顺序地读取源中的其余内容,直到源的末尾或流被关闭。
6.带缓存的输入/输出流 BufferedInputStream类与BufferedOutputStream
BufferedInputStream类可以对任意的InputStream类进行带缓存区的包装以达到性能的优化。
方法说明BufferedInputStream (InputStream in)创建了一带有32个字节的缓存流BufferedInputStream (InputStream in ,int size)按指定的大小来创建缓存区
BufferedOutputStream中有一个flush()方法用来将缓存区的数据强制输出完。flush()方法就是用于即使缓存区没有满的情况下,也将缓存区的内容强制写入到外设,习惯上称这个方法为刷新。flush()方法只对使用缓存区的OutputStream类的子类有效,当调用close()方法时,系统在关闭流之前,也会将缓存区中信息刷新到磁盘文件中。
flush()方法和close()方法的区别?
close():关闭流对象所指向的资源文件,关闭之后不可以再写数据
flush():刷新缓冲区的流,强迫将缓冲字节都写入该流中,刷新后是可以写数据的
7.BufferedReader类和BufferedWriter类
BufferedReader类常用的方法:
read():读取单个字符
readLine ():读取单个字符
write(String s,int off,int len):写入字符串的某一部分
flush() :刷新该流的缓存
newLine():写入一个行分隔符
在用BufferedWriter类的Write()方法时,数据并没有立刻被写入至输出流,而是首先进去缓存区中。如果想立刻将缓存区中的数据写入输出流中,一定要调用flush()方法。
/** * */package org.zst.BufferedReader;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * @author:zsyht * @date:2017-11-29下午5:16:10 */public class Demo {public static void main(String[] args) throws IOException {String str[] ={"《说谎》","《成全》","《傲寒》"};File file = new File("D:/work.txt");FileWriter fw= new FileWriter(file);BufferedWriter bw = new BufferedWriter(fw);for(int k = 0;k<str.length ;k++){bw.write(str[k]);bw.newLine();}bw.close();fw.close();FileReader fr= new FileReader(file);BufferedReader br = new BufferedReader(fr);String s = null;int i =0;while((s = br.readLine())!=null){i++;System.out.println("第"+i+"行:"+s);}br.close();fr.close();}}
8.数据输入/输出流
数据输入/输出流(DataInputStream类DataOutputStream类)允许应用程序以与机器无关的方式从底层输入流中读取基本java数据类型。
构造方法:
方法说明DataInputStream(InputStream in )使用指定的基础InputStream创建一个DataInputStreamDataOutputStream(OutputStream out)创建一个新的数据输出流,将数据写入指定的基础输出流DataOutputStream类提供了如下三种写入字符串的方法:
writeBytes(String s)
writeChars(String s)
writeUTF(String s)
由于java中的字符是Unicode编码,是双字节,writeBytes只是将字符串中的每一个字符的低字节内容写入目标设备中,而writeChars将字符串的每一个字符的两个字节的内容都写到目标设备中,writeUTF将字符串按照UTF编码后的字节长度写入目标设备,然后才是每一个字节的UTF编码。
9.ByteArrayInpurStream/ByteArrayOutputStream
内存操作流:针对内存的数据进行操作,程序一结束,内存中的数据就消失了
特点:针对小文件进行操作
public ByteArrayOutputStream():创建默认的缓冲区大小的内存操作输出流(单位是字节)
成员方法:
public byte[] toByteArray()创建一个新分配的 byte 数组(将内存操作输出流对象转换成字节数组)
void reset():重置内存操作输出流
ByteArrayInputStream:内存操作输入流:
public ByteArrayInputStream(byte[] buf):参数数一个字节数组(缓冲数组)
/** * */package org.zst.ByteArrayStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;/** * @author:zsyht * @date:2017-11-30下午9:09:42 */public class Demo { public static void main(String[] args) throws IOException {//创建内存操作输出流对象ByteArrayOutputStream baos = new ByteArrayOutputStream() ;//写数据for(int x = 0 ; x <3 ; x ++){baos.write(("java"+x).getBytes()) ;}/** * 内存操作流:查看其释放流对象的源码: * public void close() throws IOException {} * 并没有具体的关闭流对象,所以此流对象可以不关闭 *///关闭资源//baos.close() ;//将内存操作输出流对象转换成字节数组//public byte[] toByteArray()创建一个新分配的 byte 数组(将内存操作输出流对象转换成字节数组)byte[] buffer = baos.toByteArray() ;//创建内存操作输入流对象ByteArrayInputStream bais = new ByteArrayInputStream(buffer) ;//一次读取一个字节int by = 0 ;while((by=bais.read())!=-1){System.out.print((char)by);}//关闭//bais.close() ;}}10.打印流:
字节打印流:PrintStream
字符打印流:PrintWriter
打印流特点:
1)在复制文件的,打印流不能操作数据源,只能操作目的地的数据(只能输出数据)
2)打印流可以有自动刷新的功能
3)打印流可以直接针对文本文件进行操作:
什么情况下是直接可以针对文本文件进行操作?
查API的时候,看流中构造方法,只要构造方法的参数有File类或者是String类型,都可以针对文本文件进行操作
FileInputStream
FileOutputStream
FileReader
FileWriter
PrintWriter:
构造方法:
public PrintWriter(String fileName)
public PrintWrite(write out,boolean autoFlush) 第一个参数指定为true,则启动自动刷新
11.标准输入/输出流
System 类中有两个字段
in: InputStream is = Syetem.in;
out: OutputStream ps = System.out;
键盘录入的两种方式:
a、Scanner类: Scanner sc = new Scanner(System.in);
b、使用IO流形式进行录入数据
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
12.RandomAccessFile:随机访问流,此类的实例支持随机访问文件的读取和写入不是实际意义上的流,因为它继承自Object类。
常用的构造方法:
public RandomAccessFile(String name,String mode):参数一:指定该文件的路径 参数二:指定的一种模式 常用的模式:rw "可读可写"。
13.SequenceInputStream: 合并流(将一些输入流逻辑串联)
合并流在复制文件的时候,只能操作数据源,不能操作目的地
将两个文件中的内容复制到另一个文件中:public SequeceInputStream(InputStream s1 ,InputStream s2)
枚举向量的组件:获取接口 public SequeceInputStream(Enumeration<? extends InputStream> e)
Vector集合中特有的功能: public Enumeration<E> elements() 相当于迭代器
14.序列化流:对象----->流数据 ObjectOutputStream
反序列化流:流数据----->对象 ObjectInputStream
序列化和反序列化的考点:
a、将对象------>流数据------->对象,该对象所在的类要实现一个标记接口:Serializable
b、序列化和反序列化产生的版本id不一致的时候,会出现异常,所以使用生产随机ID或固定ID解决
ObjectOutputStream中的成员方法:
public final void writeObject(Object obj):将obj对象写入到当前的序列化流中
ObjectInputStream中的成员方法:
public final Object readObject():从当前反序列化流中读取一个对象
c、transient修饰的变量不被序列化
15.properties:属性集合类
该类继承自Hashtable<k,v>,该类属于Map集合,都是String类型。properties类表示了一个持久的属性集,可保持在流中或从流中加载,属性列表中每个键及其对应的值都是一个字符串。
构造方法: public properties():创建一个空属性列表
public Object Setproperties(String key,String value):给属性集合添加元素
public Set<String> StringpropertyNames():获取当前属性列表中所有键的集合,键值都是String类型
public String getProperty(Stringkey):用指定的键在此属性列表中搜索属性值
/** * */package org.z;import java.util.Properties;import java.util.Set;/** * @author:zsyht * @date:2017-12-4上午7:34:25 */public class PropertiesDemo {public static void main(String[] args) {//创建属性集合类对象//Properties<String,String> prop = new Properties<String,String>() ;Properties prop = new Properties() ;prop.put("yyb", "20") ;prop.put("lyq", "21") ;prop.put("zst", "19") ;prop.put("mmw", "21") ;//遍历集合//获取所有的键的集合Set<Object> keySet = prop.keySet() ;//增强for遍历for(Object key :keySet){Object value = prop.get(key) ;System.out.println(key+"="+value);}}}
/** * */package org.z;import java.util.Properties;import java.util.Set;/** * @author:zsyht * @date:2017-12-4上午8:00:35 */public class PropertiesDemo2 {public static void main(String[] args) {//创建属性集合类对象Properties prop = new Properties() ;//添加元素//public Object setProperty(String key,String value)prop.setProperty("yyb", "20") ;prop.setProperty("lyq", "21") ;prop.setProperty("zst", "19") ;prop.setProperty("mmw", "21") ;//遍历属性列表:public Set<String> stringPropertyNames()Set<String> keySet = prop.stringPropertyNames() ;for(String key:keySet){//通过键搜索值//public String getProperty(String key)String value = prop.getProperty(key) ;System.out.println(key+"="+value);}}}
- Java控制台输入,输出!
- JAVA输入/输出
- Java 输入/输出
- Java标准输入、输出
- JAVA输入\输出流
- Java输入与输出
- java输入与输出
- JAVA 输入/输出 IO
- Java-----13、输入、输出
- Java输入/输出流
- java 输入与输出
- Java 输入/输出流
- java 输入/输出
- JAVA 输入/输出流
- Java输入/输出
- Java输入/输出流
- java输出输入流
- JAVA输入与输出
- postfix+ dovecot搭建邮件服务器
- 51nod 1672 区间交 (优先队列priority_queue 或 多重集合multiset)
- SPRING的事务传播特性
- 单车不行玩电车,充电宝明年竟成骑车必备
- python 操作mysql
- Java输入/输出
- ios 绘制虚线 CGContextSetLineDash函数的参数
- 三级联动下拉框,获取省市区信息(内附Oracle城市三级联动数据表)
- java两个list中保存bean对象,找出其中某一属性不同的元素
- 使用creat-react-app构建react程序(react-scripts)
- 使用snownlp將繁體字装换成简体字
- 【java】变量
- itext基础
- 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法