标签:类方法 音频 array nal 体系 byte 字符串转换 ndt pre
IO流位于java.io包中,根据操作数据不同,分为字节流和字符流;根据数据输入方面的不同又可分为输入流和输出流,无论是何种流,最终都依赖于操作系统。
InputStream 常用方法
|
|
方法声明
|
功能描述
|
int read()
|
从输入流读取一个8位的字节,把它转换为0-255之间的整数,并返回这一整数
|
int read(byte[] b)
|
从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取的字节数
|
int read(byte[] b,int off,len)
|
从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节
|
void close()
|
关闭此输入流并释放与该流关联的所有系统资源
|
OutputStream 常用方法
|
|
方法声明
|
功能描述
|
void write(int b)
|
向输出流写入一个字节
|
void write(byte[] b)
|
把参数b指定的字节数组的所有字节写到输出流
|
void write(byte[] b,int off,len)
|
将指定byte数组中从偏移量off开始的len个字节写入输出流
|
void flush()
|
刷新此输出流并强制写出所有缓冲的输出字节
|
void close()
|
关闭此输出流并释放与该流关联的所有系统资源
|
1 public class Example01 { 2 public static void main(String[] args) throws Exception{ 3 //创建一个文件字节型输入流 4 InputStream inputStream = new FileInputStream("test.txt"); 5 int b = 0; //定义一个int类型的变量b,记住每一次读取的一个字节 6 while (true){ 7 b=inputStream.read();//变量b记住读取的一个字节 8 if(b==-1){ //如果读取的字节为-1,跳出while循环 9 break; 10 } 11 System.out.println(b); //否则将b写出 12 } 13 inputStream.close(); 14 15 //创建一个文件字节输出流 16 OutputStream OutputStream= new FileOutputStream("example.txt",true); 17 String string = "人之初"; 18 byte [] bytes= string.getBytes(); 19 for (int i = 0;i<bytes.length;i++){ 20 OutputStream.write(bytes[i]); 21 } 22 OutputStream.close(); 23 } 24 }
1 public class Example04 { 2 public static void main(String[] args) throws Exception{ 3 //创建一个字节输入流,用于读取当前目录下source文件中的docx文件 4 InputStream in = new FileInputStream("source/IO工具包.mp4") ; 5 //创建一个文件字节输出流,用于将读取的数据写入target目录下的文件中 6 OutputStream out = new FileOutputStream("target/IO工具包.mp4"); 7 byte [] buff = new byte[1024]; //定义一个字节数组,作为缓冲区 8 int len; //定义一个int类型的变量len记住读取读入缓冲区的字节数 9 // int len = 0 ; //定义一个int类型变量,记住每次读取的一个字节 10 long begintime = System.currentTimeMillis(); 11 while ((len=in.read(buff))!=-1){ //判断是否读到文件末尾 12 out.write(buff,0,len); //从第一字节开始,向文件写入len个字节 13 } 14 long endtime = System.currentTimeMillis(); 15 System.out.println("耗时"+(endtime-begintime)+"毫秒"); 16 in.close(); 17 out.close(); 18 } 19 }
TextReader:读取文本;MediaReader:读取媒体数据;抽取共性,形成体系。Reader|---TextReader read()|---MediaReader需求1:提高读取文本的效率,使用缓冲技术,提供一个读取文本更高效的读取方法。覆盖TextReader中的方法。建立高效的read方法。所以建立一个TextReader的子类,用于高效的读取。Reader|---TextReader read()|--BufferedTextReader|---MediaReader需求2:提高读取媒体数据的效率,派生一个高效的子类,用于高效的读取。Reader|---TextReader read()|--BufferedTextReader|---MediaReader|--BufferedMediaReader发现一个小问题,如果Reader中还有读取其他数据的子类,如果要高效,那岂不是还要给这个子类添加一个高效子类?是的,为了给具体的读取数据的对象增加一些功能,是需要通过子类来完成的。但是这样做,会导致这个继承体系很臃肿!仅仅为了增加一些功能,而进行继承,不建议的。这些子类无非就是需要高效,而且这些高效的功能实现是一致的。就是提供一个缓冲区而以。干脆,单独定义一个具备这个缓冲功能的对象,哪个子类需要被缓冲,就将哪个子类传递进来。class BufferedReader extends Reader{private [];//提供数据BufferedReader(Reader r){ //对Reader高效就行}read(){操作的是数组} //高效的读取动作}此时继承体系:Reader|---TextReader|---MediaReader|---BufferedReader发现这种设计方式减少了继承体系的臃肿,增减功能,比继承更为灵活。这种设计方式称为:装饰设计模式。解决问题:给一组类增加功能,避免继承的臃肿,提高灵活。注意:装饰类和被装饰类必须属于同一体系,通常装饰类都会提供构造函数接收被装饰类对象。装饰类通常不单独存在。
1 public class Example07 { 2 public static void main(String[] args) throws Exception{ 3 //创建一个带缓冲区的输入流 4 BufferedInputStream bis = new BufferedInputStream( 5 new FileInputStream("src.txt")); 6 //创建一个带缓冲区的输出流 7 BufferedOutputStream bos = new BufferedOutputStream( 8 new FileOutputStream("des.txt")); 9 int len; 10 while ((len=bis.read())!=-1){ 11 bos.write(len); 12 } 13 bis.close(); 14 bos.close(); 15 } 16 }
Reader方法摘要
|
|
abstract void close()
|
关闭该流并释放与之关联的所有资源。
|
void mark(int readAheadLimit)
|
标记流中的当前位置。
|
boolean markSupported()
|
判断此流是否支持 mark() 操作。
|
int read()
|
读取单个字符。
|
int read(char[] cbuf)
|
将字符读入数组。
|
abstract int read(char[] cbuf, int off, int len)
|
将字符读入数组的某一部分。
|
int read(CharBuffer target)
|
试图将字符读入指定的字符缓冲区。
|
boolean ready()
|
判断是否准备读取此流。
|
void reset()
|
重置该流。
|
long skip(long n)
|
跳过字符。
|
Writer方法摘要
|
|
void close()
|
关闭此流,但要先刷新它。
|
void flush()
|
刷新该流的缓冲。
|
String getEncoding()
|
返回此流使用的字符编码的名称。
|
void write(char[] cbuf, int off, int len)
|
写入字符数组的某一部分。
|
void write(int c)
|
写入单个字符。
|
void write(String str, int off, int len)
|
写入字符串的某一部分。
|
flush()和close()的区别?flush();将流中的缓冲区缓冲中的数据刷新到目的地中,刷新后,流还可以继续使用;close();关闭资源,但在关闭前会将缓冲区中的数据刷新到目的地,否则丢失数据,然后再关闭流,流不可以使用。如果写入数据多,一边写一边刷新,最后一次可以不刷新,由close()完成刷新并关闭。
1 public class Example10 { 2 public static void main(String[] args) throws Exception{ 3 FileReader reader = new FileReader("src.txt"); 4 //创建一个BufferedReader缓冲对象 5 BufferedReader br = new BufferedReader(reader); 6 FileWriter writer = new FileWriter("des.txt"); 7 //创建一个BufferedWriter缓冲对象 8 BufferedWriter bw = new BufferedWriter(writer); 9 String string; 10 while ((string=br.readLine())!=null){ 11 bw.write(string); 12 bw.newLine();//写入一个换行符,该方法会根据不同的操作系统生成相应的换行符 13 } 14 br.close(); 15 bw.close(); 16 } 17 }
BufferedReader一直接子类——LineNumberReader ,一个可以跟踪行号的输入流。
1 public class Example11 { 2 public static void main(String[] args) throws Exception{ 3 FileReader fr = new FileReader("/Users/Shared/第八章IO练习/exampele09.txt"); //创建字符输入流 4 FileWriter fw = new FileWriter("copy.txt");//创建字符输出流 5 LineNumberReader lr = new LineNumberReader(fr); //包装 6 lr.setLineNumber(0); //设置读取文件的起始行号 7 String line = null; 8 while ((line=lr.readLine())!=null){ 9 fw.write(lr.getLineNumber()+":"+line);//将行号写入到文件中 10 fw.write("\r\n"); //写入换行 11 } 12 lr.close(); 13 fw.close(); 14 } 15 }
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));
1 public class Example12 { 2 public static void main(String[] args) throws Exception{ 3 FileInputStream in= new FileInputStream("src1.txt");//创建字节输入流 4 InputStreamReader isr = new InputStreamReader(in);//将字节流输入转换成字符输入流 5 BufferedReader br = new BufferedReader(isr);//对字符流对象进行包装 6 FileOutputStream out = new FileOutputStream("des1.txt"); 7 //将字节流转换为字符输出流 8 OutputStreamWriter osw = new OutputStreamWriter(out); 9 //对字符输出流对象进行包装 10 BufferedWriter bw = new BufferedWriter(osw); 11 String line; 12 while ((line=br.readLine())!=null){ //判断是否读到文件末尾 13 bw.write(line); //输出读取到文件 14 } 15 br.close(); 16 bw.close(); 17 } 18 }
三、其他IO流
1 public class Example13 { 2 public static void main(String[] args) throws Exception{ 3 //序列化对象 4 Person person = new Person("p1","zhangsan",20); 5 //创建文件输出流对象,将数据写入objectStream.txt 6 FileOutputStream fos = new FileOutputStream("objectStream.txt"); 7 //创建对象输出流对象,用于处理输出流对象写入的数据 8 ObjectOutputStream oos = new ObjectOutputStream(fos); 9 //将Person对象输出到输出流中 10 oos.writeObject(person); 11 oos.close(); 12 13 //反序列化对象 14 FileInputStream fis = new FileInputStream("object.txt"); 15 //创建文件输入流对象,用于读取指定文件的数据 16 ObjectInputStream ois = new ObjectInputStream(fis); 17 //创建对象输入流,并且从指定的输入流中过读取数据 18 Object p = ois.readObject(); 19 System.out.println(p); 20 ois.close(); 21 } 22 } 23 class Person implements Serializable{ 24 private String id; 25 private String name; 26 private int age; 27 public Person(String id, String name, int age) { 28 super(); 29 this.id = id; 30 this.name = name; 31 this.age = age; 32 } 33 public String getId() { 34 return id; 35 } 36 public String getName() { 37 return name; 38 } 39 public int getAge() { 40 return age; 41 } 42 }
1 public class Example15 { 2 public static void main(String[] args) throws Exception{ 3 BufferedOutputStream bos = new BufferedOutputStream( 4 new FileOutputStream("/Users/Shared/ioexample/dataStream.txt")); 5 DataOutputStream dos = new DataOutputStream(bos); 6 dos.writeByte(12); //写一个字节 7 dos.writeChar(‘1‘); //写一个字符 8 dos.writeBoolean(true); //写一个布尔值 9 dos.writeUTF("同学,你好"); //写一个转换成UTF-8的字符串 10 dos.close(); //关闭流 11 BufferedInputStream bis= new BufferedInputStream( 12 new FileInputStream("/Users/Shared/ioexample/dataStream.txt")); 13 DataInputStream dis = new DataInputStream(bis); 14 System.out.println(dis.readByte()); //读取一个字节 15 System.out.println(dis.readChar()); //读取一个字符 16 System.out.println(dis.readBoolean()); //读取一个布尔值 17 System.out.println(dis.readUTF()); //读一个转换成UTF-8编码的字符串 18 dis.close (); //关闭流 19 } 20 }
1 public class Example16 { 2 public static void main(String[] args) throws Exception{ 3 PrintStream ps = new PrintStream( 4 new FileOutputStream("printStream.txt",true)); 5 Student stu = new Student(); 6 ps.print("这是一个数字"); 7 ps.println(19); 8 ps.println(stu); 9 } 10 } 11 class Student { 12 @Override 13 public String toString() { 14 return "我是一个学生"; 15 } 16 }
1 public class Example17 { 2 public static void main(String[] args) throws Exception{ 3 StringBuffer sb = new StringBuffer(); 4 int ch; 5 //while循环用于读取键盘输入的数据 6 while ((ch=System.in.read())!=-1){ //判断是否读取到数据的末尾 7 //对输入的字符进行判断,如果是回车"\r"或者换行"\n",则跳出循环 8 if(ch ==‘\r‘ || ch==‘\n‘){ 9 break; 10 } 11 sb.append((char)ch); //将读取到的数据添加到sb中 12 } 13 System.out.println (sb); //打印键盘输入的数据 14 } 15 }
重定向流常用的静态方法
|
|
方法声明
|
功能描述
|
void setIn(InputStream in)
|
对标准输入流重定向
|
void setOut(PrintStream out)
|
对标准输出流重定向
|
void setErr(PrintStream out)
|
对标准错误输出流重定向
|
1 public class Example19 { 2 public static void main(String[] args) throws Exception{ 3 final PipedInputStream pis = new PipedInputStream();//创建PipedInputStream对象 4 final PipedOutputStream pos = new PipedOutputStream(); 5 //PipedInputStream和PipedOutputStream建立连接,也可写成pos.connect(pis) 6 pis.connect(pos); 7 new Thread(new Runnable(){ //创立线程 8 public void run(){ 9 //将从键盘读取的数据写入管道流中 10 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 11 //将从键盘读取的数据写入管道流中 12 PrintStream ps = new PrintStream(pos); 13 while (true){ 14 try{ 15 System.out.println(br.readLine()); 16 Thread.sleep(1000); 17 }catch (Exception e){ 18 e.printStackTrace(); 19 } 20 } 21 } 22 },"发送数据的线程").start(); 23 new Thread(new Runnable() { 24 @Override 25 public void run() { 26 //下面代码是从管道流中读取数据,每读一行数据输出一次 27 BufferedReader br = new BufferedReader(new InputStreamReader(pis)); 28 while (true){ 29 try{ 30 System.out.println(Thread.currentThread().getName()+"收到的内容:"+br.readLine()); 31 }catch (IOException e){ 32 e.printStackTrace(); 33 } 34 } 35 } 36 },"接收数据的线程").start(); 37 } 38 }
1 public class Example20 { 2 public static void main(String[] args) throws Exception{ 3 //将数据写入缓冲区中 4 FileInputStream fs = new FileInputStream("source.txt"); 5 //创建一个字接数据缓冲区 6 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 7 FileOutputStream fos = new FileOutputStream("target1.txt"); 8 //下面的代码是循环读取缓冲区中的数据,并将数据一次性写入文件 9 int b1; 10 while ((b1=fs.read())!=-1){ 11 bos.write(b1); 12 } 13 fs.close(); 14 bos.close(); 15 fos.write(bos.toByteArray());//将缓冲区中的数据一次性写入文件 16 fos.close(); 17 18 //读取缓冲区中的数据 19 byte[] bufs = new byte[]{97,98,99,100};//创建一个字节数组 20 ByteArrayInputStream bis = new ByteArrayInputStream(bufs);//读取字节数组中的数据 21 //下面代码是循环读取缓冲区中的数据 22 int b2; 23 while ((b2=bis.read())!=-1){ 24 System.out.println((char)b2); 25 } 26 bis.close(); 27 } 28 }
1 public class Example22 { 2 public static void main(String[] args) throws Exception{ 3 FileReader fr = new FileReader("A.txt");//创建一个FileReader对象 4 CharArrayWriter cw = new CharArrayWriter();//在内存中创建一个字符数组缓冲区 5 //下面打代码是将数据写入缓冲区 6 int b; 7 while ((b=fr.read())!=-1){ 8 cw.write(b); //将读取的字符写入缓冲区 9 } 10 fr.close(); 11 cw.close(); 12 char [] c = cw.toCharArray(); //将缓冲区中的数据转换成字符型数组 13 CharArrayReader cr = new CharArrayReader(c); //读取字符数据中的数据 14 //下面的代码是从缓冲区中读取数据,并进行打印 15 int i = 0; 16 while ((i=cr.read())!=-1){ 17 System.out.println((char)i); 18 } 19 cr.close(); 20 } 21 }
1、SequenceInputStream(InputStream s1, InputStream s2)2、SequenceInputStream(Enumeration<? extends InputStream> e)
1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 import java.io.SequenceInputStream; 4 import java.util.Enumeration; 5 import java.util.Vector; 6 7 public class Example24 { 8 public static void main(String[] args) throws Exception{ 9 Vector vector =new Vector();//创建Vector对象 10 //下面代码是创建3个输入流对象 11 FileInputStream in1 =new FileInputStream("stream1.txt"); 12 FileInputStream in2 =new FileInputStream("stream2.txt"); 13 FileInputStream in3 =new FileInputStream("stream3.txt"); 14 //下面代码是向vector中添加三个输入流对象 15 vector.addElement(in1); 16 vector.addElement(in2); 17 vector.addElement(in3); 18 Enumeration e = vector.elements();//获取Vector对象中的元素 19 //将Enumeration对象中的流合并 20 SequenceInputStream sis = new SequenceInputStream(e); 21 FileOutputStream fs= new FileOutputStream("stream.txt"); 22 int len; 23 byte[]buf = new byte[1024]; //创建一个大小为1024个字节数组的缓冲区 24 while ((len=sis.read(buf))!=-1){ 25 fs.write(buf,0,len); 26 } 27 sis.close(); 28 fs.close(); 29 } 30 }
构造方法摘要
|
|
File(File parent, String child)
|
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
|
File(String pathname)
|
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
|
File(String parent, String child)
|
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
|
File(URI uri)
|
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
|
File类常用方法摘要
|
|
boolean exists()
|
测试此抽象路径名表示的文件或目录是否存在。
|
boolean delete()
|
删除此抽象路径名表示的文件或目录,删除成功则返回true,否则返回false;
|
boolean createNewFile()
|
当且仅当不存在具有此抽象路径名指定名称的文件时,才创建指定的新的文件。
|
String getName()
|
返回由此抽象路径名表示的文件或目录的名称。
|
String getPath()
|
返回File对象对应的路径
|
String getAbsolutePath()
|
返回File对象对应的绝对路径名字符串。
|
String getParent()
|
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
|
boolean canRead()
|
测试应用程序是否可以读取此抽象路径名表示的文件。
|
boolean canWrite()
|
测试应用程序是否可以修改此抽象路径名表示的文件。
|
boolean isFile()
|
测试此抽象路径名表示的文件是否是一个标准文件。
|
boolean isDirectory()
|
测试此抽象路径名表示的文件是否是一个目录。
|
boolean isAbsolute()
|
测试此抽象路径名是否为绝对路径名。
|
long lastModified()
|
返回此抽象路径名表示的文件最后一次被修改的时间。
|
long length()
|
返回由此抽象路径名表示的文件的长度。
|
String[] list()
|
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
|
File[] listFiles()
|
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
|
1 public class Example25 { 2 public static void main(String[] args) { 3 File file = new File("example1.txt");//创建File文件对象,表示一个文件 4 System.out.println("文件名称"+file.getName()); 5 System.out.println("文件的相对路径"+file.getPath()); 6 System.out.println("文件的绝对路径"+file.getAbsolutePath()); 7 System.out.println("文件的父路径"+file.getParent()); 8 System.out.println(file.canRead()?"文件可读":"文件不可读"); 9 System.out.println(file.canWrite()?"文件可写":"文件不可写"); 10 System.out.println(file.isFile()?"是一个文件":"不是一个文件"); 11 System.out.println(file.isDirectory()?"是一个目录":"不是一个目录"); 12 System.out.println(file.isAbsolute()?"是绝对路径":"不是绝对路径"); 13 System.out.println("最后修改时间"+file.lastModified()); 14 System.out.println("文件大小"+file.length()+"bytes"); 15 System.out.println("是否成功删除"+file.delete()); 16 } 17 }
1 public class Example27 { 2 public static void main(String[] args) throws Exception{ 3 File file = new File("/Users/Shared/第八章IO练习/src/datastream"); 4 FilenameFilter filenameFilter= new FilenameFilter() { 5 @Override 6 public boolean accept(File dir, String name) { 7 File currFile = new File(dir,name); 8 if (currFile.isFile()&&name.endsWith(".java")){ 9 return true; 10 }else{ 11 return false; 12 } 13 } 14 }; 15 if (file.exists()){ 16 String [] lists = file.list(filenameFilter); 17 for (String name:lists){ 18 System.out.println(name); 19 } 20 } 21 } 22 }
1 import java.io.File; 2 3 public class Example30 { 4 public static void main(String[] args) { 5 File file =new File("/Users/Shared/第八章IO练习/src/delete"); 6 deleteDir(file); 7 } 8 9 public static void deleteDir(File dir) { 10 if(dir.exists()){ 11 File[] files= dir.listFiles(); 12 for (File file:files){ 13 if (file.isDirectory()){ 14 deleteDir(file); 15 }else{ 16 file.delete(); 17 } 18 } 19 dir.delete(); 20 } 21 } 22 }
构造方法
|
|
方法声明
|
功能描述
|
RandomAccessFile(File file, String mode)
|
创建随机访问文件流,以从File参数指定的文件中读取,并可选择写入文件。
|
RandomAccessFile(String name, String mode)
|
创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。
|
RandomAccesseFile定位文件位置的方法
|
|
方法声明
|
功能描述
|
long getFilePointer()
|
返回当前读写指针所处的位置
|
void seek(long pos)
|
设定读写指针的位置,与文件开头相隔pos个字节数
|
Int skipBytes(int n)
|
使读写指针从当前位置开始,跳过n个字节
|
Void setLength(long newLength)
|
设置此文件的长度
|
1 public class Example31 { 2 3 public static void main(String[] args) throws Exception{ 4 5 //在time.txt文件中输入数字5 6 7 RandomAccessFile raf = new RandomAccessFile("time.txt","rw"); 8 9 int times = 0; //int类型的表露表示试用次数 10 11 times=Integer.parseInt(raf.readLine()); //第一次读取文件时times为5 12 13 if (times>0){ 14 15 //试用一次,次数减少一次 16 17 System.out.println("您还可以试用"+times--+"次数"); 18 19 raf.seek(0); //使用记录指针指向文件的开头 20 21 raf.writeBytes(times+""); //将剩余的次数再次写入文件 22 23 }else { 24 25 System.out.println("软件试用次数已到"); 26 27 } 28 29 raf.close(); 30 31 } 32 33 }
标签:类方法 音频 array nal 体系 byte 字符串转换 ndt pre
原文地址:http://www.cnblogs.com/gdwkong/p/7775013.html