- 浏览: 60152 次
- 性别:
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
js iframe 打印 打印预览 页眉页脚的设置 -
leaderlhf:
而且document.all.iframename.ExecW ...
js iframe 打印 打印预览 页眉页脚的设置 -
leaderlhf:
这个page的附件,竟然是一个英文的网页,而且内容和上面都不对 ...
js iframe 打印 打印预览 页眉页脚的设置 -
cui136122030:
刚开始的时候好像不能输入!
js实现网页文本编辑器 -
lifei2199:
很好的收藏
js iframe 打印 打印预览 页眉页脚的设置
6,内存操作流
之前讲解流 目标都是文件,现在如果有临时的信息要通过io操作的话如果这些临时的内容保存在文件之中就很不合理了
因为操作完还要将文件删除,所以此时在io中提供内存操作流,通过内存提供输出和输入的目标是内存。
使用ByteArrayOutputStream和ByteArrayInputStream完成内存的操作流
ByteArrayOutputStream :内存向程序输出
ByteArrayInputStream :程序向内存写入
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; public class ByteArraDemo { public static void main(String[] args) { String str = "helloworld"; // 定义字符串,全部由小写字母组成 ByteArrayOutputStream bos = null; // 内存输出流 ByteArrayInputStream bis = null; // 内存输入流 bis = new ByteArrayInputStream(str.getBytes()); // 将内容保存在内存之中 bos = new ByteArrayOutputStream(); // 内存输出流 int temp = 0; while ((temp = bis.read()) != -1) {// 依次读取 char c = (char) temp; // 接收字符 bos.write(Character.toUpperCase(c)); // 输出 } String newStr = bos.toString();// 取出内存输出的内容 System.out.println(newStr); } }
ByteArrayInputStream 构造方法:public ByteArrayInputStream (byte[nuf])
7管道流
管道流用于两线程之间相互通信。使用PipedOutputStream,PipedinputStream来完成 但是这两个类基本与OutptStream,InputStream 类似唯一的区别就在于连接管道的操作上。
public void connect(PipedInputStream snk)throws IOException
import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; class Send implements Runnable {// 发送数据的线程 private PipedOutputStream output = null; public Send() { this.output = new PipedOutputStream(); } public PipedOutputStream getPipedOutputStream() { return this.output; } public void run() { String str = "hello world!!!";// 要发送的数据 try { this.output.write(str.getBytes());// 发送 } catch (IOException e) { e.printStackTrace(); } try { this.output.close(); // 关闭 } catch (IOException e) { e.printStackTrace(); } } } class Receive implements Runnable {// 接收数据的线程 private PipedInputStream input = null; public Receive() { this.input = new PipedInputStream(); } public PipedInputStream getPipedInputStream() { return this.input; } public void run() { byte b[] = new byte[1024]; // 接收内容 int len = 0; try { len = this.input.read(b);// 内容读取 } catch (IOException e) { e.printStackTrace(); } try { this.input.close(); // 关闭 } catch (IOException e) { e.printStackTrace(); } System.out.println(new String(b, 0, len)); } } public class ThreadConnectDemo { public static void main(String[] args) throws IOException { Send send = new Send(); Receive rec = new Receive(); send.getPipedOutputStream().connect(rec.getPipedInputStream()); // 进行管道连接 new Thread(send).start(); // 启动线程 new Thread(rec).start(); // 启动线程 } }
8,打印流
使用OutputStream可以完成数据的输出,但是现在如果有一个float型数据好输出吗?
输出流的操作类支持的功能并不是很强大,所以,瑞国要进行更方便的输出,可以使用打印流
PrintStream,PrintWriter
PrintStream 是OutputStream的子类 构造方法:public PrintStream(OutputStream out)
此方法接收OutputStream子类的引用。实际上PrintStream 属于装饰。也就是说根据实例化PrintStream类对象的不同输出的位置也不同。
使用PrintStream 向文件输出
import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; public class PrintStreamDemo01 { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); PrintStream out = new PrintStream(new FileOutputStream(file)); out.print("hello"); out.println("world"); out.println(19); out.print(20.3); out.close() ; } }
使用PrintStream格式化输出
import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; public class PrintStreamDemo02 { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); PrintStream out = new PrintStream(new FileOutputStream(file)); String name = "李兴华"; int age = 3; float score = 99.9f; char sex = 'M'; out.printf("姓名:%s;年龄:%d;成绩:%5.2f;性别:%c。", name, age, score, sex); out.close(); } }
9,System类 对IO的支持
System类中存在三个常量:
public static PrintStream out 表示一个标准的输出,输出的位置是显示器
public static PrintStream err 表示错误,错误的输出
public static PrintStream in 表示键盘的输入,标准输入,
9.1 System.out
System.out是PrintStream的实例化,常用的方法就是向屏幕打印信息,当然如果使用System.out的话也可以直接为OutputStream实例化。
import java.io.OutputStream; public class SystemOutDemo { public static void main(String[] args) throws Exception { OutputStream out = System.out; // 此时具备了向屏幕输出的能力 out.write("hello world".getBytes());// 输出内容 out.close(); } }
9.2 System.err
表示错误输出
public class SystemErrDemo { public static void main(String[] args) { try { Integer.parseInt("hello"); } catch (Exception e) { System.out.println(e); System.err.println(e); } } }
从代码本身看不出任何问题只有在eclipse下才会显示红色字体。
实际上 对于以上两个常量想要区别只能从概念上。
System.out 是给用户看的
System.err 不愿意给用户看的
9.3 System.in
实际上就是一个键盘的输入,使用此操作可以完成键盘输入数据的功能。
import java.io.InputStream; public class SystemInDemo01 { public static void main(String[] args) throws Exception { InputStream input = System.in; // 准备键盘输入数据 byte b[] = new byte[20]; // 开辟空间接收内容 System.out.print("请输入内容:"); int len = input.read(b); // 接收内容 System.out.println("输入的内容是:" + new String(b, 0, len)); } }
此时已经实现了键盘输入功能但是回收长度限制,而且在输入中文时会出问题。
import java.io.InputStream; public class SystemInDemo03 { public static void main(String[] args) throws Exception { InputStream input = System.in; // 准备键盘输入数据 System.out.print("请输入内容:"); int temp = 0; // 接收内容 StringBuffer buf = new StringBuffer(); while ((temp = input.read()) != -1) { char c = (char) temp; // 转型 if (c == '\n') {// 判断是否是回车 break;// 退出循环 } buf.append(c); } System.out.println("输入的内容是:" + buf); } }
此时长度没有限制了。但是在输入中文是就无法正确读取了 用之后讲解的BufferedReader完成
9.4输出输入重定向
System.out,System.in 都有固定的输出目标,都是屏幕
System.in 有固定的输入目标,都是键盘
但是在System类中提供了一系列的输入输出重定向的方法,可以改变System.out,System.err,System.in 的输入输出位置
System.out 重定向:public static void setOut(PrintStream out)
System.err 重定向:public static void setErr(PrintStream out)
System.in 重定向:public static void setIn(PrintStream out)
import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; public class RedirectSystemOutDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); System.setOut(new PrintStream(new FileOutputStream(file))); System.out.println("hello world") ; } }
import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; public class RedirectSystemErrDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); System.setErr(new PrintStream(new FileOutputStream(file))); System.err.println("hello world") ; } }
之前说过System.err是不希望用户看到的 所以一般不建议改变它的重定向而是改变System.out的重定向。
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class RedirectSystemInDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); System.setIn(new FileInputStream(file)); InputStream input = System.in; byte b[] = new byte[20]; // 开辟空间接收内容 int len = input.read(b); // 接收内容 System.out.println("内容是:" + new String(b, 0, len)); } }
10,BufferReader
实际上表示缓冲区读取,可以一次性把内容全读取进来
public BufferedReader(Reader in)
那么,如果使用BufferReader接收键盘输入的内容的话,则此时就无法直接实例化了,那么System.in属于InputStream类型的。
java中提供了两个专门的类,字节-字符流的转化类:
InputStreamReader:表示两字节的输入变为字节流
OutputStreamWriter:表示将字符的输出变为字节流
直接使用以上的类就可以完成转换功能,使用以下的方法可以读取数据:
public String readLine() throws IOException
表示一次性读取一行数据,而且一定要记住的是,如果返回的内容是String 是为好操作的,
范例 使用BufferReader完成输入
import java.io.BufferedReader; import java.io.InputStreamReader; public class BufferedReaderDemo { public static void main(String[] args) throws Exception { BufferedReader buf = null; // 将字节输入流变为字符输入流放在字符流的缓冲区之中 buf = new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入内容:"); String str = buf.readLine(); System.out.println("输入的内容是:" + str); } }
如果想完成键盘的输入功能,以上的操作是最合适的,也是键盘输入数据的标准格式。
11,Scanner
Scaner 是一个新的操作类,是在java.util 包中提供的一个操作类,使用此类可以方便完成输入流的输入操作。
import java.util.Scanner; public class ScannerDemo01 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int i = 0; if (scan.hasNextInt()) { i = scan.nextInt(); } System.out.println("i = " + i); } }
下面再看一个可以接受字符串的例子
import java.util.Scanner; public class ScannerDemo02 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String str = null ; if (scan.hasNext()) { str = scan.next(); } System.out.println("str = " + str); } }
此类也可以用于正则匹配
import java.util.Scanner; public class ScannerDemo03 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String str = null ; if (scan.hasNext("\\d{4}-\\d{2}-\\d{2}")) { str = scan.next(); } System.out.println("str = " + str); } }
因为此类接受的是输入流的操作类,所以也可以完成文件的读取
import java.io.File; import java.io.FileInputStream; import java.util.Scanner; public class ScannerDemo04 { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "demo.txt"); Scanner scan = new Scanner(new FileInputStream(file)); StringBuffer buf = new StringBuffer(); scan.useDelimiter("\n") ; while (scan.hasNext()) { buf.append(scan.next()).append("\n"); } System.out.println("str = " + buf); } }
12,字符编码
在程序中 如果编码没有处理完整,呢会造成乱码,常见的编码有以下几种:
UTF: 包含了以下的编码
ISO 8859-1 :包含全部的英文编码
GBK/GBK2312 :GBK包含全部简体和繁体,GB2312 只包含简体
观察本机系统编码:
public class GetAllSystemInfo { public static void main(String[] args) { System.getProperties().list(System.out) ; } }
所以在使用时默认的编码就是GBK ,如果在程序中使用的时候,则使用的编码应该也是GBK,如果此时使用了ISO 8859-1编码的话,则可能会出现乱码
import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class EncodeDemo { public static void main(String[] args) throws Exception { OutputStream output = new FileOutputStream(new File("d:" + File.separator + "test.txt")); String str = "中国,你好!"; output.write(str.getBytes("ISO8859-1")); output.close() ; } }
乱码的根本原因在于程序与本机环境编码不统一。
13,对象的序列化
对象序列化:就是将一个对象转化为二进制的数据流,如果一个类的对象要实现序列化必须实现Serializable 接口。在此接口中没有任何方法,此接口制作为一个标识,
标识对象具备了序列化的能力而已。
如果想要实现对象的序列化,还要依靠ObjectOutputStream类和ObjectInputStream类,
前者属于序列化,后者属于反序列化操作。
import java.io.Serializable; public class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "姓名:" + this.name + ",年龄:" + this.age; } }
使用ObjectOutputStream完成序列化操作
import java.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class ObjectOutputStreamDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "person.ser"); ObjectOutputStream oos = null; oos = new ObjectOutputStream(new FileOutputStream(file)); Person per = new Person("张三", 30); oos.writeObject(per) ; oos.close() ; } }
使用ObjectIntputStream完成反序列化操作
import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream; public class ObjectInputStreamDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "person.ser"); ObjectInputStream ois = null; ois = new ObjectInputStream(new FileInputStream(file)); Object obj = ois.readObject(); Person per = (Person) obj; System.out.println(per); } }
以上操作实际上是将整个对象进行了序列化操作,如果现在假设类中某个属性不希望被序列化的话,则使用transient关键字声明。
private transient
String name;
既然可以对一个对象进行序列化,可不可以对多个对象进行序列化呢?
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ArraySerDemo { public static void main(String[] args) throws Exception { Person per[] = { new Person("张三", 30), new Person("李四", 31), new Person("王五", 32) }; ser(per); Person p[] = (Person[]) dser(); print(p) ; } public static void ser(Object obj) throws Exception { File file = new File("d:" + File.separator + "person.ser"); ObjectOutputStream oos = null; oos = new ObjectOutputStream(new FileOutputStream(file)); oos.writeObject(obj); oos.close(); } public static Object dser() throws Exception { Object temp = null; File file = new File("d:" + File.separator + "person.ser"); ObjectInputStream ois = null; ois = new ObjectInputStream(new FileInputStream(file)); temp = ois.readObject(); return temp; } public static void print(Person per[]) { for (Person p : per) { System.out.println(p); } } }
发表评论
-
java Properties 类
2012-09-19 15:33 1127转自:http://hi.baidu.com/futvczlz ... -
JAVA EE web开发 --DAO 设计模式
2012-09-18 12:35 0踩刹车百服宁 -
vdsvb
2012-09-17 11:55 0public List<AbstractControl& ... -
java io 详解 下
2012-09-15 16:12 26,内存操作流 之 ... -
java io 详解 上
2012-09-14 17:01 930io 很好地体现了java面向对象的设计思想一个接口或抽象类 ... -
java io
2012-09-12 14:00 0个梵蒂冈和愤怒 -
ajax struts2 action 页面无刷新返回结果
2012-08-15 16:50 3000最近做项目遇到的问题 用form提交 返回页面要不 跳转 ...
相关推荐
### Java IO详解知识点 #### 一、Java IO系统概述 - **Java I/O系统的重要性**:Java I/O系统是Java编程中的基础组成部分之一,用于处理数据的输入与输出。理解和熟练掌握Java I/O系统对于开发高质量的应用程序至...
Java IO 详解 Java IO(Input/Output)是 Java 语言中用于处理输入输出操作的类库,提供了大量的类和方法来实现文件、网络、字节流等方面的输入输出操作。下面对 Java IO 中的重要知识点进行详细说明。 一、File ...
Java 中的 IO 详解 Java IO 是指应用程序对外部设备的数据输入和输出,在程序中,键盘被当作输入文件,显示器被当作输出文件使用。Java 语言定义了许多类专门负责各种方式的输入输出,这些类都被放在 java.io 包中...
JavaIO文件复制优化——JavaIO优化详解(下载可用)。个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。...
Java_IO流详解 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...
### Java IO详解 #### 1. 什么是IO 在计算机科学中,IO(Input/Output,输入/输出)指的是程序与外部系统之间进行数据交换的过程。在Java中,IO操作主要通过`java.io`包来实现,这个包包含了用于文件读写、标准...
JavaIO流详解归纳 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...
Java 中的 IO 流详解 Java 中的 IO 流是指在 Java 语言中对输入输出操作的抽象,主要用于实现程序与外部设备和其他计算机之间的交流,尤其是对磁盘文件的操作。IO 流的概念是在 1984 年由 C 语言第一次引入的,后来...
### Java IO流详解 #### 一、流的概述与分类 在Java中,流是一种抽象概念,用于描述数据从一个地方传输到另一个地方的过程。它主要用于处理数据输入和输出,例如从磁盘读取文件、向网络发送数据或从键盘接收用户...
java IO部分详解各种流的解析例如 InputStream
### Java IO流详解 #### 一、Java IO流概述 Java IO流是Java标准库中的一个重要组成部分,主要用于处理数据的输入输出操作。根据处理的数据类型不同,Java IO流被分为两大类:字节流(byte streams)和字符流...
Java IO 之字节流和字符流的区别 Java 中的 IO 操作是指对文件、网络或其他输入/输出设备的读写操作。Java 中的 IO 操作可以分为两大类:字节流和字符流。字节流和字符流是 Java 中的两种基本的 IO 操作方式,它们...
Java IO 是Java平台中用于处理输入输出操作的重要部分,它提供了丰富的类库,使得开发者能够高效地读写数据。在Java中,IO是以流为基础进行的,数据被串行化写入输出流或从输入流读取。Java的IO体系分为字节流和字符...
### Java IO(下): 过滤流(处理流)、缓冲流详解 #### 一、过滤流(处理流)概述 **过滤流**(处理流)是在Java IO系统中的一个重要概念,它建立在已有的流对象之上,并为其添加了额外的功能或性能优化。与节点流...
### JAVA IO流详解 #### 一、Java IO流概述 Java IO流是Java程序与外部设备之间进行数据交互的重要方式之一。Java的核心库`java.io`提供了丰富的接口用于实现文件读写、标准设备输入输出等功能。Java IO流的设计...
Java IO流详解
在Java中,所有的流都是由java.io包下的类表示的。 根据给定文件的内容,我们可以了解到文件中提到了多种IO流的使用和操作方法,例如BufferedReader、InputStreamReader、FileReader、BufferedWriter、...
### Java IO 详解 #### 一、Java IO体系概述 Java IO(Input/Output)是Java编程语言中处理输入输出的基础。它主要包括两大类:字节流和字符流。字节流主要处理二进制数据,如图片、音频等;字符流则用于处理文本...