zoukankan      html  css  js  c++  java
  • JAVA IO

    摘自:http://blog.csdn.net/seto2/article/details/42494245

    一、关于Java IO的概述

    • IO流用来处理设备之间的数据传输
    • Java对数据的操作是通过流的方式
    • Java用于操作流的对象都在IO包中
    • IO流按照流向划分为输入流、输出流
    • IO流按照操作数据划分为字符流(专门处理文字)、字节流
    我理解的程序处理数据过程大致如下:

    二、File相关操作

    一个File类的实例代表一个文件或文件夹,File.pathSeparator指的是分隔连续多个路径字符串的分隔符,File.separator才是用来分隔同一个路径字符串中的目录的。由于java可跨平台,所以当new一个File时,路径中的“;"和"/"要用File.pathSeparator和File.separator代替。

    File常用的构造方法

    [java] view plaincopy
    1. import java.io.File;  
    2.   
    3. public class IOTest {  
    4.     public static void main(String[] args) {  
    5.         File file1=new File("D:"+File.separator+"IOTest.Java");//文件绝对路径  
    6.         File file2=new File("D:"+File.separator+"IO");//目录的绝对路径  
    7.         File file3=new File(file2, "IOTest.java");//第一个参数File实例代表一个目录file2,第二个参数为file2目录内的文件名  
    8.         File file4=new File("D:"+File.separator+"IO""IOTest.java");//目录和文件的字符串类型  
    9.           
    10.     }  
    11. }  
    File的常用方法

    [java] view plaincopy
    1. file1.createNewFile();  
    2.     System.out.println("file1.isFile():  " + file1.isFile());  
    3.     System.out.println("file1.isDirectory():  " + file1.isDirectory());  
    4.     System.out.println("file1.getName():  " + file1.getName());  
    5.     System.out.println("file1.getAbsolutePath  " + file1.getAbsolutePath());  
    6.     file2.mkdir();  
    7.     System.out.println("file2.isDirectory():  " + file1.isDirectory());  
    8.     String[] list = file2.list();//返回String[]类型的文件 只含文件名  
    9.     File[] listFile=file2.listFiles();//返回File[]类型的文件 包含完整的文件对象  


    其他相关方法的总结如下:

    • String getName():返回文件名或路径名(若是路径,返回最后一级子路径名)
    • String getPath():返回对象对应的路径名
    • File  getAbsoluteFile():返回绝对路径
    • String getAbsolutePath():返回对象对应的绝对路径
    • String getParent():返回文件目录的上一级目录名
    • boolean renameTo(File newName):重命名此File对象对应的文件或目录,若重命名成功返回true;
    • boolean exists():判断对象对应的文件或目录是否存在;
    • boolean canWrite():判断对象对应文件或目录是否可写;
    • boolean canRead():判断对象对应文件或目录是否可读;
    • boolean isFile():判断对象是文件,不是目录;
    • boolean isDirectory()  判断对象的文件是否是一个目录; 
    • boolean isAbsolute() 判断对象对应文件或目录是否为绝对路径名; 
    • boolean createNewFile() 当且仅当不存在,该方法创建一个该File对象所指定的新文件,创建成功返回true。 
    • boolean delete():删除File对象所对应的文件或路径;
    • boolean mkdir() 创建File对象所对应的目录,调用该方法的File对象必须对应路径,而不是文件。
    • String[] list():列出File对象的所有子文件名和路径名。
    • File[] listFiles():列出File对象的所有子文件和路径。
    • static File[] listRoots():列出系统所有的根路径;
    对文件的操作前要判断文件是否存在,再做进一步io操作。


    练习列出一个目录下所有文件及目录(利用递归):

    [java] view plaincopy
    1. public class IOTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.       
    4.         File file = new File("C:\Users\Mr\Desktop\源码");  
    5.         scan(file);  
    6.   
    7.     }  
    8.   
    9.     private static void scan(File file) {  
    10.         // TODO Auto-generated method stub  
    11.         File[] files = file.listFiles();  
    12.         for (int i = 0; i < files.length; i++) {  
    13.             File newfile = files[i];  
    14.             if (newfile.isFile()) {  
    15.                 System.out.println("文件:" + newfile.getName());  
    16.             } else {  
    17.                 System.out.println("目录:" + newfile.getName());  
    18.                 scan(newfile);  
    19.             }  
    20.         }  
    21.     }  
    22. }  

    文件过滤器,根据文件名或路径获得想要的文件对象

    [java] view plaincopy
    1. private static void scan(File file) {  
    2.     // TODO Auto-generated method stub  
    3.     File[] files = file.listFiles(new FilenameFilter() {  
    4.   
    5.         @Override  
    6.         public boolean accept(File dir, String name) {  
    7.             // TODO Auto-generated method stub  
    8.             return name.contains(".java");  
    9.         }  
    10.           
    11.     });  
    12.     System.out.println(Arrays.toString(files));  
    13.   
    14. }  
    通过listfile方法传入一个FilenameFilter接口的实例,复写accept方法,控制想要得到的文件。

    三、流

    • 字符流

    FileReader(直接读取)

    [java] view plaincopy
    1. import java.io.File;  
    2. import java.io.FileReader;  
    3.   
    4. public class FileReaderTest   {  
    5.     public static void main(String[] args) throws Exception{  
    6.         File file=new File("d:"+File.separator+"test4.txt");  
    7.         FileReader reader=new FileReader(file);  
    8.         int ch=0;  
    9.         while((ch=reader.read())!=-1){  
    10.             System.out.print((char)ch);  
    11.         }  
    12.         reader.close();  
    13.     }  
    14. }  

    利用字符数组读取以提高效率

    [java] view plaincopy
    1. import java.io.File;  
    2. import java.io.FileReader;  
    3.   
    4. public class FileReaderTest {  
    5.     public static void main(String[] args) throws Exception {  
    6.         File file = new File("d:" + File.separator + "test4.txt");  
    7.         FileReader reader = new FileReader(file);  
    8.         char[] buf = new char[1024];  
    9.         int len = 0;  
    10.         while ((len = reader.read(buf)) != -1) {  
    11.             System.out.print(new String(buf, 0, len));  
    12.         }  
    13.         reader.close();  
    14.     }  
    15. }  

    FileWriter(现有文件追加一行)

    [java] view plaincopy
    1. import java.io.File;  
    2. import java.io.FileWriter;  
    3.   
    4. public class FileWriterTest {  
    5.     public static void main(String[] args) throws Exception{  
    6.         File file = new File("d:" + File.separator + "test4.txt");  
    7.         if(!file.exists())file.createNewFile();  
    8.         FileWriter writer=new FileWriter(file,true);//可追加设为true  
    9.         writer.write(" -------新追加一行--------");  
    10.         writer.close();  
    11.     }  
    12. }  

    文本文件复制

    [java] view plaincopy
    1. import java.io.File;  
    2. import java.io.FileReader;  
    3. import java.io.FileWriter;  
    4.   
    5. public class Copy {  
    6.     public static void main(String[] args) throws Exception {  
    7.         File source = new File("d:" + File.separator + "test4.txt");  
    8.         File target = new File("d:" + File.separator + "test5.txt");  
    9.         if (!target.exists())  
    10.             target.createNewFile();  
    11.         FileReader reader = new FileReader(source);  
    12.         FileWriter writer = new FileWriter(target, true);  
    13.         char[] buf = new char[1024];  
    14.         int len = 0;  
    15.         while ((len = reader.read(buf)) != -1) {  
    16.             writer.write(buf, 0, len);  
    17.             writer.flush();  
    18.         }  
    19.         writer.close();  
    20.         reader.close();  
    21.     }  
    22. }  

    • 字符缓冲流
    BufferedReader

    [java] view plaincopy
    1. import java.io.BufferedReader;  
    2. import java.io.File;  
    3. import java.io.FileReader;  
    4.   
    5. public class BufferedReaderTest {  
    6.     public static void main(String[] args) throws Exception {  
    7.         BufferedReader reader=new BufferedReader(new FileReader("d:" + File.separator + "test4.txt"));  
    8.         String line;  
    9.         while((line=reader.readLine())!=null){  
    10.             System.out.println(line);  
    11.         }  
    12.     }  
    13. }  

    BufferedWriter

    [java] view plaincopy
    1. import java.io.BufferedWriter;  
    2. import java.io.File;  
    3. import java.io.FileWriter;  
    4.   
    5. public class BufferedWriterTest {  
    6.     public static void main(String[] args) throws Exception {  
    7.         BufferedWriter writer=new BufferedWriter(new FileWriter("d:" + File.separator + "test5.txt",true));  
    8.         writer.newLine();  
    9.         writer.write("新追加一行");  
    10.         writer.flush();  
    11.         writer.close();  
    12.     }  
    13. }  


    文本文件复制(字符缓冲流)

    [java] view plaincopy
    1. import java.io.BufferedReader;  
    2. import java.io.BufferedWriter;  
    3. import java.io.File;  
    4. import java.io.FileReader;  
    5. import java.io.FileWriter;  
    6.   
    7. public class CopyByBuf {  
    8.     public static void main(String[] args) throws Exception {  
    9.   
    10.         File source = new File("d:" + File.separator + "test4.txt");  
    11.         File target = new File("d:" + File.separator + "test6.txt");  
    12.         if (!target.exists())  
    13.             target.createNewFile();  
    14.         BufferedReader reader = new BufferedReader(new FileReader(source));  
    15.         BufferedWriter writer = new BufferedWriter(new FileWriter(target));  
    16.         String line;  
    17.         while ((line = reader.readLine()) != null) {  
    18.             writer.write(line);  
    19.             writer.newLine();  
    20.             writer.flush();  
    21.         }  
    22.         writer.close();  
    23.         reader.close();  
    24.     }  
    25. }  

    BufferedReader的子类LineNumberReader.setLineNumber(0)来设置初始行,默认0,getLineNumber()返回行号。

    [java] view plaincopy
    1. public class BufferedReaderTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.         LineNumberReader reader=new LineNumberReader(new FileReader("d:" + File.separator + "test4.txt"));  
    4.         String line;  
    5.         //reader.setLineNumber(0);  
    6.         while((line=reader.readLine())!=null){  
    7.             System.out.println(reader.getLineNumber()+line);  
    8.         }  
    9.     }  
    10. }  

    • 字节流
    FileInputStream直接读取

    [java] view plaincopy
    1. public class FileInputStreamTest {  
    2.      public static void main(String[] args) throws Exception {  
    3.      FileInputStream in = new FileInputStream("d:" + File.separator + "test4.txt");  
    4.         int ch = 0;  
    5.         while ((ch = in.read()) != -1) {  
    6.             System.out.print((char) ch);  
    7.         }  
    8.         in.close();  
    9.     }  
    10. }     
    FileInputStream通过byte[]读取
    [java] view plaincopy
    1. public class FileInputStreamTest {  
    2.       
    3.     public static void main(String[] args) throws Exception {  
    4.         FileInputStream in = new FileInputStream("d:" + File.separator + "test4.txt");  
    5.         byte[] buf = new byte[1024];  
    6.         int len = 0;  
    7.         while ((len = in.read(buf)) != -1) {  
    8.             System.out.print(new String(buf, 0, len));  
    9.         }  
    10.         in.close();  
    11.     }  
    12. }     
    FileOutputStream直接写入数据
    [java] view plaincopy
    1. public class FileInputStreamTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.     FileOutputStream out=new FileOutputStream("d:" + File.separator + "test.txt");  
    4.     out.write("黑马你好".getBytes("UTF-8"));  
    5.     out.close();  
    6.  }  
    7. }  
    FileOutputStream和FileInputStream通过byte[]图片
    [java] view plaincopy
    1. public class FileInputStreamTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.     FileInputStream in = new FileInputStream("d:" + File.separator + "heima.jpg");  
    4.     FileOutputStream out=new FileOutputStream("d:" + File.separator + "heima_copy.jpg");  
    5.     byte[] buf = new byte[1024];  
    6.     int len = 0;  
    7.     while ((len = in.read(buf)) != -1) {  
    8.         out.write(buf, 0, len);  
    9.     }  
    10.     in.close();  
    11.     out.close();  
    12. }  
    13. }     
    FileOutputStream和FileInputStream通过BufferedOutputStream和BufferedInputStream复制图片
    [java] view plaincopy
    1. public class FileInputStreamTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.         BufferedInputStream in=new BufferedInputStream(new FileInputStream("d:" + File.separator + "heima.jpg"));  
    4.         BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("d:" + File.separator + "heima_copy1.jpg"));  
    5.         int data = 0;  
    6.         while ((data = in.read()) != -1) {  
    7.             out.write(data);  
    8.         }  
    9.         in.close();  
    10.         out.close();  
    11.     }  
    12. }  

    • 转换流
    System.out:对应的是标准输出设备,控制台。
    System.in:对应的标准输入设备:键盘。
    而它们都是属于字节流,现在要实现对控制台输入的字符串打印或其他操作,由于是对文本进行操作,FileReader和FileWriter更为方便,怎样将要操作的字节流转换为字符流然后进行操作呢?这里可以用转换流InputStreamReader和OutputStreamReader:
    [java] view plaincopy
    1. package Blog;  
    2.   
    3. import java.io.BufferedReader;  
    4. import java.io.BufferedWriter;  
    5. import java.io.InputStreamReader;  
    6. import java.io.OutputStreamWriter;  
    7.   
    8. public class ConsoleTest {  
    9.     public static void main(String[] args) throws Exception {  
    10.         BufferedReader reader = new BufferedReader(new InputStreamReader(  
    11.                 System.in));  
    12.         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(  
    13.                 System.out));  
    14.         String line = null;  
    15.         while (!"stop".equals(line) && (line = reader.readLine()) != null) {  
    16.             writer.write(line);  
    17.             writer.newLine();  
    18.             writer.flush();  
    19.         }  
    20.         writer.close();  
    21.         reader.close();  
    22.     }  
    23. }  
    • 字符流与字节流的总结
    字节流和字符流在处理数据时代码和流程大致相同,字符流其根本也是用的字节流,但是为了处理文字方便加入了类似缓冲块的概念,使其字符流可以对文字的编码进行操作,避免乱码的出现,正因为有了缓冲,所以每次写入后需要flush操作将其刷进目标中,而字节流则不需要。并且字符流读取后close方法时也会对缓冲区进行刷新操作。字符流和字节流两者相比,字节流通用可以处理任何类型数据,但处理处理文本时,由于字符流的编码特性是最为合适的,并且字符流提供了专门处理文本的方便方法,而处理非文本时,一定要使用字节流,如果使用字符流可能复制成功后文件仍无法读取。
    • 用流对目录复制
    将C盘下目录复制到D盘
    [java] view plaincopy
    1. package Blog;  
    2.   
    3. import java.io.BufferedInputStream;  
    4. import java.io.BufferedOutputStream;  
    5. import java.io.File;  
    6. import java.io.FileInputStream;  
    7. import java.io.FileOutputStream;  
    8.   
    9. public class CopyDir {  
    10.     public static void main(String[] args) throws Exception {  
    11.         File dir_s = new File("c:" + File.separator + "heima");//源目录  
    12.         File dir_d = new File("d:" + File.separator + dir_s.getName());//目标目录  
    13.         dir_d.mkdir();//创建目录  
    14.         DoCopy(dir_s, dir_d);  
    15.     }  
    16.   
    17.     private static void DoCopy(File dir_s, File dir_d) throws Exception {  
    18.         // TODO Auto-generated method stub  
    19.   
    20.         File[] files = dir_s.listFiles();  
    21.         for (File file : files) {  
    22.             if (file.isFile()) {//如果是文件 复制  
    23.                 BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));  
    24.                 File file_new=new File(dir_d, file.getName());  
    25.                 file_new.createNewFile();  
    26.                 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file_new));  
    27.                 int data = 0;  
    28.                 while ((data = in.read()) != -1) {  
    29.                     out.write(data);  
    30.                 }  
    31.                 in.close();  
    32.                 out.close();  
    33.             } else {//如果是目录 递归  
    34.                 File dir_new=new File(dir_d,file.getName());  
    35.                 dir_new.mkdir();  
    36.                 DoCopy(file,dir_new);//  
    37.             }  
    38.         }  
    39.     }  
    40.   
    41. }  
    输入两个目录,作为源和目的,将源目录中所有.java文件复制到目的目录中同时将扩展名修改为txt
    [java] view plaincopy
    1. import java.io.BufferedInputStream;  
    2. import java.io.BufferedOutputStream;  
    3. import java.io.BufferedReader;  
    4. import java.io.File;  
    5. import java.io.FileInputStream;  
    6. import java.io.FileOutputStream;  
    7. import java.io.InputStreamReader;  
    8. import java.util.ArrayList;  
    9. import java.util.List;  
    10.   
    11.   
    12.   
    13. public class Copy {  
    14.       
    15.     public static void main(String[] args) throws Exception {  
    16.         System.out.println("请输入一个源目录");  
    17.         String SourceDir = getDir();  
    18.         System.out.println("请输入一个目的目录");  
    19.         String dtDir = getDir();  
    20.         mainJob(SourceDir, dtDir);  
    21.         System.out.println("-------------已完成-------------");  
    22.     }  
    23.   
    24.     static String getDir() throws Exception {  
    25.         BufferedReader reader = new BufferedReader(new InputStreamReader(  
    26.                 System.in));  
    27.         String str = reader.readLine();  
    28.         //reader.close();  
    29.         return str;  
    30.     }  
    31.   
    32.     static void mainJob(String S, String D) throws Exception {  
    33.         File source = new File(S);  
    34.         File dest = new File(D);  
    35.         dest.mkdir();  
    36.         List<File> javaList = new ArrayList<File>();  
    37.         javaList = scanDir(source, javaList);  
    38.         for (File file : javaList) {  
    39.             File newFile = new File(dest,FileUtil.getHeadName(file)+".txt");  
    40.             int n = 0;  
    41.             String head=FileUtil.getHeadName(newFile);  
    42.             String tail=FileUtil.getExtendName(newFile);  
    43.             while (newFile.exists()) {  
    44.                 //判断 若有同名文件出现时 防止覆盖  
    45.                 newFile=new File(dest,head+"("+(++n)+")."+tail);  
    46.             }  
    47.             newFile.createNewFile();  
    48.             copy2dest(file, newFile);  
    49.   
    50.         }  
    51.   
    52.     }  
    53.   
    54.     /** 
    55.      * @param source 
    56.      * @param javaList 
    57.      * @return 
    58.      * @throws Exception 
    59.      * 扫描目录筛选java文件   返回File集合 
    60.      */  
    61.     static List<File> scanDir(File source, List<File> javaList)  
    62.             throws Exception {  
    63.         File[] javas = source.listFiles();  
    64.         for (File file : javas) {  
    65.             if (file.isDirectory()) {  
    66.                 scanDir(file, javaList);  
    67.             } else {  
    68.                 if (file.getName().endsWith(".java"))  
    69.                     javaList.add(file);  
    70.             }  
    71.         }  
    72.         return javaList;  
    73.   
    74.     }  
    75.   
    76.     /** 
    77.      * @param file 
    78.      * @param dest 
    79.      * @throws Exception 
    80.      * 主要复制动作 
    81.      */  
    82.     static void copy2dest(File file, File dest) throws Exception {  
    83.         BufferedInputStream in = new BufferedInputStream(new FileInputStream(  
    84.                 file));  
    85.         BufferedOutputStream out = new BufferedOutputStream(  
    86.                 new FileOutputStream(dest));  
    87.         int data = 0;  
    88.         System.out.println("正在复制  "+dest.getName());  
    89.         while ((data = in.read()) != -1) {  
    90.             out.write(data);  
    91.         }  
    92.         in.close();  
    93.         out.close();  
    94.   
    95.            
    96.     }  
    97.       
    98.       
    99.    
    100. }  
    101. /** 
    102.  * @author Mr 
    103.  *  自定义文件工具类 
    104.  */  
    105. class FileUtil{  
    106.     /** 
    107.      * @param file 
    108.      * @return 
    109.      * 获取文件名不带扩展名 
    110.      */  
    111.     public static String getHeadName(File file){  
    112.         return file.getName().substring(0,file.getName().lastIndexOf("."));  
    113.     }  
    114.     /** 
    115.      * @param file 
    116.      * @return 
    117.      * 获取扩展名 
    118.      */  
    119.     public static String getExtendName(File file){  
    120.           
    121.         return file.getName().substring(file.getName().lastIndexOf(".")+1);  
    122.     }  
    123.     /** 
    124.      * @param file 
    125.      * @param extendName 
    126.      * @return 
    127.      * 修改扩展名 
    128.      */  
    129.     public static File trExtendName(File file,String extendName){  
    130.         return new File(file.getParent(),getHeadName(file)+"."+extendName);  
    131.     }  
    132. }  

    四、其它重要IO相关

    1.可接收字符输出流和字节输出流的打印流PrintWriter,PrintWriter功能十分强大也比较常用,同时可直接接受File类型文件或String文件路径,具有自动flush的特点。

    [java] view plaincopy
    1. import java.io.BufferedReader;  
    2. import java.io.File;  
    3. import java.io.FileReader;  
    4. import java.io.PrintWriter;  
    5.   
    6. public class PrintWriterTest  {  
    7.     public static void main(String[] args) throws Exception{  
    8.         BufferedReader reader=new BufferedReader(new FileReader("d:" + File.separator + "test4.txt"));  
    9.         PrintWriter printer=new PrintWriter(System.out,true);//true 自动刷新, system.out是输出流 也可以是文件File或文件路径  
    10.         String data=null;  
    11.         while((data=reader.readLine())!=null){  
    12.             printer.println(data);  
    13.         }  
    14.         printer.close();  
    15.         reader.close();  
    16.     }  
    17. }  

    2.通过InputStream下的SequenceInputStream类实现合并多个字节输入流

    该类有两个构造方法,也就是两种不同的实现方式:

    通过传入Enumeration<? extends InputStream>对多个流的封装

    [java] view plaincopy
    1. public class SequenceInputStreamTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.         FileInputStream in1 = new FileInputStream("d:" + File.separator  
    4.                 + "test4.txt");  
    5.         FileInputStream in2 = new FileInputStream("d:" + File.separator  
    6.                 + "test5.txt");  
    7.         FileInputStream in3 = new FileInputStream("d:" + File.separator  
    8.                 + "test6.txt");  
    9.         Vector<InputStream> vector = new Vector<InputStream>();  
    10.         vector.add(in1);  
    11.         vector.add(in2);  
    12.         vector.add(in3);//将三个inputStream添加进Vector集合  
    13.         Enumeration<InputStream> enumeration = vector.elements();//获取Enumeration对象  
    14.         SequenceInputStream in_all = new SequenceInputStream(enumeration);  
    15.         PrintWriter printer = new PrintWriter(System.out, true);  
    16.         BufferedReader reader = new BufferedReader(  
    17.                 new InputStreamReader(in_all));  
    18.         String data = null;  
    19.         while ((data = reader.readLine()) != null) {  
    20.             printer.println(data);  
    21.         }  
    22.         reader.close();  
    23.         in1.close();  
    24.         in2.close();  
    25.         in2.close();  
    26.         in_all.close();  
    27.         printer.close();  
    28.     }  
    29. }  

    传入两个inputStream实例对象,并且只能是两个,不常用

    [java] view plaincopy
    1. public class SequenceInputStreamTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.         FileInputStream in1 = new FileInputStream("d:" + File.separator  
    4.                 + "test4.txt");  
    5.         FileInputStream in2 = new FileInputStream("d:" + File.separator  
    6.                 + "test5.txt");  
    7.         SequenceInputStream in_all = new SequenceInputStream(in1, in2);  
    8.         PrintWriter printer = new PrintWriter(System.out, true);  
    9.         BufferedReader reader = new BufferedReader(  
    10.                 new InputStreamReader(in_all));  
    11.         String data = null;  
    12.         while ((data = reader.readLine()) != null) {  
    13.             printer.println(data);  
    14.         }  
    15.         reader.close();  
    16.         in1.close();  
    17.         in2.close();  
    18.         in_all.close();  
    19.         printer.close();  
    20.     }  
    21. }  

    3.切割流

    [java] view plaincopy
    1. public class SplitFile {  
    2.     public static void main(String[] args) throws Exception{  
    3.         BufferedInputStream in=new BufferedInputStream(new FileInputStream("d:" + File.separator + "梁心颐 - 小树.mp3"));  
    4.         BufferedOutputStream out=null;  
    5.         byte[] data=new byte[1024*1024];  
    6.         int len=0;  
    7.         int count=0;  
    8.         while((len=in.read(data))!=-1){  
    9.             out=new BufferedOutputStream(new FileOutputStream("d:" + File.separator + "梁心颐 - 小树"+(++count)+".part"));  
    10.             out.write(data, 0, len);  
    11.             out.close();  
    12.         }  
    13.         in.close();  
    14.     }  
    15. }  

    4.ObjectInputStream和ObjectOutStream实现对象持久化

    要想通过该方法持久化的实例对象,该类必须实现Serializable接口

    [java] view plaincopy
    1. import java.io.Serializable;  
    2.   
    3. public class Person implements Serializable{  
    4.       
    5.     private static final long serialVersionUID = -4102534291757583600L;  
    6.     private String name;  
    7.     private Integer age;  
    8.     public String add;  
    9.     public Person(String name, Integer age, String add) {  
    10.         super();  
    11.         this.name = name;  
    12.         this.age = age;  
    13.         this.add = add;  
    14.     }  
    15.     public Person() {  
    16.         // TODO Auto-generated constructor stub  
    17.     }  
    18. }  
    并声明UID,如果不实现该接口则在ObjectOutputStream写出对象时会报“未序列化的对象”异常

    下面开始对一个Person对象进行持久化即写入一个文件中,随后读出该文件

    [java] view plaincopy
    1. public class ObjectStream {  
    2.     public static void main(String[] args) throws Exception, IOException {  
    3.         Person p1=new Person("liuli"25"china");  
    4.         //写  
    5.         ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("D:"+File.separator+"test.obj"));  
    6.         out.writeObject(p1);  
    7.         out.close();  
    8.         //读  
    9.         ObjectInputStream in=new ObjectInputStream(new FileInputStream("D:"+File.separator+"test.obj"));  
    10.         Person p2=(Person)in.readObject();  
    11.         System.out.println(p2.getName()+p2.getAdd()+p2.getAge());  
    12.     }  
    13. }  


    5.管道流

    [java] view plaincopy
    1. public class PipeTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.         PipedInputStream pipeIn = new PipedInputStream();  
    4.         PipedOutputStream pipeOut = new PipedOutputStream();  
    5.         pipeIn.connect(pipeOut);//连接两个流  
    6.         In in = new In(pipeIn);  
    7.         Out out = new Out(pipeOut);  
    8.         Thread t1 = new Thread(in);  
    9.         Thread t2 = new Thread(out);  
    10.         t1.start();  
    11.         t2.start();  
    12.     }  
    13. }  
    14.   
    15. class In implements Runnable {  
    16.     private PipedInputStream in;  
    17.   
    18.     public In(PipedInputStream in) {  
    19.         // TODO Auto-generated constructor stub  
    20.         this.in = in;  
    21.     }  
    22.   
    23.     @Override  
    24.     public void run() {  
    25.         // TODO Auto-generated method stub  
    26.   
    27.         BufferedReader reader = new BufferedReader(new InputStreamReader(in));  
    28.         String line = null;  
    29.         try {  
    30.             while ((line = reader.readLine()) != null) {  
    31.                 System.out.println(line);  
    32.             }  
    33.             reader.close();  
    34.             in.close();  
    35.   
    36.         } catch (IOException e) {  
    37.             // TODO Auto-generated catch block  
    38.             e.printStackTrace();  
    39.   
    40.         }  
    41.     }  
    42. }  
    43.   
    44. class Out implements Runnable {  
    45.     private PipedOutputStream out;  
    46.   
    47.     public Out(PipedOutputStream out) {  
    48.         // TODO Auto-generated constructor stub  
    49.         this.out = out;  
    50.     }  
    51.   
    52.     @Override  
    53.     public void run() {  
    54.         // TODO Auto-generated method stub  
    55.         PrintWriter writer=new PrintWriter(out, true);  
    56.         try {  
    57.             writer.println("黑马程序员2015年1月9日18:51:42");  
    58.             writer.println("黑马程序员2015年1月9日18:51:45");  
    59.             writer.println("黑马程序员2015年1月9日18:51:47");  
    60.             writer.close();  
    61.             out.close();  
    62.         } catch (Exception e) {  
    63.             // TODO Auto-generated catch block  
    64.             e.printStackTrace();  
    65.         }  
    66.     }  
    67. }  
    由此可见管道流建立了两个不同线程的沟通桥梁,可以实现线程间的通讯,可以实现生产者消费者模型。

    6.DataInputStream和DataOutputStream存储基本数据类型数据

    [java] view plaincopy
    1. import java.io.DataInputStream;  
    2. import java.io.DataOutputStream;  
    3. import java.io.File;  
    4. import java.io.FileInputStream;  
    5. import java.io.FileOutputStream;  
    6.   
    7. public class DataStream {  
    8.     public static void main(String[] args) throws Exception{  
    9.         DataOutputStream out=new DataOutputStream(new FileOutputStream("d:" + File.separator + "test.txt"));  
    10.         out.writeInt(2015);  
    11.         out.writeBoolean(true);  
    12.         out.writeDouble(2015.0109);  
    13.         out.close();  
    14.           
    15.         DataInputStream in=new DataInputStream(new FileInputStream("d:" + File.separator + "test.txt"));  
    16.         System.out.println(in.readInt());  
    17.         System.out.println(in.readBoolean());  
    18.         System.out.println(in.readDouble());  
    19.         in.close();  
    20.     }  
    21. }  

    7.ByteArrayInputStream和ByteArrayOutputStream

    [java] view plaincopy
    1. public class ByteArrayOutputStreamTest {  
    2.     public static void main(String[] args) throws Exception {  
    3.         File file = new File("d:" + File.separator + "test4.txt");  
    4.         if (!file.exists())  
    5.             throw new RuntimeException("文件不存在");  
    6.         FileInputStream in;  
    7.         ByteArrayOutputStream arr = new ByteArrayOutputStream();  
    8.   
    9.         in = new FileInputStream(file);  
    10.         byte[] data = new byte[5];  
    11.         int len = 0;  
    12.   
    13.         while ((len = in.read(data)) != -1) {  
    14.             arr.write(data, 0, len);  
    15.   
    16.         }  
    17.         System.out.println(arr.toString());  
    18.         in.close();  
    19.     }     
    20. }     

    8.StringReader和StringWriter
    [java] view plaincopy
    1. public class StringReader {  
    2.     public static void main(String[] args) throws Exception {  
    3.           
    4.         BufferedReader reader2=new BufferedReader(new StringReader("黑马程序员"));  
    5.         StringWriter writer2=new StringWriter();  
    6.         writer2.append(reader2.readLine());  
    7.         writer2.append("------追加新文字");  
    8.         System.out.println(writer2.toString());  
    9.           
    10.         BufferedReader reader3=new BufferedReader(new CharArrayReader("黑马程序员".toCharArray()));  
    11.         CharArrayWriter writer3=new CharArrayWriter();  
    12.         writer3.write(reader3.readLine().toCharArray());  
    13.         System.out.println(writer3.toString());  
    14.     }     
    15. }     

    9.CharArrayReader和CharArrayWriter

    [java] view plaincopy
    1. public class CharArray {  
    2.     public static void main(String[] args) throws Exception {  
    3.         BufferedReader reader3=new BufferedReader(new CharArrayReader("黑马程序员".toCharArray()));  
    4.         CharArrayWriter writer3=new CharArrayWriter();  
    5.         writer3.write(reader3.readLine().toCharArray());  
    6.         System.out.println(writer3.toString());  
    7.     }     
    8. }  
  • 相关阅读:
    java 支付宝即时到帐提交订单dome
    C#字符串string的常用使用方法(转载)
    UltraEdit 回车符替换空格
    java 七牛上传图片到服务器(采用的html5 压缩 传输base64方式)
    c# 多播委托
    c# 泛型委托
    c# 求数组的最大值
    c# 匿名函数和lamda表达式语法
    匿名函数和lamda表达式
    导出Excel之Epplus使用教程4(其他设置)
  • 原文地址:https://www.cnblogs.com/dengshiwei/p/4258462.html
Copyright © 2011-2022 走看看