IO流

发布时间:2014-10-23 23:29:20
来源:分享查询网

Printwriter流   DataOutputStream   DataInputStream数据流   BufferedReader/Writer/InputStream/OutputStream的缓冲流   InputStreamReader/OutputWriter的转化流 Object流 IO流分 字节流   字符流 分 处理流 包括 缓存流,转化流,数据流等 inputstream      Reader outputstream Writer 缓冲流   带小桶的,存满缓存再导入磁盘 BufferedInputStream BufferedReader ... public class TestTransForm1 {     public static void main(String[] args) {         try {             OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("f:/ooo.txt"));             osw.write("我是小猪");//只有字符输入才有直接输入字符串功能             System.out.println(osw.getEncoding());             osw.close();             osw = new OutputStreamWriter(             new FileOutputStream("f:\\ooo.txt",true),//true表示接着写             "ISO8859_1");//设置编码格式             osw.write("woshitiancai");             System.out.println(osw.getEncoding());             osw.close();         } catch (IOException e) {             e.printStackTrace();         }     } } 总结:这个输出比较常用,效率高 BufferedWriter( new OutPutStreamWriter(new FileOutPutStream / OutPutStream) ); 缓冲流                转化流                 字节流 这样包装能使用bw.write(string),效率高,对磁盘损伤少 BufferedReader(new InPutStreamReader(new FileInPutStream/...)); ...                 ...                     ... 这样包装了能使用readline方法,效率高,对磁盘损伤也少 public class TestTransForm2 { public static void main(String[] args) { try { InputStreamReader isr = new InputStreamReader(System.in,"ISO8859_1");//阻塞,等待输入 BufferedReader br = new BufferedReader(isr); //为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader String s = null; while((s = br.readLine()) != null){//例如readline()这个方法效率高 if(s.equalsIgnoreCase("exit")) break;//忽略大小写 System.out.println(s); } br.close(); } catch (IOException e) { e.printStackTrace(); } } } DataOutPutStream (new ByteArrayOutputStream); 数据流 dos.writeDouble(0.1231223233); dos.writeBoolean(true); 这样只占9个字节(double8字节,boolean1字节!) 如果转化成字符存入的话就要占不知道几个字节了! public class TestDataStream { public static void main(String[] args) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeDouble(Math.random()); dos.writeBoolean(true); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); DataInputStream dis = new DataInputStream(bais); System.out.println(bais.available()); System.out.println(dis.available()); System.err.println(dis.readDouble()); System.out.println(dis.readBoolean()); dos.close(); dis.close(); } catch (IOException e) { e.printStackTrace(); } } } Print 流 Print.write();//可以输入几乎任何类型的值,具体参考api文档 public class TestPrintWriter { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); FileWriter fw = new FileWriter("f://ooo.txt",true); PrintWriter pw = new PrintWriter(fw); String s = null; while((s = br.readLine()) != null){ if(s.equalsIgnoreCase("exit")) break; System.err.println(s.toUpperCase()); pw.println("-------"); pw.println(s.toLowerCase()); pw.flush(); } pw.println("--"+new Date()+"--"); pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } } Object流 特点:能把对象存进去,而且能读出来 Object.writeObject(t); T t = (T) object.readObject(); 但是这个T类要继承Serializable(可序列化类) public class TestObjectIO { public static void main(String[] args) throws IOException, ClassNotFoundException { FileOutputStream fos = new FileOutputStream("f:/ooo.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); T t = new T(); oos.writeObject(t); oos.flush(); oos.close(); FileInputStream fis = new FileInputStream("f:/ooo.txt"); System.out.println(fis.available()); ObjectInputStream ois = new ObjectInputStream(fis); T t1 = (T) ois.readObject(); System.out.println(t1.b+","+t1.d+","+t1.k); } }class T implements Serializable{ int b = 5; int k = 9; double d = 0.43; } ------------隔隔隔隔隔隔-------- 2014-04-26 今天项目里要实现手机端上传图片到服务器端 服务器端并保存 但是第一次尝试,接收到图片了,保存了图片了,但是图片只显示了上面1/10的地方。 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); String path = getServletContext().getRealPath("/AppPhoto/"+sdf.format(new Date())+".jpg"); BufferedInputStream bis = new BufferedInputStream(req.getInputStream()); File file = new File(path); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file, false)); System.out.println("图片大小:"+req.getContentLength()); byte[] bytes = new byte[req.getContentLength()];//需注释 // byte[] bytes = new byte[1024]; //int len = 0; //while((len = bis.read(bytes))!= -1) //bos.write(bytes,0,len);//流里保存的数据大小有上限,不能一次性读取完 bis.read(bytes);//需注释 bos.write(bytes);//需注释 bos.flush(); bos.close(); bis.close(); } 现在运行的是错误的。 把  需注释 地方注释,原先注释的地方取消注释。 就能够把图片保存起来,并且不失真。 我觉得原因是  数据流或者缓冲流都是有数据上限的。 虽然我们字面上看,缓冲流已经把所有的数据都收到了。 然后read(bytes) 其实bytes里只保存了缓冲区大小的字节,并不是客户端传上来的大小 我们只能分步读取。 代码里,我是读取一份写一份。当然也可以读取一份保存起来,然后一次性写入

返回顶部
查看电脑版