------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
一、内存操作流
* 操作字节数组
ByteArrayInputStream
ByteArrayOutputStream
操作字符数组
CharArrayReader
CharArrayWriter
操作字符串
StringReader
StringWriter
例:
public class MemoryStreamDemo {
public static void main(String[] args) throws IOException {
//创建内存操作字节数组 字节输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//写数据 到内存中的 字节数组里
baos.write("hello".getBytes());
//关闭流
baos.close();
//获取内存中 字节数组里的 Hello
//可使用 toByteArray() 和 toString() 获取数据
byte[] byteArray = baos.toByteArray();
//byte[] buffer = new byte[10];//存储获取到了内存数据的, 不会用到
ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
int ch = -1;
while ((ch = bais.read()) != -1) {
System.out.print((char)ch);
}
//关闭流
bais.close();
二、打印流概述------------------只有输出流| 最后必须得有刷新,否则写不出数据
字节流打印流 PrintStream
字符打印流 PrintWriter
打印流特点
只能操作目的地,不能操作数据。
可以操作任意类型的数据。
如果启动了自动刷新,能够自动刷新。
可以操作文件的流
构造 方法
PrintWriter(File file)-----------------------------文件
PrintWriter(String fileName)-------------------文件名
PrintWriter(OutputStream out)----------------字节输出流
PrintWriter(Writer out)-------------------------字符输出流
PrintWriter(OutputStream out, boolean autoFlush)----------字节输出流+自动刷新
PrintWriter(Writer out, boolean autoFlush) ------------------字符输出流+自动刷新
注:如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作
方法:
print()
println()
write()
print()方法与println()方法的区别?
print():
不会换行
使用的时候 必须有参数使用
println()
会换行
使用的时候 可以没有参数
例
//创建打印流-- 输出流
PrintWriter pw = new PrintWriter("pw.txt");
PrintWriter pw = new PrintWriter(new FileWriter("pw.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("pw.txt") ,true);//开启自动刷新
PrintWriter pw = new PrintWriter(new FileWriter("pw.txt", true) ,true);//开启自动刷新, 开启自动追加
| |
追加 刷新
//写数据
pw.write("hello"); 注:使用打印流时,一定得加刷新,或自动
pw.print("haha"); 刷新,否则,写不进数据
pw.println("hehe");
//使用字符流的时候, 要记得刷新流
pw.flush();
//关闭流
pw.close();
三、系统的输入输出流
-----------------
public static InputStream in
“标准”输入流。 默认输入设备是键盘,字节输入流
public static PrintStream err
“标准”错误输出流。 输出设备是显示器。字节输出打印流
public static PrintStream out
“标准”输出流。 输出设备是显示器。 字节输出打印流
四、常见的键盘输入数据方式
1,Scanner (推荐使用)
2,System.in
常见的数据输出方式
1,System.out.println(); (推荐使用)
2,System.out
例:
推荐使用的输出输入方式:
输出----System.out.println("你好");
输入---- String line = new Scanner(System.in).nextLine();-------//Scanner ,jdk5存在的
System.out.println(line);
原始输出输入方式:
输出----------------- //2,System.out
OutputStream ps = System.out;// 字节输出流
//通过转换流,完成 字节流 转换郑 字符流
Writer osw = new OutputStreamWriter(ps);
BufferedWriter bw = new BufferedWriter(osw);//需要一个字符输出流
bw.write("你好");
bw.newLine();
bw.flush();
输入------------- //2,System.in 原始的方式
InputStream is = System.in;//字节流
//通过转换流, 完成 字节流 转换成 字符流的操作
Reader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);//需要一个字符流,而我现在有的是字节流,
String line = br.readLine();
System.out.println(line);
五、Serializable: 序列化 ------------把对象写到流中
序列化流(对象字节输出流): ObjectOutputStream
反序列化流(对象字节输入流): ObjectInputStream
注意:可将一个对象(对象中有其属性、自定义类)加到流中进行读写,一般是读写字节、字符的,这个是
读写对象的。
序列化流(对象流),要使用这个类时,他的子类、自定义类是需要实现Serializable接口的。
写数据
//创建流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("UserInfo.txt"));
//写对象到流中
User u = new User("admin", "admin", 18);
oos.writeObject(u);
//关闭流
oos.close();
读数据
//创建流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("UserInfo.txt"));
//从流中读对象
Object obj = ois.readObject();
System.out.println(obj);
//关闭流
ois.close();
要使对象可以在流中传输注意事项:
User类必须得实现Serializable类
解析:1. java.io.NotSerializableException: cn.itcast_05_SerializableIOStream.User
说明,User类 没有实现序列化接口,导致该User对象 不能够在 对象的输入输出流中传输
只能将支持 java.io.Serializable 接口的对象写入流中
2. public interface Serializable类通过实现 java.io.Serializable
接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化
序列化接口没有方法或字段,仅用于标识可序列化的语义。
public class User implements Serializable {
改变User.java文件内容后,新生成的Class文件的版本号
private static final long serialVersionUID = 7026963615909981798L;
使对象在流中传输的前提条件:
public class User implements Serializable {
----------------------------------------------------------------------------------
案例:把一个类作为对象,使其在流中进行读写
transient关键字
用来声明不需要序列化的成员变量----一个类被包装成了流对象,但其中的某个成员变量不想显示出来,即可
用trarsient修饰这个成员变量。
六、NIO流
概述
NIO: 新IO的集合 ------效率高
新IO和传统的IO有相同的目的,都是用于进行输入输出的,
但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,
将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO要高很多
方法
Files工具类中的方法
* public static long copy(Path source, OutputStream out)
* 复制文件
* public static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options)
* 把集合中的元素存储到文件中
*
* Paths: 路径工具类
* public static Path get(String first, String... more)------------得到绝对路径
* Charset字符编码表类
* public static Charset forName(String charsetName)
例:
public class NIODemo {
public static void main(String[] args) throws IOException {
复制文件
Files.copy(Paths.get("prop.txt"), new FileOutputStream("NIO.txt"));
把集合中的元素存储到文件中
ArrayList<String> list = new ArrayList<String>();
list.add("IO");
list.add("Thread");
list.add("GUI");
list.add("net");
list.add("reflect");
list.add("中国");
Files.write(Paths.get("files.txt"), list, Charset.forName("UTF-8"));
//commons-io
//CollectionUtil
//FileUtil
}
}
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------