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);}}}

原创粉丝点击