------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1、File
1.1、增删判获
1 package learn2; 2 /*File类的常见方法: 3 * 1、创建 4 * boolean createNewFile();//在指定位置创建如果,如果该文件已存在,则不创建,返回false; 5 * 输出流会覆盖 6 * boolean mkdir();//创建文件夹 7 * mkdirs();//创建多级文件夹 8 * 9 * 2、删除 10 * boolean delete();//删除失败,返回 false 11 * void deleteOnExit();//在程序退出时删除 12 * 3、判断 13 * boolean exists();//文件是否存在 14 * isFile(); 15 * isDirectory(); 16 * isHidden(); 17 * isAbsolute();测试此抽象路径名是否是绝对路径,即使不存在也可以判断 18 * 19 * 4、获取信息 20 * getName(); 21 * getPath(); 22 * getParent(); 23 * 24 * getAbsolutePath(); 25 * long LastModify(); 26 * long length(); 27 * 28 * */ 29 import java.io.File; 30 import java.io.IOException; 31 32 public class FileDemo { 33 public static void main(String[] args) throws IOException{ 34 method_4(); 35 } 36 public static void method_5()throws IOException 37 { 38 File f1 = new File("c:\\test.java"); 39 File f2 = new File("c:\\hahaha.java"); 40 sop("rename"+f1.renameTo(f2)); 41 42 } 43 public static void method_4()throws IOException 44 { 45 File f = new File("c:\\abc\\a.txt"); 46 sop("path:"+f.getPath());//你封装的是什么路径,返回什么 47 sop("abspath:"+f.getAbsolutePath());//无论封装的是什么。都返回其所属目录变绝对路径 48 sop("parent:"+f.getParent());//该方法返回的是绝对路径中的文件父目录,如果获取相对路径,返回空 49 //如果相对路径中有上一层目录。该目录则是返回结果 50 } 51 public static void method_3()throws IOException 52 { 53 File f = new File("file.txt"); 54 f.createNewFile(); 55 //记住,在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在 56 //通过exists判断 57 sop("dir:"+f.isDirectory()); 58 sop("file:"+f.isFile()); 59 sop(f.isAbsolute()); 60 } 61 public static void method_2()throws IOException 62 { 63 File f = new File("file.txt"); 64 // sop("execute:"+f.canExecute()); 65 //创建文件夹 66 File dir = new File("abc"); 67 //只能创建一级目录 68 // sop("mkdir:"+dir.mkdir()); 69 sop("mkdir:"+dir.mkdirs()); 70 } 71 public static void method_1()throws IOException 72 { 73 File f= new File("file.txt"); 74 f.deleteOnExit();//在程序退出时删除 75 // sop("create:"+f.createNewFile()); 76 sop("delete:"+f.delete()); 77 } 78 79 80 81 public static void consMethod() 82 { 83 //将a.txt封装成file对象,可以将已有的和未出现的文件或者文件夹封装成对象 84 File f1= new File("a.txt"); 85 // 86 File f2= new File("c:\\abc","b.txt"); 87 88 File d = new File("c:\\abc"); 89 File f3= new File(d,"c.txt"); 90 91 sop("f1:"+f1); 92 sop("f2:"+f2); 93 sop("f3:"+f3); 94 95 File f4 = new File("c:"+File.separator+"abc\\"); 96 97 } 98 public static void sop(Object obj) 99 { 100 System.out.println(obj); 101 } 102 }
1.2、文件列表
调用list方法的对象,必须是真实存在的目录
File[] listFiles(FilenameFilter filter)根据文件名过滤器过滤后得到的文件名数组
1 package learn2; 2 3 import java.io.File; 4 import java.io.FilenameFilter; 5 6 public class FileDemo2 { 7 public static void main(String[] args) { 8 File dir = new File("c:\\"); 9 File[] files = dir.listFiles(); 10 for(File f:files) 11 { 12 System.out.println(f.getName()+"::"+f.length()); 13 } 14 } 15 public static void listDemo_2() 16 { 17 File dir = new File("c:\\"); 18 //内部类 19 String[] arr = dir.list(new FilenameFilter() 20 { 21 public boolean accept(File dir, String name) 22 { 23 // System.out.println("dir:"+dir); 24 // System.out.println("name:"+name); 25 // if(name.endsWith(".bmp")) 26 // return true; 27 // else 28 // return false; 29 return name.endsWith(".bmp"); 30 } 31 }); 32 System.out.println("leng:"+arr.length); 33 for(String name:arr) 34 { 35 System.out.println(name); 36 } 37 } 38 public static void listDemo() 39 { 40 File f = new File("c:\\"); 41 String[] names = f.list();//包含隐藏文件,调用list的必须封装了一个真实存在的目录 42 for(String name :names) 43 { 44 System.out.println(name); 45 } 46 } 47 private static void listRootDemo() { 48 // TODO Auto-generated method stub 49 File[] files= File.listRoots(); 50 for(File f:files) 51 { 52 System.out.println(f); 53 } 54 55 } 56 }
运行结果为对应目录下的文件名数组
1.3、列出目录下所有文件和文件夹&递归
递归时注意限定条件,注意内存溢出
1 package learn2; 2 3 import java.io.File; 4 5 /*列出指定目录下文件或者文件夹,包含子目录中的内容 6 * 也就是列出制定目录下所有内容 7 * 8 * 因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可 9 * 在列出过程中出现的还是目录的话,可以再次调用本功能 10 * 也就是函数自身调用自身 11 * 这种表现形式或者变成手法,成为递归 12 * 递归注意 13 * 1、限定条件 14 * 2、要注意递归的次数,尽量避免内存溢出 15 * */ 16 public class FileDemo3 { 17 public static void main(String[] args) { 18 File dir = new File("F:\\test"); 19 showDir(dir,0); 20 // toBin(6); 21 //注意内存溢出 22 // int n = getSum(10); 23 // System.out.println("n="+n); 24 } 25 public static String getLevel(int level) 26 { 27 StringBuilder sb = new StringBuilder(); 28 for(int x=0;x<level;x++) 29 { 30 sb.append("|--"); 31 } 32 return sb.toString(); 33 } 34 public static void showDir(File dir,int level) 35 { 36 37 System.out.println(getLevel(level)+dir.getName()); 38 level++; 39 File[] files = dir.listFiles(); 40 for(int x=0;x<files.length;x++) 41 { 42 if(files[x].isDirectory()) 43 showDir(files[x],level); 44 else 45 System.out.println(getLevel(level)+files[x]); 46 } 47 } 48 public static int getSum(int n) 49 { 50 if(n==1) 51 return 1; 52 return n+getSum(n-1); 53 } 54 public static void toBin(int num) 55 { 56 if(num>0) 57 { 58 toBin(num/2); 59 System.out.println(num%2); 60 } 61 // while(num>0) 62 // { 63 // System.out.println(num%2); 64 // num=num/2; 65 // } 66 } 67 public static void method() 68 { 69 method(); 70 } 71 72 }
1.4、删除文件夹及文件
注意不能操作隐藏文件,否则返回空指针异常
1 package learn2; 2 3 import java.io.File; 4 5 /*删除一个带内容过的目录 6 * 原理 7 * windows中,删除目录从里面往外删除的 8 * 9 * 既然是从里往外删除,就需要用到递归 10 * 11 * */ 12 public class RemoveDir { 13 public static void main(String[] args) { 14 File dir = new File("F:\\test"); 15 removeDir(dir); 16 } 17 public static void removeDir(File dir) 18 { 19 File[] files =dir.listFiles(); 20 for(int x=0;x<files.length;x++) 21 { 22 if(!files[x].isHidden()&&files[x].isDirectory()) 23 removeDir(files[x]); 24 else 25 //判断有没删错,打印一下看看 26 System.out.println(files[x].toString()+":-file-:"+files[x].delete()); 27 28 } 29 System.out.println(dir+"::dir::"+dir.delete()); 30 } 31 }
运行结果
1.5、创建java文件列表
1 package learn2; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 /* 11 * 将一个指定目录下的java文件的绝对路径,存储到一个文本文件中 12 * 建立一个java文件列表文件 13 * 14 * 思路 15 * 1、对指定目录递归 16 * 2、获取递归过程中所有java文件路径 17 * 3、将这些路径存储到集合中 18 * 4、将集合中的数据写入到一个文件中 19 * */ 20 public class JavaFileList { 21 public static void main(String[] args) throws IOException 22 { 23 File dir = new File("D:\\Workspaces\\MyEclipse 10\\day14IO"); 24 List<File> list = new ArrayList<File>(); 25 fileToList(dir,list); 26 // System.out.println(list.size()); 27 File file = new File(dir,"JavaFileList.txt"); 28 writeToFile(list,file.toString()); 29 } 30 public static void fileToList(File dir,List<File>list) 31 { 32 File[] files = dir.listFiles(); 33 for(File file:files) 34 { 35 if(file.isDirectory()) 36 fileToList(file,list); 37 else 38 { 39 if(file.getName().endsWith(".java")) 40 list.add(file); 41 } 42 } 43 } 44 public static void writeToFile(List<File> list,String javaListFile) throws IOException 45 { 46 BufferedWriter bufw = null; 47 try 48 { 49 bufw = new BufferedWriter(new FileWriter(javaListFile)); 50 for(File f:list) 51 { 52 String path = f.getAbsolutePath(); 53 bufw.write(path); 54 bufw.newLine(); 55 bufw.flush(); 56 } 57 } 58 catch(IOException e) 59 { 60 throw e;//或者抛runtimeE 61 } 62 finally 63 { 64 try 65 { 66 if(bufw!=null) 67 bufw.close(); 68 } 69 catch(IOException e) 70 { 71 throw e; 72 } 73 } 74 } 75 }
运行结果
1.6、Properties存取配置
存入格式为
键=值
1 package learn2; 2 3 import java.io.BufferedReader; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.FileReader; 7 import java.io.IOException; 8 import java.util.Properties; 9 import java.util.Set; 10 11 /* 12 * Properties是hashtable的子类 13 * 也就是说它具备map集合的特点。而且它里面存储的键值都是字符串 14 * 是集合中和IO技术相结合的集合容器 15 * 该对象的特点:可以用于键值对形式的配置文件 16 * 固定格式 键=值 17 * */ 18 public class PropertiesDemo { 19 public static void main(String[] args) throws IOException{ 20 loadDemo(); 21 } 22 public static void loadDemo()throws IOException 23 { 24 Properties prop = new Properties(); 25 FileInputStream fis =new FileInputStream("info.txt"); 26 prop.load(fis); 27 prop.setProperty("wangwu", "39"); 28 FileOutputStream fos = new FileOutputStream("info.txt"); 29 prop.store(fos, "haha"); 30 // System.out.println(prop); 31 prop.list(System.out); 32 fos.close(); 33 fis.close(); 34 } 35 36 //想要将流中的数据存储到集合中 37 //想要将into.txt中键值数据存到集合中进行操作 38 /* 39 * 1.用一个流和info.txt文件关联 40 * 2、读取一行数据,将该行数据用"="进行切割 41 * 3、等号左边作为键,右边作为值,存入到Properties集合中即可 42 * */ 43 public static void method_1()throws IOException 44 { 45 BufferedReader bufr= new BufferedReader(new FileReader("info.txt")); 46 String line = null; 47 Properties prop = new Properties(); 48 while((line = bufr.readLine())!=null) 49 { 50 String[]arr = line.split("="); 51 // System.out.println(line); 52 prop.setProperty(arr[0], arr[1]); 53 } 54 bufr.close(); 55 System.out.println(prop); 56 } 57 //设置和获取元素 58 public static void setAndGet() 59 { 60 Properties prop = new Properties(); 61 prop.setProperty("zhangsan", "30"); 62 prop.setProperty("lisi", "39"); 63 // System.out.println(prop); 64 String value = prop.getProperty("lisi"); 65 // System.out.println(value); 66 prop.setProperty("lisi", 89+""); 67 Set<String> names = prop.stringPropertyNames(); 68 for(String s:names) 69 { 70 System.out.println(s+":"+prop.getProperty(s)); 71 } 72 } 73 }
1.7、配置文件应用-计算使用次数
1 package learn2; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.Properties; 8 9 /* 10 * 用于记录应用程序运行次数, 11 * 如果使用次数已到,那么给出注册提示 12 * 13 * 易想到:计数器 14 * 可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增 15 * 可是随着该应用程序的退出,该计数器也在内存中消失了 16 * 下一次再启动改程序,又重新开始从0计数 17 * 所以建立配置文件,下次使用会先加载然后+1 18 * 19 * 该配置文件使用键值对形式。是map集合。 20 * 数据是文件形式存储,使用IO技术,IO+MAP-->properties 21 * 22 * */ 23 public class RunCount { 24 public static void main(String[] args) throws IOException{ 25 Properties prop = new Properties(); 26 27 // 先把文件封装成对象 28 File file = new File("count.ini"); 29 if(!file.exists())//如果文件不存在 30 file.createNewFile(); 31 FileInputStream fis = new FileInputStream(file); 32 prop.load(fis); 33 int count=0; 34 String value = prop.getProperty("time"); 35 if(value!=null) 36 { 37 count=Integer.parseInt(value); 38 if(count>5) 39 { 40 System.out.println("您好,使用次数已到,拿钱!"); 41 } 42 } 43 count++; 44 prop.setProperty("time", count+""); 45 FileOutputStream fos = new FileOutputStream(file); 46 prop.store(fos, ""); 47 fos.close(); 48 fis.close(); 49 } 50 }
运行结果
1.8、打印流
package learn2; import java.io.BufferedReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; /* * 打印流: * 该流提供了打印方法,可以将各种数据类型的数据都原样打印 * 字节打印流 * PrintStream * 构造函数可以接收的参数类型: * 1、file 对象 File * 2、字符串路径 String * 3、字节输出流 OutputStream * PrintWriter * 1、file 对象 File * 2、字符串路径 String * 3、字节输出流 OutputStream * 4、字符输出流 Writer * */ public class PrintSystreamDemo { public static void main(String[] args)throws IOException { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true); String line =null; while((line=bufr.readLine())!=null) { if("over".equals(line)) break; out.println(line.toUpperCase()); //有println和true才可刷 // out.flush(); } out.close(); bufr.close(); } }
1.9、多个文件组合成一个,并输出
1 package learn2; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.SequenceInputStream; 7 import java.util.Enumeration; 8 import java.util.Vector; 9 10 public class SequenceDemo { 11 public static void main(String[] args) throws IOException{ 12 //文件存入流,存入集合中 13 Vector<FileInputStream> v = new Vector<FileInputStream>(); 14 v.add(new FileInputStream("D:\\Workspaces\\MyEclipse 10\\day14IO\\1.txt")); 15 v.add(new FileInputStream("D:\\Workspaces\\MyEclipse 10\\day14IO\\2.txt")); 16 v.add(new FileInputStream("D:\\Workspaces\\MyEclipse 10\\day14IO\\3.txt")); 17 //输出vector中所有元素 18 Enumeration<FileInputStream> en = v.elements(); 19 //多个流变成了一个流 20 SequenceInputStream sis = new SequenceInputStream(en); 21 FileOutputStream fos = new FileOutputStream("D:\\Workspaces\\MyEclipse 10\\day14IO\\4.txt"); 22 //源和目的的读写操作 23 byte[] buf = new byte[1024]; 24 int len =0; 25 while((len=sis.read(buf))!=-1) 26 { 27 fos.write(buf,0,len); 28 } 29 fos.close(); 30 sis.close(); 31 } 32 33 34 }
1.10、文件切割和合并
1 package learn2; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.SequenceInputStream; 7 import java.util.ArrayList; 8 import java.util.Enumeration; 9 import java.util.Iterator; 10 11 public class SplitFile { 12 public static void main(String[] args)throws IOException { 13 merge(); 14 15 } 16 public static void merge()throws IOException 17 { 18 ArrayList<FileInputStream> al = new ArrayList<FileInputStream>(); 19 for(int x=1;x<4;x++) 20 { 21 al.add(new FileInputStream("C:\\spilitifiles\\"+x+".part")); 22 } 23 final Iterator<FileInputStream> it = al.iterator(); 24 Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() 25 { 26 public boolean hasMoreElements() 27 { 28 return it.hasNext(); 29 } 30 public FileInputStream nextElement() 31 { 32 return it.next(); 33 } 34 }; 35 SequenceInputStream sis = new SequenceInputStream(en); 36 FileOutputStream fos = new FileOutputStream("C:\\spilitifiles\\0.mp3"); 37 byte[] buf = new byte[1024]; 38 int len = 0; 39 while((len=sis.read(buf))!=-1) 40 { 41 fos.write(buf,0,len); 42 } 43 fos.close(); 44 sis.close(); 45 } 46 public static void splitFile()throws IOException 47 { 48 FileInputStream fis= new FileInputStream("c:\\3.mp3"); 49 FileOutputStream fos = null; 50 51 byte[] buf = new byte[1024*1024]; 52 53 int len = 0; 54 int count = 1; 55 while((len=fis.read(buf))!=-1) 56 { 57 //已经不是完成文件了,扩展名为part或任意 58 fos = new FileOutputStream("C:\\spilitifiles\\"+(count++)+".part"); 59 fos.write(buf,0,len); 60 fos.close(); 61 62 } 63 if(fos!=null) 64 fos.close(); 65 fis.close(); 66 } 67 }
运行结果
2、
2.1、对象的序列化
ObjectOutputStream读,则必须是ObjectInputStream写的,否则无法读出
java.io.NotSerializableException;查看是否实现标号接口implements Serializable
此类内可自行添加序列号,也可以通过transient、static来防止修改文件,
1 package learn3; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.ObjectInputStream; 7 import java.io.ObjectOutputStream; 8 9 public class ObjectStreamDemo { 10 public static void main(String[] args) throws IOException, ClassNotFoundException{ 11 readObj(); 12 // writeObj(); 13 } 14 public static void readObj()throws IOException, ClassNotFoundException 15 { 16 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt")); 17 Person p =(Person)ois.readObject(); 18 System.out.println(p); 19 ois.close(); 20 } 21 public static void writeObj() throws IOException 22 { 23 ObjectOutputStream oos = 24 new ObjectOutputStream(new FileOutputStream("obj.txt")); 25 oos.writeObject(new Person("lisi",39,"kr")); 26 oos.close(); 27 } 28 }
其中Person
1 package learn3; 2 3 import java.io.Serializable; 4 5 //没有方法的接口,标记接口, 6 //为了实现序列化,实现了标记接口,序列化的是堆内存 7 public class Person implements Serializable { 8 //自定义序列号 9 public static final long serialVersionUID = 42; 10 String name; 11 //保证值在堆内存中存在而不在文本文件 12 transient int age; 13 static String country ="cn"; 14 Person(String name,int age,String country) 15 { 16 this.name=name; 17 this.age=age; 18 this.country=country; 19 } 20 public String toString() 21 { 22 return name+":"+age+":"+country; 23 } 24 }
运行结果
2.2、管道流
read其实是一种阻塞式的方法,没有数据时都得等
1 package learn3; 2 3 import java.io.IOException; 4 import java.io.PipedInputStream; 5 import java.io.PipedOutputStream; 6 7 /* 8 * 9 * */ 10 class Read implements Runnable 11 { 12 private PipedInputStream in; 13 Read(PipedInputStream in) 14 { 15 this.in=in; 16 } 17 public void run() 18 { 19 try 20 { 21 byte[] buf = new byte[1024]; 22 //阻塞式的方法read,没有数据都得等 23 int len =in.read(buf); 24 String s = new String(buf,0,len); 25 System.out.println(s); 26 in.close(); 27 } 28 catch(IOException e) 29 { 30 throw new RuntimeException("管道读取流失败"); 31 } 32 } 33 } 34 class Write implements Runnable 35 { 36 private PipedOutputStream out; 37 Write(PipedOutputStream out) 38 { 39 this.out=out; 40 } 41 public void run() 42 { 43 try 44 { 45 out.write(("pipedlaila".getBytes())); 46 out.close(); 47 } 48 catch(IOException e) 49 { 50 throw new RuntimeException("管道输出流失败"); 51 } 52 } 53 } 54 public class PipedStreamDemo { 55 public static void main(String[] args) throws IOException{ 56 PipedInputStream in = new PipedInputStream(); 57 PipedOutputStream out = new PipedOutputStream(); 58 //相接 59 in.connect(out); 60 Read r = new Read(in); 61 Write w = new Write(out); 62 new Thread(r).start(); 63 new Thread(w).start(); 64 } 65 }
运行结果
2.3、随机读取访问
1 package learn3; 2 3 import java.io.IOException; 4 import java.io.RandomAccessFile; 5 6 /* 7 * RandomAccessFileDemo 8 * 该类不算是IO体系中的子类 9 * 而是直接继承自Object 10 * 但是它是IO包中成员。因为它具备读和写功能。 11 * 内部封装了一个byte数组,而且通过指针对数组的元素进行操作 12 * 可以通过getFilePointer获取指针位置 13 * 同时通过seek改变指针位置 14 * 其实完成读写的原理就是内部封装了字节输入流和输出流 15 * 16 * 通过构造函数看出只能操作文件 17 * 且操作文件有模式选择 18 * 如果R模式,不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常 19 * 如果RW模式,操作的文件不存在,会自动创建,如果存在则不会覆盖 20 * 21 * */ 22 public class RandomAccessFileDemo { 23 public static void main(String[] args)throws IOException { 24 writeFile_2(); 25 // readFile(); 26 RandomAccessFile raf = new RandomAccessFile("ran.txt","rw"); 27 raf.write("haha".getBytes()); 28 29 } 30 public static void readFile()throws IOException 31 { 32 RandomAccessFile raf = new RandomAccessFile("ran.txt","r"); 33 //调整对象中指针 34 // raf.seek(8*0); 35 //跳过指定的字节数 36 raf.skipBytes(8); 37 byte[] buf = new byte[4]; 38 raf.read(buf); 39 String name = new String(buf); 40 int age = raf.readInt(); 41 System.out.println("name:"+name); 42 System.out.println("age:"+age); 43 raf.close(); 44 } 45 public static void writeFile_2() throws IOException 46 { 47 RandomAccessFile raf = new RandomAccessFile("ran.txt","rw"); 48 raf.seek(8*3); 49 raf.write("周期".getBytes()); 50 raf.writeInt(103); 51 } 52 public static void writeFile()throws IOException 53 { 54 RandomAccessFile raf = new RandomAccessFile("ran.txt","rw"); 55 raf.write("李四".getBytes()); 56 //强转时会添加三个空格 57 raf.writeInt(97); 58 raf.write("王五".getBytes()); 59 raf.writeInt(99); 60 raf.close(); 61 62 } 63 }
2.4、基本数据类型流的操作
1 package learn3; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.OutputStreamWriter; 9 10 /* 11 * DateInputStream与DateOutputStream 12 * 可以操作基本数据类型的流对象 13 * */ 14 public class DateStreamDemo { 15 public static void main(String[] args)throws IOException { 16 writeUTFDemo(); 17 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk"); 18 osw.write("你好"); 19 osw.close(); 20 } 21 public static void readUTFDemo() throws IOException 22 { 23 DataInputStream dis = new DataInputStream(new FileInputStream("utfdate.txt")); 24 String s = dis.readUTF(); 25 System.out.println(s); 26 dis.close(); 27 28 } 29 public static void writeUTFDemo() throws IOException 30 { 31 DataOutputStream dos = new DataOutputStream(new FileOutputStream("utfdate.txt")); 32 dos.writeUTF("你好"); 33 dos.close(); 34 } 35 public static void readData()throws IOException 36 { 37 DataInputStream dis = new DataInputStream(new FileInputStream("data.txt")); 38 int num = dis.readInt(); 39 boolean b = dis.readBoolean(); 40 double d = dis.readDouble(); 41 System.out.println("num:"+num); 42 System.out.println("b:"+b); 43 System.out.println("d:"+d); 44 dis.close(); 45 } 46 public static void writeData()throws IOException 47 { 48 DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt")); 49 dos.writeInt(234); 50 dos.writeBoolean(true); 51 dos.writeDouble(9887.543); 52 53 dos.close(); 54 } 55 }
2.5、ByteArrayStream
1 package learn3; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.ByteArrayInputStream; 5 6 /* 7 * 用于操作字节数组的流对象 8 * ByteArrayInputStream:在构造的时候,需要接受数据源,而且数据源是一个字节数组 9 * ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经封装了可变长度的字节数组。 10 * 这就是数据目的地 11 * 12 * 因为这两个流对象都操作的数组,并没有使用系统资源 13 * 所以,不用进行close关闭。 14 * 15 * 在流操作规律讲解时, 16 * 源设备 17 * 键盘system.in,硬盘FileStream,内存ArrayStream 18 * 目的设备 19 * 控制台system.out,硬盘FileStream,内存ArrayStream 20 * 用流的读写思想操作数组 21 * */ 22 public class ByteArrayInputStreamDemo { 23 public static void main(String[] args) { 24 //数据源 25 ByteArrayInputStream bis = new ByteArrayInputStream("ABCDEF".getBytes()); 26 //数据目的 27 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 28 29 int by = 0; 30 31 while((by=bis.read())!=-1) 32 { 33 bos.write(by); 34 } 35 36 System.out.println(bos.size()); 37 System.out.println(bos.toString()); 38 } 39 }
2.6、字符编码
2.6.1、转换流
你好 出??G编码 U8解码
出浣豺U8编码 GBK解码
1 package learn3; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 9 public class EncodeStream { 10 public static void main(String[] args)throws IOException { 11 // writeText(); 12 readText(); 13 } 14 public static void readText()throws IOException 15 { 16 InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"),"GBK"); 17 char[] buf = new char[10]; 18 int len = isr.read(buf); 19 String str = new String(buf,0,len); 20 System.out.println(str); 21 isr.close(); 22 } 23 public static void writeText()throws IOException 24 { 25 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"));//"uft.txt",UTF-8 26 osw.write("你好"); 27 28 osw.close(); 29 } 30 31 }
2.6.2、字符编码,错误的处理
1 package learn3; 2 3 import java.io.IOException; 4 import java.util.Arrays; 5 6 /* 7 * 编码:字符串变成字节数组 8 * 9 * 解码:字节数组变成字符串 10 * String-->byte; str.getbytes(charsetName); 11 * byte[]-->String: new String(byte[],charsetName); 12 * */ 13 public class EncodeDemo { 14 public static void main(String[] args)throws IOException { 15 String s = "你好"; 16 byte[] b1 = s.getBytes("GBK"); 17 String s1 = new String(b1,"ISO8859-1");//若u8则易出问题,中文解错不易解 18 System.out.println("s1="+s1); 19 20 //对S1进行ISO8859-1编码 21 byte[] b2 = s1.getBytes("iso8859-1"); 22 System.out.println(Arrays.toString(b2)); 23 String s2 = new String(b2,"gbk"); 24 System.out.println("s2="+s2); 25 26 // System.out.println(Arrays.toString(b1)); 27 28 } 29 }
运行结果
2.6.3、联通
往前面加中文即可
1 package learn3; 2 3 import java.io.IOException; 4 5 public class EncodeDemo2 { 6 public static void main(String[] args) throws IOException{ 7 String s = "联通"; 8 byte[] by = s.getBytes("gbk"); 9 for(byte b:by) 10 { 11 System.out.println(Integer.toBinaryString(b&255)); 12 } 13 } 14 }
2.6.4、练习
1 package Test; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.util.Collections; 9 import java.util.Comparator; 10 import java.util.Set; 11 import java.util.TreeSet; 12 13 /* 14 *有五个学生,每个学生有3门课的成绩 15 *从键盘输入以上数据(包括姓名,三门课成绩) 16 *输入的格式,如:zhangsan,30,40,60计算出总成绩 17 *并把学生的信息和计算出的总分数高低排序存放在磁盘文件"stud.txt"中 18 * 19 * 1、描述学生对象 20 * 2、定义一个可以操作学生对象的工具类 21 * 22 * 思想: 23 * 1、通过获取键盘录入的一行数据,并将改行数据中的信息取出,封装成学生对象 24 * 2、因为学生对象有很多,那么就需要存储,使用到集合,因为要对学生的总分排序, 25 * 所以可以使用TreeSet 26 * 3、将集合中的信息写入到一个文件中 27 * */ 28 29 class Student implements Comparable<Student> 30 { 31 private String name; 32 private int ma,cn,en; 33 private int sum; 34 Student(String name,int ma,int cn, int en) 35 { 36 this.name=name; 37 this.ma=ma; 38 this.cn=cn; 39 this.en=en; 40 sum = ma+cn+en; 41 } 42 //实现了comparable,所以判断比较方法,compareTo方法是类,所以Integer包装一下 43 public int compareTo(Student s) 44 { 45 int num =new Integer(this.sum).compareTo(new Integer(s.sum)); 46 if(num==0) 47 return this.name.compareTo(s.name); 48 return num; 49 } 50 public String getName() 51 { 52 return name; 53 } 54 public int getSum() 55 { 56 return sum; 57 } 58 public int hashCode() 59 { 60 return name.hashCode()+sum*78; 61 } 62 public boolean equals(Object obj) 63 { 64 if(!(obj instanceof Student)) 65 throw new ClassCastException("类型不匹配"); 66 Student s = (Student)obj; 67 return this.name.equals(s.name)&&this.sum==s.sum; 68 } 69 public String toString() 70 { 71 return "student["+name+", "+ma+", "+cn+", "+en+"]"; 72 } 73 } 74 75 class StudentInfoTool 76 { 77 //没有比较器的 78 public static Set<Student> getStudents()throws IOException 79 { 80 return getStudents(null); 81 } 82 //有比较器的 83 public static Set<Student> getStudents(Comparator<Student> cmp)throws IOException 84 { 85 BufferedReader bufr = 86 new BufferedReader(new InputStreamReader(System.in)); 87 String line = null; 88 Set<Student> stus =null; 89 if(cmp==null) 90 stus = new TreeSet<Student>(); 91 else 92 stus = new TreeSet<Student>(cmp); 93 while((line = bufr.readLine())!=null) 94 { 95 if("over".equals(line)) 96 break; 97 String[] info = line.split(","); 98 Student stu = new Student(info[0],Integer.parseInt(info[1]), 99 Integer.parseInt(info[2]), 100 Integer.parseInt(info[3])); 101 stus.add(stu); 102 } 103 bufr.close(); 104 return stus; 105 } 106 public static void write2File(Set<Student> stus)throws IOException 107 { 108 //定义数据存储位置 109 BufferedWriter bufw =new BufferedWriter(new FileWriter("stuInfo.txt")); 110 for(Student stu:stus) 111 { 112 bufw.write(stu.toString()+"\t"); 113 //别忘记+""转型 114 bufw.write(stu.getSum()+""); 115 bufw.newLine(); 116 bufw.flush(); 117 } 118 bufw.close(); 119 } 120 } 121 public class StudentInfoTest { 122 public static void main(String[] args)throws IOException { 123 //强行逆转比较器 124 Comparator<Student> cmp = Collections.reverseOrder(); 125 Set<Student> stus = StudentInfoTool.getStudents(cmp); 126 StudentInfoTool.write2File(stus); 127 } 128 }
运行结果